К примеру, у меня есть этот код:Как я могу легко определить, существует ли ресурс ведро Boto 3 S3?
import boto3
s3 = boto3.resource('s3')
bucket = s3.Bucket('my-bucket-name')
# Does it exist???
К примеру, у меня есть этот код:Как я могу легко определить, существует ли ресурс ведро Boto 3 S3?
import boto3
s3 = boto3.resource('s3')
bucket = s3.Bucket('my-bucket-name')
# Does it exist???
На момент написания этой статьи нет высокого уровня способа быстро проверить, существует ли ведро и у вас есть доступ к нему, но вы можете сделать низкое -level вызов операции HeadBucket. Это самый недорогой способ сделать эту проверку:
from botocore.client import ClientError
try:
s3.meta.client.head_bucket(Bucket=bucket.name)
except ClientError:
# The bucket does not exist or you have no access.
В качестве альтернативы, вы можете также позвонить create_bucket
неоднократно. Операция является тождественной, поэтому он будет либо создать или просто вернуть существующее ведро, которое полезно, если вы проверяете наличие знать, следует ли создать ведро:
bucket = s3.create_bucket(Bucket='my-bucket-name')
Как всегда, обязательно ознакомьтесь с official documentation.
Примечание: До выпуска 0.0.7 meta
был Python-словарем.
>>> import boto3
>>> s3 = boto3.resource('s3')
>>> s3.Bucket('Hello') in s3.buckets.all()
False
>>> s3.Bucket('some-docs') in s3.buckets.all()
True
>>>
Извините, это для [Boto 3] (https: // github.com/boto/boto3), а не Boto 2.x! – Daniel
Помогло ли мое решение? – helloV
Да, это будет работать, если вы являетесь владельцем ковша, однако он вызовет операцию ListBuckets, которая немного дороже, чем операция HeadBucket.Для низких объемов вызовов это будет стоить одинаково, но если вы будете проверять многие ведра, это может со временем складываться! Кроме того, коллекция создает экземпляры ресурсов после разбора ответа, в то время как вызов 'head_bucket' просто возвращает низкоуровневый ответ без дополнительной обработки. – Daniel
вы можете использовать conn.get_bucket
from boto.s3.connection import S3Connection
from boto.exception import S3ResponseError
conn = S3Connection(aws_access_key, aws_secret_key)
try:
bucket = conn.get_bucket(unique_bucket_name, validate=True)
except S3ResponseError:
bucket = conn.create_bucket(unique_bucket_name)
со ссылкой на документацию по http://boto.readthedocs.org/en/latest/s3_tut.html
As of Boto v2.25.0, this now performs a HEAD request (less expensive but worse error messages).
это не для boto not boto3? –
Использование поиска Функция -> Возвращает None, если ведро Exist
if s3.lookup(bucketName) is None:
bucket=s3.create_bucket(bucketName) # Bucket Don't Exist
else:
bucket = s3.get_bucket(bucketName) #Bucket Exist
Нет функции поиска в s3-клиенте boto3 или ресурсе api. – Atifm
I Trie d Daniel's пример, и это было действительно полезно. Последующая документация boto3 и вот мой чистый тестовый код. Я добавил проверку на ошибку «403», когда ведра являются частными и возвращают «Запрещено!». ошибка.
import boto3, botocore
s3 = boto3.resource('s3')
bucket_name = 'some-private-bucket'
#bucket_name = 'bucket-to-check'
bucket = s3.Bucket(bucket_name)
def check_bucket(bucket):
try:
s3.meta.client.head_bucket(Bucket=bucket_name)
print("Bucket Exists!")
return True
except botocore.exceptions.ClientError as e:
# If a client error is thrown, then check that it was a 404 error.
# If it was a 404 error, then the bucket does not exist.
error_code = int(e.response['Error']['Code'])
if error_code == 403:
print("Private Bucket. Forbidden Access!")
return True
elif error_code == 404:
print("Bucket Does Not Exist!")
return False
check_bucket(bucket)
Надеюсь, что это поможет некоторым новым в boto3, как я.
Это также лучший метод проверки существования объектов, вызов 'head_object()' и обработка ошибки? в отличие от 'key в bucket.objects.all()'? (особенно если вы не собираетесь на самом деле 'get()' объект?) –
@ChristopherPearson обычно лучше использовать 'head_object()', потому что он будет выполнять только один небольшой запрос при использовании 'bucket.objects.all () 'будет извлекать всю информацию об объекте (которая может представлять собой несколько запросов для каждой страницы результатов), а затем ищет наличие вашего ключа в этих результатах. – Daniel
Просто небольшое пояснение: 'create_bucket()' возвращает ошибку BucketAlreadyOwnedByYou во всех регионах AWS, кроме региона США (Северная Вирджиния), тогда как в регионе 'us-east-1' вы получите 200 OK. Использование 'head_object()' на самом деле [правильный путь] (http://boto3.readthedocs.io/en/latest/guide/migrations3.html#accessing-a-bucket). – lec00q