web-dev-qa-db-ja.com

Boto 3 S3バケットリソースが存在するかどうかを簡単に判断するにはどうすればよいですか?

たとえば、私はこのコードを持っています:

import boto3

s3 = boto3.resource('s3')

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

# Does it exist???
31
Daniel

この記事の執筆時点では、バケットが存在しているかどうかをすばやく確認するための高レベルの方法はありませんが、HeadBucket操作に対して低レベルの呼び出しを行うことができます。これは、このチェックを行う最も安価な方法です。

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.

または、create_bucketを繰り返し呼び出すこともできます。操作はべき等であるため、既存のバケットを作成するか、単に返すだけです。これは、バケットを作成する必要があるかどうかを確認するために存在を確認する場合に便利です。

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

いつものように、必ず official documentation をチェックしてください。

注:0.0.7リリースより前では、metaはPython=辞書でした。

53
Daniel

@Danielが述べたように、Boto3のドキュメントで提案されている最良の方法は、 head_bucket() を使用することです

head_bucket()-この操作は、バケットが存在し、それにアクセスする権限があるかどうかを判断するのに役立ちます.

バケットの数が少ない場合は、次を使用できます。

>>> 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

Daniel's の例を試しましたが、本当に役に立ちました。 boto3のドキュメントをフォローアップしました。これが私のクリーンなテストコードです。バケットがプライベートで「禁止」を返す場合の「403」エラーのチェックを追加しました。エラー。

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)

これが私のようなboto3の新しいものに役立つことを願っています。

11
mondnom

私はこれで成功しました:

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_