我有一个 S3 存储桶,它为每个用户提供一个目录(前缀),我想让每个用户(其他 AWS 账户)只访问他们的对象,我还想使用请求者支付所有传输费用。一些想法:
1.使用桶策略
我还没有对此进行测试,但我认为可以通过为每个帐户附加与此类似的策略来做到这一点:
{
"Sid": "id1",
"Action": "s3:ListBucket",
"Effect": "Allow",
"Resource": "arn:aws:s3:::my-bucket",
"Principal": "arn:aws:iam::123:role/external-role-1",
"Condition": {"StringEquals":{"s3:prefix":["user-1/"],"s3:delimiter":["/"]}}
},
{
"Sid": "id2",
"Action": "s3:GetObject",
"Effect": "Allow",
"Resource": "arn:aws:s3:::my-bucket/user-1/*",
"Principal": "arn:aws:iam::123:role/external-role-1"
}
在这里,可以通过在他们的帐户中定义的 ,user-1
访问他们的对象并列出他们的目录。external-role-1
这种方法的唯一问题是这 2 个块大约 500 字节,存储桶策略限制为 20 KB,因此每个存储桶最多可以容纳约 40 个用户。
2.为我的账户中的每个用户创建一个角色,并允许外部用户承担它
这通过将 JSON 分布在许多 IAM 角色中来避免上述问题。这种方法的问题在于,这会破坏请求者的付费。
当请求者在提出请求之前担任 AWS Identity and Access Management (IAM) 角色时,该角色所属的账户将针对该请求收费。
https://docs.aws.amazon.com/AmazonS3/latest/userguide/RequesterPaysBuckets.html
3. 使用Object ACL或标记来控制对Object的访问
通过避免GetObject
策略,这可以使容量从 #1 翻倍,但ListBucket
仍然需要每个用户的策略。
这些都不完全满足我想要实现的目标,有更好的方法吗?有没有办法为每个用户创建一个 IAM 策略,然后将其附加到他们的外部 IAM 角色?