8

我们在 Amazon S3 上的存储桶中有一棵茂密的树,其中包含大量文件。我刚刚发现,虽然有些文件有两个权限条目,如在 AWS 管理控制台中单击一个文件,然后是属性 -> 权限,一行是“每个人”,另一行是某个特定用户,其他文件只有一个该用户的条目。因此,我们在使用 boto 或 curl 将这些文件下载到 Amazon EC2 实例时遇到问题。

我需要做的是检查存储桶中的所有文件并检查它们。我知道如何获取前缀的完整键列表。我可以使用 boto 来提取密钥的权限吗?是否有标准的方法来测试这些权限是否适用于每个人或特定的人,以及它们是什么?

此外,一旦我确定一个密钥是否具有限制性权限,我可以通过向“每个人”添加读取权限以编程方式更改它们吗?

谢谢

4

1 回答 1

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。

于 2013-04-17T15:59:37.170 回答