GKE中Java应用调用AWS STS assumeRoleWithWebIdentity获取凭证失败
问题解决:GKE通过Workforce Identity Federation调用AWS Java SDK失败
错误根源
你遇到的凭证加载失败问题,核心原因是构建StsClient时未指定凭证提供者。默认情况下,Java SDK会尝试从系统属性、环境变量、凭证文件等默认链中加载AWS凭证,但你的场景是通过Google的Web身份令牌调用AssumeRoleWithWebIdentity接口——这个接口不需要预先提供AWS凭证,它是通过传入的Web令牌完成身份验证的。
修复方案
修改StsClient的构建逻辑,添加NoCredentialsProvider,同时修正代码中credentials()的调用错误:
import software.amazon.awssdk.auth.credentials.NoCredentialsProvider; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.sts.StsClient; import software.amazon.awssdk.services.sts.model.AssumeRoleWithWebIdentityRequest; import software.amazon.awssdk.services.sts.model.AssumeRoleWithWebIdentityResponse; // ... try (StsClient stsClient = StsClient.builder() .region(Region.of(appProperties.getAwsRegion())) .credentialsProvider(NoCredentialsProvider.create()) // 关键:指定无凭证提供者 .build()) { AssumeRoleWithWebIdentityRequest request = AssumeRoleWithWebIdentityRequest.builder() .roleArn(appProperties.getAwsGoogleRoleArn()) .roleSessionName(extractSub(idTokenFromMetadataServer)) .webIdentityToken(idTokenFromMetadataServer) .build(); AssumeRoleWithWebIdentityResponse response = stsClient.assumeRoleWithWebIdentity(request); String accessKey = response.credentials().accessKeyId(); // 修正为response.credentials() String secretKey = response.credentials().secretAccessKey(); }
补充说明
NoCredentialsProvider.create():告诉STS客户端不需要使用预先的AWS凭证,完全依赖传入的Web身份令牌完成AssumeRoleWithWebIdentity的身份验证。- 原代码中的
credentials()是笔误,必须通过response.credentials()获取返回的临时凭证。 - AWS CLI能成功的原因:CLI在调用
assume-role-with-web-identity时会自动跳过凭证加载流程,而Java SDK需要显式配置。
内容的提问来源于stack exchange,提问作者Genkus
相关产品推荐
相关产品推荐

