2014-11-11 14 views

risposta

27

Al momento della stesura di questo non v'è alcun modo di alto livello per verificare rapidamente se esiste un secchio e si ha accesso ad esso, ma si può fare un basso -level chiamata all'operazione HeadBucket. Questo è il modo più economico per fare questo controllo:

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. 

In alternativa, è possibile anche chiamare create_bucket ripetutamente. L'operazione è idempotente, quindi sarà creare o semplicemente restituire il secchio esistente, che è utile se si sta verificando l'esistenza di sapere se è necessario creare il secchio:

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

Come sempre, assicurati di controllare le official documentation.

Nota: prima della versione 0.0.7, meta era un dizionario Python.

+0

questo è anche il metodo migliore per verificare l'esistenza di oggetti, per chiamare 'head_object()' e gestire l'errore? al contrario di 'key in bucket.objects.all()'? (specialmente se non si intende effettivamente 'get()' l'oggetto?) –

+2

@ChristopherPearson di solito è meglio usare 'head_object()' perché farà solo una piccola richiesta mentre usa 'bucket.objects.all () 'recupera tutte le informazioni dell'oggetto (che possono essere richieste multiple per ogni pagina di risultati) e quindi cerca l'esistenza della tua chiave in quei risultati. – Daniel

+5

Solo un piccolo chiarimento: 'create_bucket()' restituisce un errore 'BucketAlreadyOwnedByYou' in tutte le regioni AWS tranne la regione US East (Virginia settentrionale), mentre nella regione' us-east-1' otterrete 200 OK. L'uso di 'head_object()' è in realtà il [modo corretto per andare] (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

Siamo spiacenti, questo è per [Boto 3] (https: // github.com/boto/boto3), non Boto 2.x! – Daniel

+1

La mia soluzione ha funzionato? – helloV

+2

Sì, funzionerà assumendo che tu sia il proprietario del bucket, tuttavia chiamerà l'operazione ListBuckets, che è leggermente più costosa di un'operazione HeadBucket.Per i volumi di chiamate bassi, il costo è lo stesso, ma se si controllano molti bucket, è possibile che si accumulino nel tempo! Inoltre, la raccolta crea istanze di risorse dopo aver analizzato la risposta mentre la chiamata 'head_bucket' restituisce solo la risposta di basso livello senza elaborazione aggiuntiva. – Daniel

-2

è possibile utilizzare 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) 

citando la documentazione a 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

non è questo per boto not boto3? –

-1

utilizzare la funzione di ricerca -> Restituisce None se secchio esiste

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

Nessuna funzione di ricerca nel client s3 di boto3 o nella risorsa API. – Atifm

2

I prova d esempio Daniel's ed è stato davvero utile. Ho seguito la documentazione di boto3 ed ecco il mio codice di test pulito. Ho aggiunto un controllo per l'errore "403" quando i bucket sono privati ​​e restituisco "Proibito!" errore.

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) 

Spero che questo aiuti un po 'di novità in boto3 come me.

Problemi correlati