AWS跨账号S3访问遇AccessDenied:EC2角色配置求助
问题分析与解决方法
你的核心问题是:当前EC2实例默认使用的是账号A的IAM角色权限,该角色仅允许调用sts:AssumeRole切换到账号B的角色,但没有直接访问S3的权限。你需要先切换到账号B的aws-access-s3角色,再执行S3操作。
验证当前身份
先在EC2实例上执行以下命令,确认当前使用的凭证是账号A的EC2角色:
aws sts get-caller-identity
输出会显示账号A的ID和EC2角色的ARN,说明当前未切换到账号B的角色。
解决方法
方法1:临时切换角色执行命令
通过sts assume-role获取账号B角色的临时凭证,设置环境变量后再执行S3操作:
# 替换ACCOUNT-B-NUMBER为你的账号B ID ASSUME_ROLE_RESULT=$(aws sts assume-role --role-arn arn:aws:iam::ACCOUNT-B-NUMBER:role/aws-access-s3 --role-session-name s3-access-session) # 提取临时凭证并设置环境变量(需安装jq工具,若未安装可通过aws cli的--query参数提取) export AWS_ACCESS_KEY_ID=$(echo $ASSUME_ROLE_RESULT | jq -r '.Credentials.AccessKeyId') export AWS_SECRET_ACCESS_KEY=$(echo $ASSUME_ROLE_RESULT | jq -r '.Credentials.SecretAccessKey') export AWS_SESSION_TOKEN=$(echo $ASSUME_ROLE_RESULT | jq -r '.Credentials.SessionToken') # 现在执行S3命令 aws s3 ls bucket-name-account-b
方法2:配置AWS CLI Profile(持久化切换)
编辑EC2实例的~/.aws/config文件,添加一个切换到账号B角色的profile:
[profile account-b-s3] role_arn = arn:aws:iam::ACCOUNT-B-NUMBER:role/aws-access-s3 source_profile = default # 这里的default对应EC2实例默认的凭证(即账号A的EC2角色) role_session_name = s3-access-session
之后执行命令时指定该profile即可:
aws s3 ls bucket-name-account-b --profile account-b-s3
额外安全优化(可选)
当前账号B的aws-access-s3角色信任的是账号A的root用户,权限范围过大。建议修改可信实体策略,仅允许账号A的EC2角色切换:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::ACCOUNT-A-NUMBER:role/[你的账号A EC2角色名称]" }, "Action": "sts:AssumeRole" } ] }
排查补充
如果以上操作后仍报错,需检查:
- 账号B的S3桶是否有桶策略明确拒绝
aws-access-s3角色的访问 - EC2实例是否能正常访问AWS STS服务(由于在私有子网带NAT网关,应该没问题,但可通过
aws sts get-caller-identity验证网络连通性)
内容的提问来源于stack exchange,提问作者Renan Nogueira
相关产品推荐
相关产品推荐

