在我们的应用程序中,我们使用InstanceProfileCredentialsProvider访问Amazon S3存储桶,但在某些环境中,凭证被弄乱了。
AWS文档(https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/java-dg-roles.html)内容如下:
如果您的应用程序使用默认构造函数创建一个AWS客户端,则该客户端将使用以下默认凭证提供者链搜索凭证:
- 在Java系统属性中:aws.accessKeyId和aws.secretKey。
- 在系统环境变量中:AWS_ACCESS_KEY_ID和 AWS_SECRET_ACCESS_KEY。
- 在默认凭据文件中(位置 文件的版本因平台而异。
- 通过 Amazon EC2容器服务,如果 设置了AWS_CONTAINER_CREDENTIALS_RELATIVE_URI环境变量 并且安全经理有权访问该变量。
- 在实例配置文件中的凭据(存在于实例中) 与EC2实例的IAM角色相关联的元数据。
- 环境或容器中的Web身份令牌凭证。
是否有办法知道InstanceProfileCredentialsProvider具体在哪里获取凭据?从其源代码的角度来看,它相当谨慎,通过API或日志记录都没有太多细节。
答案 0 :(得分:1)
InstanceProfileCredentialsProvider从EC2实例元数据服务获取凭据。如果启用了元数据端点,则API服务将在EC2实例上连续运行。
API端点-http://169.254.169.254/latest/meta-data/latest/meta-data/iam/security-credentials/
在上述情况下,您的运行Java代码的EC2实例应具有与该I2实例关联的IAM角色,该EC2实例可以访问S3资源。
InstanceProfileCredentialsProvider很可能正在使用EC2MetadataClient.java