如何赋予其他账户与S3存储桶所有者等同的访问权限解决跨账户读取问题
解决方案
最优方案:启用S3桶所有者强制所有权配置
这个方案可以直接满足你提到的两个目标,全程只需要桶级配置,不需要修改任何现有对象,也不需要管控上传端行为:
- 操作步骤:
- 进入目标S3桶的控制台,切换到「权限」标签,找到「对象所有权」设置项
- 选择*桶所有者强制(Bucket owner enforced)*模式并保存,该模式会自动将所有现有、新增对象的所有权收归桶所有者账户,同时禁用所有对象级ACL,对象级权限配置不会再产生任何限制。由于你当前所有写入操作都已配置
owner-full-control权限,开启该模式不会出现现有对象的权限冲突问题 - 配置桶策略,给需要访问的身份(你的Lambda执行角色、各CI阶段的执行角色)授予
s3:GetObject权限即可,参考配置如下:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::<Lambda所属账户ID>:role/<Lambda执行角色名称>", "arn:aws:iam::<CI1账户ID>:role/<CI执行角色名称>", "arn:aws:iam::<CI2账户ID>:role/<CI执行角色名称>" ] }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::<你的桶名称>/*" } ] }
备选方案:使用桶所有者账户的Lambda做访问中转
如果涉及的CI账户数量多、变动频繁,不想反复修改桶策略,可以用以下方案:
- 将读取S3的Lambda部署在桶所有者所属账户,桶策略仅给该Lambda的执行角色开放
s3:GetObject全桶权限 - 对外暴露Lambda的调用入口,所有CI阶段的读取请求统一调用该Lambda获取对象内容
- 后续新增CI账户仅需要给对应CI角色配置Lambda的
lambda:InvokeFunction权限即可,不需要修改S3桶的任何配置
方案生效说明
因为你当前所有上传操作都已经配置了owner-full-control权限,桶所有者本身已经具备所有对象的完全控制权限,上述两个方案都不需要修改任何现有对象,配置完成后立即全局生效,后续新增对象也会自动继承权限,不需要额外处理。
内容的提问来源于stack exchange,提问作者Darren Oakey
相关产品推荐
相关产品推荐

