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
相关产品推荐
相关产品推荐

