Zum Beispiel habe ich diesen Code haben:Wie kann ich leicht feststellen, ob eine Boto 3 S3-Bucket-Ressource existiert?
import boto3
s3 = boto3.resource('s3')
bucket = s3.Bucket('my-bucket-name')
# Does it exist???
Zum Beispiel habe ich diesen Code haben:Wie kann ich leicht feststellen, ob eine Boto 3 S3-Bucket-Ressource existiert?
import boto3
s3 = boto3.resource('s3')
bucket = s3.Bucket('my-bucket-name')
# Does it exist???
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.
>>> import boto3
>>> s3 = boto3.resource('s3')
>>> s3.Bucket('Hello') in s3.buckets.all()
False
>>> s3.Bucket('some-docs') in s3.buckets.all()
True
>>>
Sorry, dies ist für [Boto 3] (https: // github.com/boto/boto3), nicht Boto 2.x! – Daniel
Hat meine Lösung funktioniert? – helloV
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
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).
ist das nicht für Boto nicht Boto3? –
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
Keine Suchfunktion in s3-Client oder Ressourcen-API von boto3. – Atifm
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.
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") –
@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
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