AWS IAM跨账号角色切换失败:Boto3调用AssumeRole遭权限拒绝
问题分析与解决方案
核心问题
你的猜测方向没错,但本质不是身份显示格式的问题,而是账号B的target_role信任策略未正确匹配当前身份上下文。Pod通过OIDC获取worker_role后,实际使用的是该角色的临时会话身份(即arn:aws:sts::accountA:assumed-role/worker_role/xxx),虽然信任策略里指定了worker_role的ARN,但仍出现权限拒绝,大概率是以下原因导致:
可能的原因及修复方案
1. 账号B的信任策略存在语法错误
你提供的信任策略片段缺少闭合括号和Version字段,完整的合法信任策略应该是这样:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::accountA:role/worker_role" }, "Action": "sts:AssumeRole" } ] }
如果策略结构不完整(比如未闭合的JSON括号、缺少必填的Version),AWS无法正确解析,直接导致权限拒绝。
2. 账号A的worker_role缺少AssumeRole权限
Pod已经获取到worker_role的身份,但该角色本身需要被允许调用sts:AssumeRole去访问账号B的target_role。需要在账号A的worker_role的权限策略(注意不是信任关系)中添加以下语句:
{ "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::accountB:role/target_role" }
这里要区分清楚:信任关系是控制谁能扮演该角色,而权限策略是控制该角色能执行哪些操作,不要搞混。
3. 精准匹配临时会话身份(可选方案)
如果前两个方案无效,可以尝试在账号B的信任策略中,直接匹配临时会话身份的ARN前缀,或者通过条件验证源角色:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "sts:AssumeRole", "Condition": { "StringLike": { "aws:PrincipalArn": "arn:aws:sts::accountA:assumed-role/worker_role/*" } } } ] }
或者更精准地匹配源角色ARN:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "aws:SourceArn": "arn:aws:iam::accountA:role/worker_role" } } } ] }
验证步骤
- 在Pod内执行
aws sts get-caller-identity,确认当前身份确实是arn:aws:sts::accountA:assumed-role/worker_role/xxx格式 - 检查账号B的
target_role信任策略,确保JSON格式完全合法,没有语法错误 - 检查账号A的
worker_role权限策略,确认包含对arn:aws:iam::accountB:role/target_role的sts:AssumeRole权限
内容的提问来源于stack exchange,提问作者user3066571
相关产品推荐
相关产品推荐

