amazon-web-services - Spring Boot应用程序无法从任何凭证链中找到aws凭证

标签 amazon-web-services spring-boot kubernetes microservices amazon-eks

我正在尝试将多个 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。

以下是该问题的主要内容:

  1. 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/

相关文章:

node.js - 从 AWS Lambda Node.JS 流式传输并压缩到 S3

java - 在后端(java spring boot)排序中,如何使用可分页的别名进行排序?没有父表作为前缀

java - Spring Boot 无法解析 Linux 上的占位符,但在 Eclipse 上工作正常

nginx - kubernetes:nginx入口vs traefik入口vs ha-proxy入口vs kong入口

ssl - kubectl 在 Linux 上回复连接被拒绝,而在另一台机器(Mac)上回复正常

docker - 库伯内特斯问题。配置文件。

php - 如何在 Yii 中安装 AWS SDK

amazon-web-services - 保护 AWS API 网关

java - 如何创建将添加新属性源的自定义注释

amazon-web-services - DynamoDB Friends 设计