使用Assume Role进行跨账号访问

一、背景

很多时候管理员维护着不止一个AWS账号,需要在AWS账号中进行频繁切换,这时候可使用AWS Console控制台上的切换Role功能。另外还有一种需求,有时候A账号内的应用希望访问B账号内的资源,并以B账号身份作为实际操作资源的身份。这两种场景,都可以通过IAM Assume Role完成。

二、在AWS Console上发起Assume Role

1、场景说明

假设A帐户内有IAM用户叫做user01,B账号内有一个IAM Role叫做remote-viewer。此时希望A账号内的用户可以以B身份查看B账户所属的AWS控制台。此时分别为A、B两个账号配置IAM Policy,最终在AWS控制台上实现切换。

注意:两个账号不需要有Organization所属关系,只要B账号配置好对A账户的信任关系,即可切换。

2、被控制方B账号的配置信任关系

进入B账户的IAM控制台,找到IAM Role remote-viewer,找到Trust relationshops标签页,然后点击编辑策略。如下截图。

替换策略中的AWS账号ID为控制方发起者的ID,并替换用户名user01为实际用户名。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::控制方AWS账号:user/user01"
            },
            "Action": "sts:AssumeRole",
            "Condition": {}
        }
    ]
}

保存退出。

3、控制发起方A账户的配置允许Assume操作

进入A账户的IAM控制台,找到控制方用户的user01,查看其Policy,并为这个user增加一段新的Policy。如下截图。

替换策略中的AWS账号ID为被控方的ID,替换角色为将要操作的角色。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "arn:aws:iam::被控方AWS账号:role/remote-viewer"
        }
    ]
}

保存退出。

4、AWS控制台切换操作用户

现在两端配置完毕。我们从A帐户的AWS控制台进入。点击右侧的用户名下的小箭头,可弹出菜单。点击最下方的Switch role按钮。如下截图。

输入要控制的B账户的AWS账户ID、IAM Role的名称,并可设置友好显示名称和标签颜色。如下截图。

切换成功,目前已经进入了B账号,并且是以特定Role身份执行。如果需要返回,可点击Switch back按钮返回。如下截图。

由此在AWS账号间切换成功。

三、在API/CLI上使用STS发起Assume Role获得临时密钥

上一个场景是基于AWS控制台的。下一个场景是在AWS API层面操作。假设上一步已经配置IAM信任策略完毕,这里不在介绍Policy写法。

1、AWSCLI调用STS

在A账号的user01所属的AKSK下,执行如下命令,其中的AWS账号是被控制账号的ID:

aws sts assume-role \
  --role-arn "arn:aws:iam::123456789012:role/remote-viewer" \
  --role-session-name "assume-role-test-2026-01"

返回结果如下:

{
    "Credentials": {
        "AccessKeyId": "xxxxxxxxxxxxx",
        "SecretAccessKey": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
        "SessionToken": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
        "Expiration": "2026-01-02T14:57:07+00:00"
    },
    "AssumedRoleUser": {
        "AssumedRoleId": "AROAUUCAEELBUXAZIGLPY:assume-role-test-2026-01",
        "Arn": "arn:aws:sts::123456789012:assumed-role/remote-viewer/assume-role-test-2026-01"
    }
}

接下来使用这个新Token,即可正确访问被控账号B账号的资源。

export AWS_ACCESS_KEY_ID="返回的AccessKeyId"
export AWS_SECRET_ACCESS_KEY="返回的SecretAccessKey"
export AWS_SESSION_TOKEN="返回的SessionToken"

现在执行aws s3 ls即可以B账号的remote-viewer的role身份查看B账号内的S3桶清单。

2、使用AWSCLI的Profile设置

为了简化配置,可将切换账号的操作写入AWSCLI,即可自动调用STS完成账号和Role的切换。

编辑配置文件 vi ~/.aws/config,确保有当前账号的default密钥的情况下,加入如下内容到末尾,其中的AWS账号是被控制账号的ID。

[default]
region = us-east-1
output = json

[profile cross-account]
role_arn = arn:aws:iam::123456789012:role/remote-viewer
source_profile = default
region = us-east-1

现在执行如下命令,即可看到实际执行的命令是来自B账户的:

aws s3 ls --profile cross-account

如果觉得每一条命令都输入--profile cross-account比较麻烦,那么还可以通过命令全局切换profile:

export AWS_PROFILE=cross-account

现在直接执行aws s3 ls命令,就已经是使用B账号身份操作了。

四、参考文档

https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_permissions-to-switch.html

https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_use-resources.html


最后修改于 2026-01-02