我们在Amazon S3上的存储桶中有一个浓密的树,其中包含大量文件。我刚刚发现,虽然有些文件有两个权限条目,如果点击AWS管理控制台中的文件就会看到,然后属性 - >权限,一行是“everyone”而另一行是某个特定用户,其他文件只有一个该用户的条目。结果,我们在使用boto或curl将这些文件下载到Amazon EC2实例时遇到问题。
我需要做的是查看存储桶中的所有文件并检查它们。我知道如何获取前缀的完整密钥列表。我可以使用boto来提取密钥的权限吗?是否有一种标准的方法来测试这些权限是针对每个人还是某个特定的人,以及它们是什么?
此外,一旦我确定密钥是否具有限制权限,我是否可以通过向“所有人”添加读取权限来以编程方式更改它们?
THX
答案 0 :(得分:11)
这是一些使用boto的Python代码,它可以查看存储桶中的所有密钥。如果密钥不允许“所有人”读取密钥的内容,则会为该密钥添加public-read
权限:
import boto
all_users = 'http://acs.amazonaws.com/groups/global/AllUsers'
conn = boto.connect_s3()
bucket = conn.get_bucket('mybucket')
for key in bucket:
readable = False
acl = key.get_acl()
for grant in acl.acl.grants:
if grant.permission == 'READ':
if grant.uri == all_users:
readable = True
if not readable:
key.make_public()
此代码尚未经过全面测试,因此您应该先尝试一下。另外,要明确这样做的最终结果是使任何人都可以读取桶中的所有对象。另外请记住,此脚本正在获取存储桶中每个对象的当前ACL,因此,如果有数百万个对象,那么数百万个请求可能会花费大量时间并且会产生一些相关成本。
另一种方法是只对存储桶中的每个密钥调用make_public()
,无论它是当前的ACL。