2014-11-11 6 views

ответ

27

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

+0

Это также лучший метод проверки существования объектов, вызов 'head_object()' и обработка ошибки? в отличие от 'key в bucket.objects.all()'? (особенно если вы не собираетесь на самом деле 'get()' объект?) –

+2

@ChristopherPearson обычно лучше использовать 'head_object()', потому что он будет выполнять только один небольшой запрос при использовании 'bucket.objects.all () 'будет извлекать всю информацию об объекте (которая может представлять собой несколько запросов для каждой страницы результатов), а затем ищет наличие вашего ключа в этих результатах. – Daniel

+5

Просто небольшое пояснение: 'create_bucket()' возвращает ошибку BucketAlreadyOwnedByYou во всех регионах AWS, кроме региона США (Северная Вирджиния), тогда как в регионе 'us-east-1' вы получите 200 OK. Использование 'head_object()' на самом деле [правильный путь] (http://boto3.readthedocs.io/en/latest/guide/migrations3.html#accessing-a-bucket). – lec00q

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

Извините, это для [Boto 3] (https: // github.com/boto/boto3), а не Boto 2.x! – Daniel

+1

Помогло ли мое решение? – helloV

+2

Да, это будет работать, если вы являетесь владельцем ковша, однако он вызовет операцию ListBuckets, которая немного дороже, чем операция HeadBucket.Для низких объемов вызовов это будет стоить одинаково, но если вы будете проверять многие ведра, это может со временем складываться! Кроме того, коллекция создает экземпляры ресурсов после разбора ответа, в то время как вызов 'head_bucket' просто возвращает низкоуровневый ответ без дополнительной обработки. – Daniel

-2

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

+1

это не для boto not boto3? –

-1

Использование поиска Функция -> Возвращает 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 
+1

Нет функции поиска в s3-клиенте boto3 или ресурсе api. – Atifm

2

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, как я.