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 凭证:
-
环境变量
- 检查以下环境变量是否存在:
AWS_ACCESS_KEY_ID
和AWS_SECRET_ACCESS_KEY
- (可选)
AWS_SESSION_TOKEN
(如果使用临时凭证)
- 如果环境变量中存在这些凭证,则直接使用。
- 检查以下环境变量是否存在:
-
Java 系统属性
-
检查以下 Java 系统属性:
aws.accessKeyId
和aws.secretKey
- (可选)
aws.sessionToken
-
这些属性可以通过 JVM 参数设置,例如:
java -Daws.accessKeyId=yourAccessKeyId -Daws.secretKey=yourSecretKey YourApp
-
-
默认配置文件
- 检查本地 AWS 配置文件(
~/.aws/credentials
和~/.aws/config
)。 - 默认使用
default
配置文件中的凭证。 - 示例文件内容:
[default] aws_access_key_id = yourAccessKeyId aws_secret_access_key = yourSecretKey
- 检查本地 AWS 配置文件(
-
ECS 容器凭证
如果应用运行在 ECS 容器中,DefaultCredentialsProvider
会从 ECS 容器元数据服务(169.254.170.2)中获取临时凭证。
这需要在 ECS 任务中配置 IAM 角色。
- EC2 实例元数据服务
如果应用运行在 EC2 实例中,DefaultCredentialsProvider
会尝试从实例元数据服务(169.254.169.254)中获取临时凭证。这需要为 EC2 实例配置 IAM 角色。
- 自定义凭证提供链
如果以上来源都没有找到凭证,可以使用自定义的凭证提供器。
使用 AWS SDK 自动获取临时凭证
import software.amazon.awssdk.auth.credentials.AwsCredentials;
import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider;public class DebugCredentials {public static void main(String[] args) {// 使用 DefaultCredentialsProviderDefaultCredentialsProvider 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.");}}
}
注意事项
- 临时凭证的有效期:
- ECS 提供的临时凭证通常有效期为 6 小时。
- AWS SDK 会自动刷新临时凭证,无需手动处理。
- 权限范围:
- 确保 IAM 角色的权限策略足够精确,只授予应用程序需要的最小权限。
- 网络配置:
- 确保 ECS 容器可以访问 169.254.170.2 元数据服务(通常无需额外配置)。