You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 02:51:01