跨账号S3访问权限拒绝:EC2实例访问其他账号S3失败排查
问题诊断与修复方案
一、命令执行核心错误
你执行的S3命令格式错误,且未切换到目标跨账号角色:
- 错误命令:
aws s3 ls //test-sample-bucket,正确格式应为aws s3 ls s3://test-sample-bucket - 关键问题:EC2实例默认使用AccountB的
ec2_role,该角色仅拥有sts:AssumeRole权限,没有直接访问AccountA桶的权限。必须先切换到AccountA的cross_account_access_role才能执行操作。
正确的命令执行方式:
直接在S3命令中指定跨账号角色:
aws s3 ls s3://test-sample-bucket --role-arn arn:aws:iam::AAAAAAAAAA:role/cross_account_access_role --role-session-name test-session
或者先通过STS获取临时凭证并配置环境变量后再执行S3命令。
二、AccountA桶策略缺失关键配置
当前AccountA的桶策略未指定Principal字段,导致策略完全无效。桶策略必须明确授权对象,修改后的桶策略应指定AccountB的角色:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "1", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::BBBBBBBBBB:role/ec2_role" }, "Action": ["s3:*"], "Resource": [ "arn:aws:s3:::test-sample-bucket", "arn:aws:s3:::test-sample-bucket/*" ] } ] }
三、AccountA跨账号角色的权限策略冗余
你将桶策略直接附加到cross_account_access_role属于冗余操作,IAM角色的权限策略应直接定义允许的S3操作,简化后的角色权限策略如下:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["s3:*"], "Resource": [ "arn:aws:s3:::test-sample-bucket", "arn:aws:s3:::test-sample-bucket/*" ] } ] }
注:你当前的角色信任策略是正确的,无需修改
四、角色名称不匹配导致信任失败
在AccountA的信任策略中,指定的Principal是arn:aws:iam::BBBBBBBBBB:role/test_ec2_role,但你在AccountB实际创建的角色名为ec2_role,名称完全不匹配!这会直接导致无法AssumeRole,必须二选一修正:
- 将AccountB的角色名改为
test_ec2_role - 修改AccountA信任策略中的Principal为
arn:aws:iam::BBBBBBBBBB:role/ec2_role
内容的提问来源于stack exchange,提问作者NotAgain
相关产品推荐
相关产品推荐

