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 元数据服务(通常无需额外配置)。
相关推荐
浮尘笔记2 小时前
Java Snowy框架CI/CD云效自动化部署流程
java·运维·服务器·阿里云·ci/cd·自动化
一直不明飞行9 小时前
Java的equals(),hashCode()应该在什么时候重写
java·开发语言·jvm
REDcker9 小时前
有限状态机与状态模式详解 FSM建模Java状态模式与C++表驱动模板实践
java·c++·状态模式
你的保护色9 小时前
【无标题】
java·服务器·网络
basketball61610 小时前
C++ 构造函数完全指南:从入门到进阶
java·开发语言·c++
淘矿人10 小时前
Claude辅助DevOps实践
java·大数据·运维·人工智能·算法·bug·devops
小江的记录本10 小时前
【Java基础】泛型:泛型擦除、通配符、上下界限定(附《思维导图》+《面试高频考点清单》)
java·数据结构·后端·mysql·spring·面试·职场和发展
来恩100311 小时前
请求转发与响应重定向的使用
java
@杰克成11 小时前
Java学习30
java·开发语言·学习
次元工程师!11 小时前
LangFlow开发(三)—Bundles组件架构设计(3W+字详细讲解)
java·前端·python·低代码·langflow