Java 在AWS上使用SDK凭证获取顺序

在AWS 环境上凭证获取

我们平常在AWS云上会部署Java服务,其中会使用Java服务操作AWS 资源,其中会涉及到Java使用AWS 凭证操作AWS资源,AWS默认提供了一系列的方式来获取AWS 凭证,下面是获取的一些顺序。

DefaultCredentialsProvider 是什么

DefaultCredentialsProvider 是 AWS SDK for Java 提供的一个默认凭证提供链(Default Credential Provider Chain)。它的作用是为应用程序自动检索 AWS 凭证,而无需手动指定凭证。这种机制使得应用程序能够在不同环境下(如本地开发环境、EC2 实例、ECS 任务等)无缝切换。

DefaultCredentialsProvider 的凭证查找顺序

DefaultCredentialsProvider 按以下优先级顺序查找 AWS 凭证:

  1. 环境变量

    • 检查以下环境变量是否存在:
      • AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY
      • (可选)AWS_SESSION_TOKEN(如果使用临时凭证)
    • 如果环境变量中存在这些凭证,则直接使用。
  2. Java 系统属性

    • 检查以下 Java 系统属性:

      • aws.accessKeyIdaws.secretKey
      • (可选)aws.sessionToken
    • 这些属性可以通过 JVM 参数设置,例如:

      java -Daws.accessKeyId=yourAccessKeyId -Daws.secretKey=yourSecretKey YourApp

  3. 默认配置文件

    • 检查本地 AWS 配置文件(~/.aws/credentials~/.aws/config)。
    • 默认使用 default 配置文件中的凭证。
    • 示例文件内容:
    • [default] aws_access_key_id = yourAccessKeyId aws_secret_access_key = yourSecretKey
  4. ECS 容器凭证

如果应用运行在 ECS 容器中,DefaultCredentialsProvider 会从 ECS 容器元数据服务(169.254.170.2)中获取临时凭证。

这需要在 ECS 任务中配置 IAM 角色。

  1. EC2 实例元数据服务

​ 如果应用运行在 EC2 实例中,DefaultCredentialsProvider 会尝试从实例元数据服务(169.254.169.254)中获取临时凭证。这需要为 EC2 实例配置 IAM 角色。

  1. 自定义凭证提供链

​ 如果以上来源都没有找到凭证,可以使用自定义的凭证提供器。

使用 AWS SDK 自动获取临时凭证

java 复制代码
import software.amazon.awssdk.auth.credentials.AwsCredentials;
import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider;

public class DebugCredentials {
    public static void main(String[] args) {
        // 使用 DefaultCredentialsProvider
        DefaultCredentialsProvider provider = DefaultCredentialsProvider.create();

        // 获取当前凭证
        AwsCredentials credentials = provider.resolveCredentials();

        // 打印凭证信息
        System.out.println("Access Key: " + credentials.accessKeyId());
        System.out.println("Secret Key: " + credentials.secretAccessKey());
        // 检查是否包含 Session Token(临时凭证)
        if (credentials instanceof AwsSessionCredentials) {
            AwsSessionCredentials sessionCredentials = (AwsSessionCredentials) credentials;
            System.out.println("Session Token: " + sessionCredentials.sessionToken());
        } else {
            System.out.println("No Session Token available.");
        }
    }
}

注意事项

  1. 临时凭证的有效期
    • ECS 提供的临时凭证通常有效期为 6 小时。
    • AWS SDK 会自动刷新临时凭证,无需手动处理。
  2. 权限范围
    • 确保 IAM 角色的权限策略足够精确,只授予应用程序需要的最小权限。
  3. 网络配置
    • 确保 ECS 容器可以访问 169.254.170.2 元数据服务(通常无需额外配置)。
相关推荐
MSTcheng.10 小时前
【C++】C++异常
java·数据库·c++·异常
大模型玩家七七11 小时前
基于语义切分 vs 基于结构切分的实际差异
java·开发语言·数据库·安全·batch
寻星探路16 小时前
【深度长文】万字攻克网络原理:从 HTTP 报文解构到 HTTPS 终极加密逻辑
java·开发语言·网络·python·http·ai·https
曹牧19 小时前
Spring Boot:如何测试Java Controller中的POST请求?
java·开发语言
AI_567819 小时前
AWS EC2新手入门:6步带你从零启动实例
大数据·数据库·人工智能·机器学习·aws
爬山算法19 小时前
Hibernate(90)如何在故障注入测试中使用Hibernate?
java·后端·hibernate
kfyty72520 小时前
集成 spring-ai 2.x 实践中遇到的一些问题及解决方案
java·人工智能·spring-ai
猫头虎20 小时前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
李少兄20 小时前
在 IntelliJ IDEA 中修改 Git 远程仓库地址
java·git·intellij-idea