Подтвердить что ты не робот

Как я могу легко определить, существует ли резервный ресурс Boto 3 S3?

Например, у меня есть этот код:

import boto3

s3 = boto3.resource('s3')

bucket = s3.Bucket('my-bucket-name')

# Does it exist???
4b9b3361

Ответ 1

На момент написания этого документа нет высокоуровневого способа быстро проверить, существует ли ведро, и у вас есть доступ к нему, но вы можете сделать вызов низкого уровня для операции 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')

Как всегда, обязательно ознакомьтесь с официальной документацией .

Примечание. Перед выпуском 0.0.7 meta был Python-словарем.

Ответ 2

Как уже упоминалось @Daniel, лучший способ, предложенный Boto3 docs - это использовать head_bucket()

head_bucket() - эта операция полезна, чтобы определить , существует ли корзина и есть ли у вас разрешение на доступ к ней.

Если у вас есть небольшое количество сегментов, вы можете использовать следующее:

>>> import boto3
>>> s3 = boto3.resource('s3')
>>> s3.Bucket('Hello') in s3.buckets.all()
False
>>> s3.Bucket('some-docs') in s3.buckets.all()
True
>>> 

Ответ 3

Я попробовал пример Даниэля, и это было действительно полезно. Последующая документация 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, как я.

Ответ 4

Я имел успех с этим:

import boto3

s3 = boto3.resource('s3')
bucket = s3.Bucket('my-bucket-name')

if bucket.creation_date:
   print("The bucket exists")
else:
   print("The bucket does not exist")

Ответ 5

Использовать функцию поиска → Возвращает Нет, если ведро Exist

if s3.lookup(bucketName) is None:
    bucket=s3.create_bucket(bucketName) # Bucket Don't Exist
else:
    bucket = s3.get_bucket(bucketName) #Bucket Exist

Ответ 6

вы можете использовать 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

Начиная с версии Boto v2.25.0, теперь выполняется запрос HEAD (менее дорогие, но хуже сообщения об ошибках).