我正试图将几个春季启动服务迁移到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-sts
maven依赖项。
服务的IAM角色也很好,AWS_WEB_IDENTITY_TOKEN_FILE
是在每次Jenkins基于K8s manifest文件构建后自动创建的。
从pod中,我可以对SNS和SQS进行GET和POST请求,没有任何问题。
问题已修复。
主要问题是AWS SDK BOM版本与单个模型相冲突。另外,我之前使用的BOM版本不支持AWS SDK v2。x。
这些是这个问题的主要结论:
-
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