Spring 启动应用程序无法从任何凭证链中找到 AWS 凭证



我正试图将几个春季启动服务迁移到EKS,他们无法从凭据链中检索aws凭据,并且pod失败,出现以下错误:Unable to load credentials from any of the providers in the chain AwsCredentialsProviderChain

这些是我目前为止尝试过的:

我正在使用AWS STS的Web身份令牌进行凭证检索。

@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-stsmaven依赖项。

服务的IAM角色也很好,AWS_WEB_IDENTITY_TOKEN_FILE是在每次Jenkins基于K8s manifest文件构建后自动创建的。

从pod中,我可以对SNS和SQS进行GET和POST请求,没有任何问题。

问题已修复。

主要问题是AWS SDK BOM版本与单个模型相冲突。另外,我之前使用的BOM版本不支持AWS SDK v2。x。

这些是这个问题的主要结论:

  1. AWS SDK使用凭证提供程序链验证服务。用于Java 2的AWS SDK的默认凭证提供程序链。X使用预定义的序列在您的环境中搜索凭据。

    1.1作为AWS SDK for Java 2。来自AWS STS的Web身份令牌在默认提供者链中。

    1.2只要使用SDK的v2版本并具有STS依赖,就可以使Web身份令牌的显式配置冗余。

    1.3确保候选服务使用AWS SDK v2,因为它可以将配置代码减少到最小。

如果使用AWS SDK v1的候选服务应该添加以下配置,因为Web身份令牌不在v1的默认提供者链中。

@Bean
public AWSCredentialsProvider awsCredentialsProvider() {
if (System.getenv("AWS_WEB_IDENTITY_TOKEN_FILE") != null) {
return WebIdentityTokenCredentialsProvider.builder().build();
}    
return new DefaultAWSCredentialsProviderChain();
}

最后但并非最不重要的尝试使用尝试使用最新的AWS SDK BOM依赖。(目前所有模块都有相同的版本,但可能并不总是如此)

您应该在身份令牌信用提供程序构建中包含roleArn, sessionname和令牌详细信息。

试试这个

return  WebIdentityTokenCredentialsProvider.builder()
.roleArn(System.getenv("AWS_ROLE_ARN"))
.roleSessionName(System.getenv("AWS_ROLE_SESSION_NAME"))
.webIdentityTokenFile(System.getenv("AWS_WEB_IDENTITY_TOKEN_FILE"))
.build();

而不返回return WebIdentityTokenCredentialsProvider.builder().build();

您可以尝试创建文件:

  • 窗口:C: 用户【用户名】.aws 配置
  • Mac://【用户名】/.aws/用户配置
  • Linux/home/[用户名):/.aws/配置

并向其添加AWS凭据。例:

[default]
aws_access_key_id = key_value
aws_secret_access_key = secret_value

最新更新