使用C# SDK通过角色凭证调用EC2 API时验证失败求助
AWS跨账号角色访问EC2 API凭证验证失败排查
以下是针对问题的具体排查方向:
临时凭证完整性检查
确认tokenResult.Credentials包含完整的三个核心字段:AccessKeyId、SecretAccessKey和SessionToken。调用EC2 API时必须携带会话令牌(SessionToken),若该字段为空或未被正确传递,会直接触发凭证验证失败。建议在创建EC2客户端前打印这三个字段的值,确认无缺失。角色权限与区域匹配校验
检查子账号中EC2只读角色的权限策略:- 确保策略允许访问
eu-south-1区域的EC2资源,比如资源ARN包含该区域标识,或使用通配符*覆盖所有区域; - 确认子账号在
eu-south-1区域已开通EC2服务权限,即使无实例存在,DescribeInstances也应返回空列表而非凭证错误。
- 确保策略允许访问
角色信任关系复查
尽管AssumeRole调用成功,仍需核对子账号角色的信任策略:
确认策略中的Principal正确指向主账号的SDK访问账号,格式示例:"Principal": { "AWS": "arn:aws:iam::主账号ID:user/你的SDK访问账号" }避免账号ID或用户名拼写错误。
SDK版本兼容性验证
旧版本的AWS .NET SDK可能存在临时凭证传递的bug,建议将AWSSDK.EC2和AWSSDK.SecurityToken升级至最新稳定版本,确保会话令牌能被正确传递到EC2客户端。凭证时效性确认
你设置的临时凭证有效期为15分钟,需确认调用EC2 API时凭证未过期。若AssumeRole与EC2调用之间存在较长延迟,可缩短延迟或延长有效期(最大不超过1小时,除非角色配置了更长的允许时长)。
你的测试代码:
private static async Task Test() { //Assume credentials var tokenClient = new AmazonSecurityTokenServiceClient(masterKeyId, masterKeySecret); var tokenResult = await tokenClient.AssumeRoleAsync(new AssumeRoleRequest() { DurationSeconds = 60 * 15, RoleArn = "arn:aws:iam::522869052018:role/Accesso_API_EC2_da_account_sistemi", RoleSessionName = "TestSession" }); //Call EC2 API (this call raises exception) var ec2client = new Amazon.EC2.AmazonEC2Client(tokenResult.Credentials, RegionEndpoint.EUSouth1); var response = await ec2client.DescribeInstancesAsync(); }
内容的提问来源于stack exchange,提问作者Master_T
相关产品推荐
相关产品推荐

