AWS InstanceProfileCredentialsProvider-凭证来自哪里?

时间:2020-06-06 01:04:45

标签: java amazon-web-services credentials

在我们的应用程序中,我们使用InstanceProfileCredentialsProvider访问Amazon S3存储桶,但在某些环境中,凭证被弄乱了。

AWS文档(https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/java-dg-roles.html)内容如下:

如果您的应用程序使用默认构造函数创建一个AWS客户端,则该客户端将使用以下默认凭证提供者链搜索凭证:

  1. 在Java系统属性中:aws.accessKeyId和aws.secretKey。
  2. 在系统环境变量中:AWS_ACCESS_KEY_ID和 AWS_SECRET_ACCESS_KEY。
  3. 在默认凭据文件中(位置 文件的版本因平台而异。
  4. 通过 Amazon EC2容器服务,如果 设置了AWS_CONTAINER_CREDENTIALS_RELATIVE_URI环境变量 并且安全经理有权访问该变量。
  5. 在实例配置文件中的凭据(存在于实例中) 与EC2实例的IAM角色相关联的元数据。
  6. 环境或容器中的Web身份令牌凭证。

是否有办法知道InstanceProfileCredentialsProvider具体在哪里获取凭据?从其源代码的角度来看,它相当谨慎,通过API或日志记录都没有太多细节。

1 个答案:

答案 0 :(得分:1)

InstanceProfileCredentialsProvider从EC2实例元数据服务获取凭据。如果启用了元数据端点,则API服务将在EC2实例上连续运行。

API端点-http://169.254.169.254/latest/meta-data/latest/meta-data/iam/security-credentials/

https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/index.html?com/amazonaws/auth/InstanceProfileCredentialsProvider.html

在上述情况下,您的运行Java代码的EC2实例应具有与该I2实例关联的IAM角色,该EC2实例可以访问S3资源。

InstanceProfileCredentialsProvider很可能正在使用EC2MetadataClient.java

https://github.com/aws/aws-sdk-java/blob/7b1e5b87b0bf03456df9e77716b14731adf9a7a7/aws-java-sdk-core/src/main/java/com/amazonaws/internal/EC2MetadataClient.java