aws s3api get-bucket-policy --bucket b
aws s3api get-object --bucket b --key a.jpg out.jpg --profile other
aws sts get-caller-identity --profile other

另一个账号的角色读桶里的对象,GetObject 返回 AccessDenied,ListBucket 却成功。桶策略里只写了允许 ListBucket。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:桶策略按操作分别授权,ListBucket 和 GetObject 是两条不同的权限。跨账号访问时桶所有者必须显式授权,IAM 策略只解决调用方这一侧。对象属主是另一个账号时,ACL 还会再挡一层。

「跨账号访问被拒」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。监控和日志的时间要对上,时区不一致会多绕很大一圈。

临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。

处理上按这个顺序:桶策略里补 GetObject 并指定对象 ARN 通配;确认调用方角色的信任策略允许被扮演;如果桶开了 ACL 检查 确认对象属主;用 --debug 看请求被哪条策略拒绝。

确认没问题再收工,跨账号角色能下载对象,访问日志里 GetObject 返回 200,ListBucket 仍正常。

作者 9823189