【问题标题】:Making all s3 files in a folder public with boto3使用 boto3 公开文件夹中的所有 s3 文件
【发布时间】:2021-10-15 23:48:28
【问题描述】:

我在 S3 存储桶中有一堆文件,它们都需要公开。但是,当我的队友在那里添加新文件时,他们忘记将它们设置为公开。

所以,我使用 python3 脚本来确保所有相应的文件都被公开。

这是我目前所拥有的:

import boto3
s3 = boto3.resource('s3', region_name='eu-west-1')

## Bucket to use
bucket = s3.Bucket('my_bucket')

## List objects within a given prefix
for obj in bucket.objects.filter(Delimiter='/', Prefix='public_folder/'):
    obj.set_acl('public-read')

当我尝试上述方法时,我得到一个错误:


AttributeError: 's3.ObjectSummary' object has no attribute 'set_acl'

我该怎么做?

【问题讨论】:

    标签: python python-3.x amazon-web-services amazon-s3 boto3


    【解决方案1】:

    如果您的目标是公开整个存储桶(甚至只是存储桶中的子目录),更简单的方法是创建存储桶策略 喜欢Bucket policy examples - Amazon Simple Storage Service 的这个例子:

    以下示例策略将 s3:GetObject 权限授予任何公共匿名用户。此权限允许任何人读取对象数据,这对于您将存储桶配置为网站并希望每个人都能够读取存储桶中的对象时非常有用。在您使用存储桶策略向匿名用户授予只读权限之前,您必须为您的存储桶禁用阻止公共访问设置

    {
      "Version":"2012-10-17",
      "Statement":[
        {
          "Sid":"PublicRead",
          "Effect":"Allow",
          "Principal": "*",
          "Action": "s3:GetObject",
          "Resource":["arn:aws:s3:::EXAMPLE-BUCKET/*"]
        }
      ]
    }
    

    这将授予公共访问权限,而不管各个对象的 ACL 设置如何。

    【讨论】:

      【解决方案2】:

      先获取对象acl并进行编辑

      s3 = boto3.resource('s3')
      object_acl = s3.ObjectAcl('bucket_name','object_key')
      response = object_acl.put(ACL='public-read')
      

      【讨论】:

      • 完美。谢谢!
      猜你喜欢
      • 1970-01-01
      • 2019-11-26
      • 2019-05-13
      • 2015-11-30
      • 2018-09-21
      • 1970-01-01
      • 2019-01-07
      • 2017-01-09
      • 1970-01-01
      相关资源
      最近更新 更多