使用boto3跨账号创建IAM角色时AssumeRolePolicy格式错误排查
问题原因及解决方案
错误根源
你编写的AssumeRolePolicyDocument是角色信任策略,它的唯一作用是指定哪些实体(AWS账号、IAM用户、AWS服务等)被允许扮演该角色,和定义角色权限的普通IAM策略完全是两类文档:
- 信任策略禁止包含
Resource字段,这个字段仅用于权限策略(定义角色能操作哪些资源),信任策略只关注"谁能使用这个角色",不涉及资源范围。 - 信任策略的
Action只能是sts:AssumeRole,你添加的ec2:Describe*、iam:ListRoles属于角色的权限内容,应该放在后续给角色附加的权限策略中,而非信任策略里。
修正后的信任策略示例
如果要允许指定AWS账号下的实体扮演这个角色,正确的信任策略结构如下:
assume_role_policy = { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:root" # 替换为你允许的账号ARN或特定IAM实体ARN }, "Action": "sts:AssumeRole" } ] }
如果需要允许AWS服务(比如EC2)扮演该角色,Principal可以写成:
"Principal": { "Service": "ec2.amazonaws.com" }
补充说明
你原本想赋予角色的ec2:Describe*、iam:ListRoles这类权限,需要通过client.put_role_policy()创建内联策略,或者先创建独立IAM策略再用client.attach_role_policy()附加到角色上,不能写在信任策略里。
内容的提问来源于stack exchange,提问作者Mitchell Privett
相关产品推荐
相关产品推荐

