我正在尝试将多个 Spring Boot 服务迁移到 EKS,但它们无法从凭证链中检索 aws 凭证,并且 Pod 失败并出现以下错误:无法从链 AwsCredentialsProviderChain 中的任何提供程序加载凭证
这些是我迄今为止尝试过的:
我正在使用Web identity token from AWS STS用于凭证检索。
@Bean
public AWSCredentialsProvider awsCredentialsProvider() {
if (System.getenv("AWS_WEB_IDENTITY_TOKEN_FILE") != null) {
return WebIdentityTokenCredentialsProvider.builder().build();
}
return new DefaultAWSCredentialsProviderChain();
}
@Bean
public SqsClient sqsClient(AWSCredentialsProvider awsCredentialsProvider) {
return SqsClient
.builder()
.credentialsProvider(() -> (AwsCredentials) awsCredentialsProvider.getCredentials())
.region(Region.EU_WEST_1).build();
}
@Bean
public SnsClient snsClient(AWSCredentialsProvider awsCredentialsProvider) {
return SnsClient
.builder()
.credentialsProvider(() -> (AwsCredentials) awsCredentialsProvider.getCredentials())
.region(Region.EU_WEST_1).build();
}
这些服务还打包了 aws-java-sdk-sts
maven 依赖项。
服务的 IAM 角色也很好,并且在每个 Jenkins 基于 K8s list 文件构建后,AWS_WEB_IDENTITY_TOKEN_FILE
也会在 pod 中自动创建。
从 pod 中,我可以毫无问题地向 SNS 和 SQS 发出 GET 和 POST 请求。
最佳答案
问题已解决。
主要问题是 AWS 开发工具包 BOM 版本与各个型号冲突。另外,我使用的以前版本的 BOM 不支持 AWS SDK v2.x。
以下是该问题的主要内容:
AWS SDK 使用 credentials provider chain 对服务进行身份验证。 default credential provider AWS SDK for Java 2.x 的链使用预定义的序列在您的环境中搜索凭证。
1.1 自 AWS SDK for Java 2.x 起来自 AWS STS 的 Web 身份 token 位于默认提供商链内。
1.2 只要使用 v2 的 SDK 并具有 STS 依赖,就无需显式配置 Web 身份 token 。
1.3 确保候选服务使用 AWS SDK v2,因为它会将配置代码减少到最少。
如果使用 AWS SDK v1 的候选服务应添加以下配置,因为 Web 身份 token 不在 v1 的默认提供商链中。
@Bean
public AWSCredentialsProvider awsCredentialsProvider() {
if (System.getenv("AWS_WEB_IDENTITY_TOKEN_FILE") != null) {
return WebIdentityTokenCredentialsProvider.builder().build();
}
return new DefaultAWSCredentialsProviderChain();
}
最后但并非最不重要的一点是尝试使用尝试使用最新的 AWS SDK BOM依赖性。 (currently all modules have the same version, but this may not always be the case)
关于amazon-web-services - Spring Boot应用程序无法从任何凭证链中找到aws凭证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73014793/