如何轻松确定Boto 3 S3存储桶资源是否存在?

Dan*_*iel 32 python amazon-s3 amazon-web-services boto3

例如,我有这个代码:

import boto3

s3 = boto3.resource('s3')

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

# Does it exist???
Run Code Online (Sandbox Code Playgroud)

Dan*_*iel 54

在撰写本文时,没有高级方法可以快速检查存储桶是否存在并且您可以访问它,但是您可以对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.
Run Code Online (Sandbox Code Playgroud)

或者,您也可以create_bucket反复拨打电话.该操作是幂等的,因此它将创建或仅返回现有存储桶,如果您检查存在以了解是否应创建存储桶,这将非常有用:

bucket = s3.create_bucket(Bucket='my-bucket-name')
Run Code Online (Sandbox Code Playgroud)

一如既往,请务必查看官方文档.

注意:在0.0.7版本之前,meta是一个Python字典.

  • 只是一个小小的澄清:`create_bucket()`在除美国东部(弗吉尼亚北部)地区以外的所有AWS区域都返回一个'BucketAlreadyOwnedByYou`错误,而在'us-east-1`区域,你会得到200 OK.使用`head_object()`实际上是[正确的方法](http://boto3.readthedocs.io/en/latest/guide/migrations3.html#accessing-a-bucket). (8认同)
  • @ChristopherPearson使用`head_object()`通常更好,因为在使用`bucket.objects.all()`时它只会执行一个小的请求会获取所有对象信息(可能是每个页面的多个请求)结果)然后在这些结果中查找密钥的存在. (2认同)
  • 不幸的是,在不同区域创建的现有存储桶上调用 create_bucket 将引发以下异常:`ClientError: 调用 CreateBucket 操作时发生错误 (BucketAlreadyOwnedByYou): 您之前创建命名存储桶的请求已成功,并且您已拥有它。 ` (2认同)

hel*_*loV 23

>>> import boto3
>>> s3 = boto3.resource('s3')
>>> s3.Bucket('Hello') in s3.buckets.all()
False
>>> s3.Bucket('some-docs') in s3.buckets.all()
True
>>> 
Run Code Online (Sandbox Code Playgroud)

  • 是的,假设您是存储桶拥有者,这将起作用,但是它将调用ListBuckets操作,这比HeadBucket操作略贵.对于低通话量,它将花费相同,但如果你检查许多桶,它可以随着时间的推移累加!此外,该集合在解析响应后创建资源实例,而`head_bucket`调用只返回低级响应而无需额外处理. (4认同)

小智 11

我试过丹尼尔的例子,这真的很有帮助.跟进了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)
Run Code Online (Sandbox Code Playgroud)

希望这有助于像我一样进入boto3.


hre*_*ef_ 6

我已经成功地做到了:

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")
Run Code Online (Sandbox Code Playgroud)

  • 有谁知道执行 `s3.Bucket().creation_date` 所需的最低权限操作是什么? (3认同)
  • 这是IMO的最佳解决方案,因为:1)它不需要昂贵的ListBuckets;2)不需要使用低级客户端API (2认同)
  • 对于存在且我可以上传到的存储桶,获取“创建日期”为“无”。 (2认同)
  • PS:半小时后,“creation_date”不再是“None”。这是一个新存储桶,所以我认为在创建存储桶后某个地方存在滞后。 (2认同)