2014-11-11 10 views

Antwort

27

Zum Zeitpunkt des Schreibens dieses Artikels gibt es keine Möglichkeit auf hohem Niveau schnell, ob ein Eimer besteht zu überprüfen, und Sie haben Zugang zu ihr, aber Sie können einen niedrigen machen -level Aufruf der HeadBucket-Operation. Dies ist die kostengünstige Möglichkeit, diese Prüfung zu tun:

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. 

Alternativ können Sie auch create_bucket wiederholt aufrufen. Der Betrieb ist idempotent, so wird es entweder schaffen oder einfach nur die vorhandenen Eimer zurückkehren, was nützlich ist, wenn Sie Existenz überprüft zu wissen, ob Sie den Eimer schaffen sollen:

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

Wie immer sicher sein, das zu überprüfen, official documentation.

Hinweis: Vor der Version 0.0.7 war meta ein Python-Wörterbuch.

+0

ist dies auch die beste Methode, um das Vorhandensein von Objekten zu überprüfen, 'head_object()' aufzurufen und den Fehler zu behandeln? im Gegensatz zu 'key in bucket.objects.all()'? (vor allem, wenn Sie nicht beabsichtigen, das Objekt tatsächlich zu "bekommen") –

+2

@ChristopherPearson ist es normalerweise besser 'head_object()' zu verwenden, da es nur eine kleine Anfrage bei der Verwendung von 'bucket.objects.all () 'würde alle Objektinformationen abrufen (bei denen es sich möglicherweise um mehrere Anforderungen für jede Ergebnisseite handelt) und dann in diesen Ergebnissen nach dem Vorhandensein Ihres Schlüssels suchen. – Daniel

+5

Nur eine kleine Klarstellung: 'create_bucket()' gibt einen 'BucketAlreadyOwnedByYou'-Fehler in allen AWS-Regionen mit Ausnahme der Region USA East (N. Virginia) zurück, während Sie in der Region' us-east-1 '200 OK erhalten. 'Head_object()' ist eigentlich der richtige Weg (http://boto3.readthedocs.io/en/latest/guide/migration3.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

Sorry, dies ist für [Boto 3] (https: // github.com/boto/boto3), nicht Boto 2.x! – Daniel

+1

Hat meine Lösung funktioniert? – helloV

+2

Ja, dies funktioniert, vorausgesetzt, Sie sind der Bucket-Besitzer, jedoch wird der ListBuckets-Vorgang aufgerufen, der etwas teurer ist als ein HeadBucket-Vorgang.Bei niedrigen Anrufvolumina kostet es das gleiche, aber wenn Sie viele Buckets überprüfen, kann es sich im Laufe der Zeit summieren! Darüber hinaus erstellt die Auflistung nach dem Analysieren der Antwort Ressourceninstanzen, während der Aufruf 'head_bucket' nur die Antwort auf niedriger Ebene ohne zusätzliche Verarbeitung zurückgibt. – Daniel

-2

können Sie 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) 

unter Angabe der Dokumentation bei 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

ist das nicht für Boto nicht Boto3? –

-1

Verwenden Lookup-Funktion verwenden -> Gibt Keine, wenn Eimer 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

Keine Suchfunktion in s3-Client oder Ressourcen-API von boto3. – Atifm

2

I Trie d Daniel's Beispiel und es war sehr hilfreich. Folgte der Boto3 Dokumentation und hier ist mein sauberer Testcode. Ich habe eine Überprüfung für '403' Fehler hinzugefügt, wenn die Buckets privat sind und ein 'Verboten!' Error.

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) 

Hoffe, das hilft ein paar neue in Boto3 wie ich.

Verwandte Themen