如何为其他AWS账户授予账单报告S3存储桶读取权限
跨账户S3账单数据访问失败的排查与解决
你猜的很准——bucket-owner-full-control权限缺失确实是这类跨账户S3访问失败的核心原因之一,不过咱们得把整个逻辑和排查步骤理清楚,才能彻底解决问题:
1. 为什么对象所有权是关键?
当AWS账单服务从一个账户向另一个账户的S3桶上传对象时,默认情况下,上传的对象所有权属于上传方的AWS账户,而非桶的所属账户。这时候哪怕你给目标账户的EC2实例配置了桶的GetObject权限,因为对象的所有权不在桶所有者手里,权限规则根本不会生效。
要打破这个限制,必须确保上传操作附带bucket-owner-full-control的ACL,让桶的所有者获得对象的完全控制权。
2. 修复上传时的ACL配置
检查并更新账单报告的上传设置
登录存储账单数据的AWS账户,按以下步骤操作:
- 进入Billing控制台,找到你正在使用的报告类型(「Cost & Usage Reports」或「Detailed Billing Reports」)
- 编辑对应的报告配置,在「S3 bucket settings」区域,确认是否勾选了**「Grant Amazon S3 bucket owner full control」**选项。如果没勾选,启用它并保存配置——之后新上传的账单报告就会自动带上正确的ACL。
修复已存在的历史对象权限
对于已经上传的旧账单对象,你需要手动批量更新它们的ACL,让桶所有者获得控制权。可以用AWS CLI执行以下命令(替换成你的桶名和报告路径前缀):
aws s3 cp s3://your-billing-bucket/billing-reports/ s3://your-billing-bucket/billing-reports/ --recursive --acl bucket-owner-full-control
这个命令会递归更新指定路径下所有对象的ACL权限。
3. 确认跨账户权限配置是否完整
除了对象所有权,你还得确保桶策略和IAM角色的配置没有遗漏:
- S3桶策略:在目标桶的权限配置中,添加允许目标账户EC2实例角色访问的语句,示例如下:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::TARGET-ACCOUNT-ID:role/YOUR-EC2-INSTANCE-ROLE" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::your-billing-bucket/billing-reports/*" } ] }
- EC2实例IAM角色:目标账户的EC2实例必须关联了具有
S3:GetObject权限的IAM角色,且角色的信任策略要允许EC2服务扮演该角色。
4. 验证权限是否生效
完成上述配置后,你可以在目标账户的EC2实例上执行测试命令,确认是否能正常获取对象:
aws s3 cp s3://your-billing-bucket/billing-reports/latest-hourly-report.csv -
如果能成功输出文件内容,说明权限配置已经正常工作了。
内容的提问来源于stack exchange,提问作者TeemuK
相关产品推荐
相关产品推荐

