【问题标题】:Get all s3 buckets given a prefix获取给定前缀的所有 s3 存储桶
【发布时间】:2016-07-02 18:19:05
【问题描述】:

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

  • myapp-us-east-1
  • myapp-us-west-1

有没有办法找到给定前缀的所有桶?有没有类似的东西:

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

【问题讨论】:

  • 我只是在我的回答中添加了处理存储桶前缀列表的代码:-D
  • 如果您检查每个 boto3 ec2.describe_* 函数,您会注意到唯一通用的过滤器格式是标签。

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


【解决方案1】:

高级集合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 对象,那么这可能会产生巨大的成本。

【讨论】:

    【解决方案2】:

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

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

    这个函数不带任何请求参数,所以服务器端没有过滤。

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

    【讨论】:

    猜你喜欢
    • 2021-12-27
    • 2021-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多