例如,我有这段代码:
import boto3
s3 = boto3.resource('s3')
bucket = s3.Bucket('my-bucket-name')
# Does it exist???
例如,我有这段代码:
import boto3
s3 = boto3.resource('s3')
bucket = s3.Bucket('my-bucket-name')
# Does it exist???
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字典。
我已经成功尝试过这个:
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")
s3.Bucket().creation_date
所需的最小权限操作是什么吗? - Shawncreation_date
为None
。 - Fabien Snauwaert如@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
>>>
我尝试了Daniel的示例,它非常有帮助。接着按照boto3文档编写了我的测试代码。我添加了一个检查,用于处理私有存储桶返回“Forbidden!”错误的情况。
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的新手有所帮助。
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请求(更便宜但错误消息更糟糕)。
head_object()
并处理错误?相对于key in bucket.objects.all()
?(特别是如果您不打算实际get()
该对象?) - Christopher Pearsonhead_object()
,因为它只会执行一次小型请求,而使用bucket.objects.all()
将获取所有对象信息(这可能需要多个页面的结果的多个请求),然后在这些结果中查找您的键是否存在。@ChristopherPearson - Danielcreate_bucket()
在除了美国东部(弗吉尼亚北部)区域以外的所有 AWS 区域中都会返回BucketAlreadyOwnedByYou
错误, 而在us-east-1
区域中会得到 200 OK 响应。实际上,使用head_object()
才是正确的方法。 - lec00qClientError:调用CreateBucket操作时发生错误(BucketAlreadyOwnedByYou):您先前创建命名存储桶的请求成功,并且您已经拥有它。
- siesta