使用Boto3调用STS扮演角色时遭遇访问拒绝错误求助
问题分析与解决方法
你遇到的问题是AWS控制台能手动扮演角色,但通过Boto3调用sts:AssumeRole时返回Access denied,且Lambda和本地环境都出现相同错误,可从以下几个方向排查:
确认调用方身份的权限与信任关系
控制台扮演角色时使用的是你的IAM用户会话,而Boto3调用依赖的是本地凭证(~/.aws/credentials)或Lambda执行角色,这两个身份需要同时满足:- 自身权限策略包含
sts:AssumeRole操作,且资源指定为目标角色的ARN; - 被目标角色的信任策略允许(信任策略中需包含该身份的ARN)。
- 自身权限策略包含
检查目标角色的信任策略限制
有些角色的信任策略会添加额外条件(如aws:SourceIp、aws:PrincipalTag),或者仅允许通过SAML/Web Identity等方式扮演,这类限制会阻止直接通过IAM用户/角色调用sts:AssumeRole。你需要修改目标角色的信任策略,确保包含调用方身份,示例策略如下:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::你的账号ID:user/本地用户ARN" // 替换为Lambda执行角色ARN或本地用户ARN }, "Action": "sts:AssumeRole" } ] }排查权限边界与SCP限制
如果调用方是IAM用户/角色,需检查是否存在权限边界(Permission Boundary)限制了sts:AssumeRole操作;如果你的账号属于AWS组织,还要确认组织级别的服务控制策略(SCP)没有拒绝该操作。验证角色ARN的准确性
确认代码中aws_src_role_arn的拼写、账号ID、角色名完全正确,避免因ARN错误导致权限验证失败。测试简化的会话名称
RoleSessionName需符合2-64字符、仅含字母/数字/连字符/下划线/点号/@的要求,可尝试使用更简单的名称(如TestSession)测试是否因格式问题报错。
你的调用代码示例:
sts_client = boto3.client('sts') assumed_role = sts_client.assume_role( RoleArn=aws_src_role_arn, RoleSessionName='AssumeRoleSession')
内容的提问来源于stack exchange,提问作者Avani Shroff
相关产品推荐
相关产品推荐

