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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 12:43:08