web-dev-qa-db-fra.com

Comment puis-je facilement déterminer si une ressource de compartiment Boto 3 S3 existe?

Par exemple, j'ai ce code:

import boto3

s3 = boto3.resource('s3')

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

# Does it exist???
31
Daniel

Au moment d'écrire ces lignes, il n'existe aucun moyen de haut niveau pour vérifier rapidement si un compartiment existe et vous y avez accès, mais vous pouvez effectuer un appel de bas niveau à l'opération HeadBucket. C'est le moyen le moins cher de faire cette vérification:

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.

Alternativement, vous pouvez également appeler create_bucket à plusieurs reprises. L'opération est idempotente, elle créera ou renverra simplement le compartiment existant, ce qui est utile si vous vérifiez l'existence pour savoir si vous devez créer le compartiment:

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

Comme toujours, assurez-vous de consulter la documentation officielle .

Remarque: Avant la version 0.0.7, meta était un dictionnaire Python.

53
Daniel

Comme mentionné par @Daniel, la meilleure façon suggérée par les documents Boto3 est d'utiliser head_bucket ()

head_bucket () - Cette opération est utile pour déterminer si un compartiment existe et que vous êtes autorisé à y accéder .

Si vous disposez d'un petit nombre de compartiments, vous pouvez utiliser les éléments suivants:

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

J'ai essayé Daniel's exemple et c'était vraiment utile. Suivi de la documentation de boto3 et voici mon propre code de test. J'ai ajouté une vérification de l'erreur "403" lorsque les compartiments sont privés et renvoie un "Interdit! Erreur.

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)

J'espère que cela aide de nouveaux utilisateurs de boto3 comme moi.

11
mondnom

J'ai réussi avec ça:

import boto3

s3 = boto3.resource('s3')
bucket = s3.Bucket('my-bucket-name')

if bucket.creation_date:
   print("The bucket exists")
else:
   print("The bucket does not exist")
4
href_