我想将boto程序限制为能够列出密钥并仅从S3存储桶中的特定文件夹(前缀)获取密钥。
我有一个具有以下访问策略的IAM角色(当然还有真实姓名)。这是IAM文档中有关如何允许用户访问“主目录”的示例策略的变体:
{
"Version": "2012-10-17",
"Statement": [
{
"Action": ["s3:Get*", "s3:List*"],
"Effect": "Allow",
"Resource": ["arn:aws:s3:::my-bucket"],
"Condition":{"StringLike":{"s3:prefix":["my-prefix/*"]}}
},
{
"Action":["s3:Get*", "s3:List*"],
"Effect":"Allow",
"Resource": ["arn:aws:s3:::my-bucket/my-prefix/*"]
}
]
}
在boto中,我连接到S3并获得临时信誉。然后我运行这个:
bucket = s3_connection.get_bucket('my-bucket')
all_keys = bucket.get_all_keys()
for key in all_keys:
print key
get_bucket 调用失败。到目前为止,我能让它工作的唯一方法是删除 s3:Prefix 条件(基本上,删除策略中的第一个语句)。但是,然后允许脚本列出整个存储桶中的密钥,而不仅仅是具有特定前缀的密钥。我使用错误的方法获取密钥吗?所有S3访问似乎都以 get_bucket 开始。
我可以使用AWS CLI来完成这项工作,如下所示:
aws sts assume-role --role-arn arn:aws:iam::123456789012:role/my-role --role-session-name "role1" --profile other-account-admin-user > temp-creds.txt
# ... copy temp-creds into credentials file using profile name "temp-creds", then ...
# works
aws s3api list-objects --bucket my-bucket --prefix my-prefix/ --profile temp-creds
# fails, as expected
aws s3api list-objects --bucket my-bucket --profile temp-creds
这让我觉得有一种方法可以在boto中做到这一点,我无法弄明白。 (当然,我的测试可能存在缺陷,这种情况发生了很多,哈哈。)
答案 0 :(得分:5)
默认情况下,boto中的get_bucket
方法尝试通过对存储区URL执行HEAD
请求来验证存储桶是否存在。我认为这会在你的情况下失败,因为用户无法访问存储桶的根目录。
所以,我觉得这样的事情对你有用:
bucket = s3_connection.get_bucket('my-bucket', validate=False)
for key in bucket.list(prefix='my-prefix'):
print(key)