Per esempio, io ho questo codice:Come posso determinare facilmente se esiste una risorsa bucket Boto 3 S3?
import boto3
s3 = boto3.resource('s3')
bucket = s3.Bucket('my-bucket-name')
# Does it exist???
Per esempio, io ho questo codice:Come posso determinare facilmente se esiste una risorsa bucket Boto 3 S3?
import boto3
s3 = boto3.resource('s3')
bucket = s3.Bucket('my-bucket-name')
# Does it exist???
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.
>>> import boto3
>>> s3 = boto3.resource('s3')
>>> s3.Bucket('Hello') in s3.buckets.all()
False
>>> s3.Bucket('some-docs') in s3.buckets.all()
True
>>>
Siamo spiacenti, questo è per [Boto 3] (https: // github.com/boto/boto3), non Boto 2.x! – Daniel
La mia soluzione ha funzionato? – helloV
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
è 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).
non è questo per boto not boto3? –
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
Nessuna funzione di ricerca nel client s3 di boto3 o nella risorsa API. – Atifm
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.
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?) –
@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
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