获取所有带有前缀的s3存储桶

时间:2016-03-16 17:35:37

标签: amazon-web-services amazon-s3 boto3

目前,我们有多个具有应用前缀和区域后缀的存储桶 例如存储桶名称

  • myapp-us-east-1
  • MyApp的-US-西-1

有没有办法在给定特定前缀的情况下找到所有桶?是否有类似的东西:

s3 = boto3.resource('s3')
buckets = s3.buckets.filter(Prefix="myapp-")

2 个答案:

答案 0 :(得分:11)

高级别集s3.buckets.filter(Filters=somefilter)仅适用于describe_tags过滤器(列表)下的文档方式。在这种情况下,您必须先标记您的存储桶(s3.BucketTagging),然后才能使用非常具体的过滤方法s3.buckets.filter(Filters=formatted_tag_filter)http://boto3.readthedocs.org/en/latest/reference/services/ec2.html#EC2.Client

恕我直言,如果您计划管理AWS内部的任何资源,则必须进行标记。

目前,你可以这样做

s3 = boto3.resource('s3')
for bucket in s3.buckets.all(): 
    if bucket.name.startswith("myapp-"):
        print bucket.name

以下是过滤掉KEYS(不是存储桶)的示例代码 (http://boto3.readthedocs.org/en/latest/guide/collections.html

# S3 list all keys with the prefix '/photos'
s3 = boto3.resource('s3')
for bucket in s3.buckets.all():
    if bucket.name.startswith("myapp-")" :
        for obj in bucket.objects.filter(Prefix='/photos'):
            print('{0}:{1}'.format(bucket.name, obj.key))

使用上面的示例有一个警告说明:

  

警告   在幕后,上面的示例将多次调用ListBucketsListObjectsHeadObject。如果你有大量的S3对象,那么这可能会产生很大的成本。

答案 1 :(得分:3)

当您从S3服务检索存储桶列表时,您将使用S3服务上的GET /操作。

文档: http://docs.aws.amazon.com/AmazonS3/latest/API/RESTServiceGET.html

此函数不接受任何请求参数,因此服务器端没有过滤。

如果您想根据所需的前缀进行过滤,则需要检索整个存储桶列表,然后自行过滤。