可通过AWS控制台切换角色,却无法通过CLI执行的问题求助
问题描述
我有一个包含users(账号ID:111111111111)和dev(账号ID:222222222222)账号的AWS组织,流程要求先登录users账号,再切换到dev账号。现在遇到的问题是:能通过AWS控制台切换角色,但无法通过CLI执行切换。
使用的CLI切换命令
export $(printf "AWS_ACCESS_KEY_ID=%s AWS_SECRET_ACCESS_KEY=%s AWS_SESSION_TOKEN=%s" \ $(aws sts assume-role \ --role-arn arn:aws:iam::222222222222:role/administrator \ --role-session-name TestSessionName \ --query "Credentials.[AccessKeyId,SecretAccessKey,SessionToken]" \ --output text))
执行后收到的错误
An error occurred (AccessDenied) when calling the AssumeRole operation: User: arn:aws:iam::111111111111:user/gitlab-ci-user is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::222222222222:role/administrator
已确认的CLI登录用户信息
> aws sts get-caller-identity { "UserId": "...", "Account": "111111111111", "Arn": "arn:aws:iam::111111111111:user/gitlab-ci-user" }
用户所属组的权限策略
用户gitlab-ci-user属于AdminsDevAssumeRole组,该组的权限策略如下:
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Resource": [ "arn:aws:iam::222222222222:role/administrator" ] } ], "Version": "2012-10-17" }
dev账号中角色的信任关系配置
在dev账号(222222222222)里,administrator角色的信任关系配置如下:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111111111111:root" }, "Action": "sts:AssumeRole", "Condition": { "Bool": { "aws:MultiFactorAuthPresent": "false" } } } ] }
请问为何无法通过CLI切换角色,但控制台可以?
问题原因与解决方案
核心原因
AWS控制台切换角色时,会以users账号的root身份发起角色切换请求,而你的dev账号administrator角色信任关系里只允许了arn:aws:iam::111111111111:root作为可信实体,所以控制台能成功。
但CLI执行sts:AssumeRole时,是以具体的IAM用户gitlab-ci-user身份发起请求,这个用户不在dev角色的信任列表里,因此被拒绝。
解决方案
修改dev账号中administrator角色的信任关系,将gitlab-ci-user或者其所属的AdminsDevAssumeRole组添加到可信实体中:
方案1:允许特定IAM用户
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::111111111111:root", "arn:aws:iam::111111111111:user/gitlab-ci-user" ] }, "Action": "sts:AssumeRole", "Condition": { "Bool": { "aws:MultiFactorAuthPresent": "false" } } } ] }
方案2:允许整个用户组
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::111111111111:root", "arn:aws:iam::111111111111:group/AdminsDevAssumeRole" ] }, "Action": "sts:AssumeRole", "Condition": { "Bool": { "aws:MultiFactorAuthPresent": "false" } } } ] }
方案3:允许users账号下所有IAM实体(适合组织内场景)
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111111111111:root" }, "Action": "sts:AssumeRole", "Condition": [ { "Bool": { "aws:MultiFactorAuthPresent": "false" } }, { "StringLike": { "aws:PrincipalArn": "arn:aws:iam::111111111111:*" } } ] } ] }
修改完成后,重新执行CLI的sts assume-role命令即可正常切换角色。
内容的提问来源于stack exchange,提问作者Yagel
相关产品推荐
相关产品推荐

