是否可以检查存储桶名称是否已存在?

Is it possible to check if a bucket name already exists?

我有一个方法需要一个名称来创建一个新的桶。

如果存储桶名称已经存在,我想显示一条消息 "bucket name already exist"。

是否可以检查存储桶名称是否已经存在?

def createBucket(bucketName):
    c = boto.s3.connect_to_region("us-east-1")
    # if bucketName exist: 
        print "bucket name already exist"
    else:
        bucket = c.create_bucket(bucketName)

bucket = createBucket(raw_input("Bucket name: "))   

当每个位置的存储桶名称已被占用时,Amazon Web 服务会给您一个自定义 S3CreateError 异常。

>>> bucket = conn.create_bucket('mybucket')
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "boto/connection.py", line 285, in create_bucket
    raise S3CreateError(response.status, response.reason)
boto.exception.S3CreateError: S3Error[409]: Conflict

您可以在您的案例中使用该例外。

from boto.exception import S3CreateError

    def createBucket(bucketName):
        c = boto.s3.connect_to_region("us-east-1")
        try:
            bucket = c.create_bucket(bucketName)
        except S3CreateError:
            print "bucket name already exist"

    bucket = createBucket(raw_input("Bucket name: ")) 

lookup 应该可以(虽然我现在不能尝试)。

假设 boto.cfg 已针对区域、安全、访问等进行配置。

from boto.s3.connection import S3Connection
conn = S3Connection()
if conn.lookup('bucketnamehere') is not None:
     print('bucket already exists')

如果您的 boto 不支持 conn.lookup,您可能想使用 head 而不是 get(参见:http://boto.readthedocs.org/en/latest/ref/s3.html#module-boto.s3.connection

try:
    conn.head_bucket('bucketnamehere')

except S3ResponseError as error:
    print('bucket already exists: {0}'.format(error))

我有同样的问题,但是 a) 使用 boto3 和 b) 我关心“不存在于任何人的帐户中”和“我只是没有访问权限”之间的区别。这就是我发现的似乎有效的方法:

import boto3
list(s3.Bucket("private").objects.all())
# Thank you whoever created that bucket! 
# -> throws "An error occurred (AccessDenied)..."

list(s3.Bucket(some_name_that_does_not_exists).objects.all())
# -> throws "An error occurred (NoSuchBucket)..."