You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 08:10:22