AWS S3批量操作遇访问拒绝问题排查咨询
结合你提供的存储桶策略和IAM角色配置,我整理了几个最可能导致这个问题的排查方向:
1. 检查IAM角色的信任关系是否允许S3批量服务扮演它
你给目标账号的IAM角色附加了必要的操作权限,但很容易忽略一个关键点:S3批量操作服务需要能够扮演这个角色才能执行任务。如果角色的信任策略没有放开给batchoperations.s3.amazonaws.com,就算权限策略配置正确,也会触发Access Denied。
你可以进入IAM控制台找到cfn-batch-copy-role,查看「信任关系」标签,确保包含以下声明:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "batchoperations.s3.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
2. 确认存储桶策略的Resource范围覆盖桶级权限
你源存储桶策略的Resource只设置了arn:aws:s3:::sourcebucket/*(对象级),但S3批量操作执行时需要一些桶级权限,比如GetBucketLocation、ListBucket,这些权限对应的Resource是桶本身(arn:aws:s3:::sourcebucket),而不是对象路径。
需要给源桶策略补充一段桶级权限的声明:
{ "Sid": "AllowBatchBucketAccess", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::xxxxxxxxxxxx:role/cfn-batch-copy-role" }, "Action": [ "s3:GetBucketLocation", "s3:ListBucket" ], "Resource": "arn:aws:s3:::sourcebucket" }
同样,目标桶的角色策略里,GetBucketLocation权限对应的Resource应该包含arn:aws:s3:::destinationbucket(桶本身),而不只是destinationbucket/*,因为这个权限是作用在桶层面的。
3. 清单(Manifest)存储桶的权限是否完整
你的角色策略包含了manifestbucket/*的权限,但要确认:
- 清单文件所在的桶是否有对应的桶策略,允许
cfn-batch-copy-role访问它(如果清单桶属于其他账号,这点尤为重要) - 角色是否有
s3:GetObject权限读取清单文件本身,同时清单桶的桶策略不能拒绝这个访问
4. 版本控制场景下的额外权限
如果源桶开启了版本控制,除了你已配置的版本对象相关权限,还需要添加桶级的ListBucketVersions权限到源桶策略中,否则批量操作无法枚举所有版本的对象,也会触发访问拒绝。
5. 检查权限边界与组织SCP限制
- 查看
cfn-batch-copy-role是否设置了权限边界,如果有,权限边界必须允许角色执行所有需要的S3操作,否则会覆盖你附加的策略。 - 如果你的账号属于AWS组织,确认组织的SCP(服务控制策略)是否禁止了跨账号S3访问,或者限制了批量操作所需的特定权限。
最后,你可以用AWS IAM Access Analyzer来扫描角色权限,或者通过aws sts assume-role模拟角色执行相关S3操作,来定位具体缺失的权限。
内容的提问来源于stack exchange,提问作者Anbu

