EC2实例调用Boto3 assume_role遇AccessDenied(已配置服务主体)
问题分析与解决方案
核心问题
你在已经附加了目标IAM角色的EC2实例上,尝试调用sts:AssumeRole来获取该角色本身的权限,这是冗余操作,也是触发权限错误的根本原因。
错误原因解释
你的IAM角色信任策略仅允许ec2.amazonaws.com服务主体调用sts:AssumeRole——这个策略的作用是让EC2服务为你的实例首次获取该角色的权限。当实例启动后,代码运行时的身份是arn:aws:sts::<account_number>:assumed-role/<role_name>/i-<instance_id>(已经通过EC2服务完成角色假设的实体),这个身份不在信任策略的允许范围内,因此被拒绝执行sts:AssumeRole。
解决方案
方案1:直接使用实例角色权限(推荐)
EC2实例附加IAM角色后,会自动获取该角色的临时凭证,无需额外调用assume_role。直接通过Boto3创建客户端即可使用S3权限:
import boto3 # 直接利用实例角色权限创建S3客户端 s3_client = boto3.client("s3") # 示例:列出所有S3桶 response = s3_client.list_buckets() print("Buckets:", [bucket["Name"] for bucket in response["Buckets"]])
方案2:若确实需要调用AssumeRole(特殊场景)
如果你是要切换到另一个IAM角色(而非当前实例已有的角色),需要修改目标角色的信任策略,允许当前实例角色的ARN执行sts:AssumeRole。比如在目标角色的信任策略中添加以下语句:
{ "Version": "2012-10-17", "Statement": [ // 保留原有的EC2服务信任规则 { "Effect": "Allow", "Principal": { "Service": "ec2.amazonaws.com" }, "Action": "sts:AssumeRole" }, // 添加允许当前实例角色调用AssumeRole的规则 { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::<account_number>:role/<role_name>" }, "Action": "sts:AssumeRole" } ] }
注意:除非有跨角色访问的明确需求,否则不要使用此方案——当前实例已经拥有目标角色的权限,重复调用assume_role毫无必要。
内容的提问来源于stack exchange,提问作者barneyAgumble
相关产品推荐
相关产品推荐

