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

AWS .NET SDK中EC2实例通过IAM角色获取临时凭证报错

问题分析与解决

错误原因

EC2实例绑定的IAM角色提供的是临时会话凭证,而STS的GetSessionToken API仅允许使用IAM用户的长期访问凭证(Access Key ID/Secret Access Key)调用,不能用会话凭证发起请求,这就是报错Cannot call GetSessionToken with session credentials的根本原因。

注:你提到创建new AmazonS3Client(region)能正常工作,是因为AWS SDK for .NET会自动从实例元数据服务获取角色的临时凭证,无需手动调用STS接口。

解决方案

根据需求选择对应方案:

方案1:直接使用EC2实例角色的临时凭证

如果只是需要使用当前EC2实例角色的权限,无需手动获取凭证,SDK会自动从实例元数据服务加载凭证,直接初始化客户端即可:

// SDK自动处理凭证加载,无需手动获取
using var s3Client = new AmazonS3Client(RegionEndpoint.YourRegion);
// 后续正常调用服务接口即可

方案2:通过AssumeRole获取另一角色的临时凭证

如果需要获取另一个IAM角色的临时凭证(跨角色访问),请使用STS的AssumeRole API替代GetSessionToken,示例代码如下:

using var stsClient = new AmazonSecurityTokenServiceClient(RegionEndpoint.YourRegion);
var assumeRoleRequest = new AssumeRoleRequest
{
    RoleArn = "arn:aws:iam::123456789012:role/YourTargetRole", // 目标角色的ARN
    RoleSessionName = "EC2InstanceSession", // 自定义会话名称
    DurationSeconds = 3600
};

var assumeRoleResponse = await stsClient.AssumeRoleAsync(assumeRoleRequest);
Credentials credentials = assumeRoleResponse.Credentials;

// 使用获取到的凭证初始化目标服务客户端
using var targetClient = new AmazonS3Client(credentials, RegionEndpoint.YourRegion);

关键说明

  • GetSessionToken:仅用于IAM用户将自身长期凭证转换为临时凭证,不支持角色会话凭证调用。
  • AssumeRole:用于获取指定IAM角色的临时凭证,支持用当前角色的会话凭证发起调用,是跨角色访问的标准方式。

内容的提问来源于stack exchange,提问作者RaGib Noor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 14:42:41