一、介绍
1、简介
AwsCredentialsProvider
是 AWS SDK 中用于提供 AWS 身份验证凭证的一个接口。AWS SDK 中涉及身份验证和授权的操作都需要用到凭证,而 AwsCredentialsProvider
作为一种抽象,负责提供这些凭证。AwsCredentialsProvider
在 Java SDK 中尤为重要,它可以用于各种场景,比如访问 AWS 服务、执行 AWS CLI 命令、部署到 AWS 上等。
2、作用
AwsCredentialsProvider
是 AWS SDK 中的一个接口,用于提供 AwsCredentials
(AWS 凭证),AwsCredentials
通常包含 AWS 的访问密钥 ID 和秘密访问密钥,可能还包括会话令牌(用于临时凭证)。
在 SDK 中使用凭证时,AwsCredentialsProvider
作为一个工厂接口负责提供合适的凭证。
3、好处
(1)灵活性:可以根据不同的运行环境自动选择不同的凭证提供方式,如在开发机器上使用本地文件,在 EC2 上使用实例元数据。
(2)安全性:通过使用 IAM 角色和 STS,临时凭证可以为应用程序提供更高的安全性,避免硬编码访问密钥。
(3)简化配置:AWS SDK 提供了多种方式来加载凭证,开发人员可以专注于业务逻辑,而无需关注如何管理凭证。
二、常见实现
AWS SDK 提供了一些常见的 AwsCredentialsProvider
实现方式,根据不同的场景自动选择合适的凭证提供方式:
1、DefaultCredentialsProvider
DefaultCredentialsProvider
是最常见的凭证提供器,它会按照以下顺序查找凭证:
- 环境变量:首先检查环境变量
AWS_ACCESS_KEY_ID
和AWS_SECRET_ACCESS_KEY
,如果存在,使用这些凭证。 - 系统属性:然后检查系统属性
aws.accessKeyId
和aws.secretKey
,如果存在,使用这些凭证。 - 默认配置文件:检查默认的配置文件(
~/.aws/credentials
)中的凭证。 - EC2 实例元数据服务:如果以上方式都没有找到凭证,
DefaultCredentialsProvider
会尝试从 EC2 实例元数据中获取临时凭证(适用于 EC2 实例)。 - ECS 环境:在 ECS 上运行时,它会尝试从 ECS 环境的凭证提供者中获取凭证。
2、ProfileCredentialsProvider
ProfileCredentialsProvider
从配置文件中的指定配置文件读取凭证。默认读取 ~/.aws/credentials
文件中的配置,支持多个配置文件和配置文件名称。
ProfileCredentialsProvider provider = new ProfileCredentialsProvider("my-profile");
AwsCredentials credentials = provider.resolveCredentials();
在实际开发中,AWS SDK 可以自动使用默认的 AwsCredentialsProvider
,也可以手动配置。
例如,当你创建 AWS 服务客户端时,你可以传入一个自定义的凭证提供器:
S3Client s3 = S3Client.builder()
.credentialsProvider(ProfileCredentialsProvider.create())
.region(Region.US_WEST_2)
.build();
3、EnvironmentVariableCredentialsProvider
此提供器从环境变量中读取 AWS 凭证。可以通过设置环境变量 AWS_ACCESS_KEY_ID
, AWS_SECRET_ACCESS_KEY
, 和 AWS_SESSION_TOKEN
来提供凭证。
AwsCredentialsProvider provider = EnvironmentVariableCredentialsProvider.create();
AwsCredentials credentials = provider.resolveCredentials();
4、SystemPropertyCredentialsProvider
此提供器从 JVM 系统属性中读取凭证。可以通过设置系统属性 aws.accessKeyId
和 aws.secretKey
来提供凭证。
AwsCredentialsProvider provider = SystemPropertyCredentialsProvider.create();
AwsCredentials credentials = provider.resolveCredentials();
5、EC2InstanceMetadataCredentialsProvider
此提供器专为 EC2 实例设计,它可以从 EC2 元数据服务中自动检索临时凭证。
AwsCredentialsProvider provider = EC2InstanceMetadataCredentialsProvider.create();
AwsCredentials credentials = provider.resolveCredentials();
6、STSAssumeRoleCredentialsProvider
如果你需要使用 AWS STS(Security Token Service)来假设一个角色,这个提供器非常有用。它会通过 STS 假设角色,并返回相应的临时凭证。
STSAssumeRoleCredentialsProvider assumeRoleProvider =
STSAssumeRoleCredentialsProvider.builder()
.stsClient(stsClient)
.roleArn("arn:aws:iam::123456789012:role/my-role")
.build();
AwsCredentials credentials = assumeRoleProvider.resolveCredentials();