繁体   English   中英

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

[英]How can I easily determine if a Boto 3 S3 bucket resource exists?

例如,我有这个代码:

import boto3

s3 = boto3.resource('s3')

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

# Does it exist???

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

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

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

正如@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
>>> 

我试过丹尼尔的例子,这真的很有帮助。 跟进了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。

我在这方面取得了成功:

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

如果存在桶,则使用查找功能 - >返回无

if s3.lookup(bucketName) is None:
    bucket=s3.create_bucket(bucketName) # Bucket Don't Exist
else:
    bucket = s3.get_bucket(bucketName) #Bucket Exist

你可以使用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)

引用http://boto.readthedocs.org/en/latest/s3_tut.html上的文档

从Boto v2.25.0开始,现在执行HEAD请求(更便宜但更糟糕的错误消息)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM