我知道现在可能有点晚了,但希望这会对像我一样甚至在2020年来到这里的其他人有所帮助 :)
根据您的代码示例,您应该尝试这个
AWSSimpleSystemsManagement ssm =
AWSSimpleSystemsManagementClientBuilder
.standard()
.withRegion(region)
.withCredentials(new EC2ContainerCredentialsProviderWrapper())
.build();
EC2ContainerCredentialsProviderWrapper 实现了 AWSCredentialsProvider 接口,并从 Amazon 容器(如 EC2)凭证中加载凭证,按以下顺序解决它们:
- 如果设置环境变量“AWS_CONTAINER_CREDENTIALS_RELATIVE_URI”(通常在 EC2 上),则用它来访问元数据服务,在以下端点处: http://169.254.170.2
- 如果设置了环境变量“AWS_CONTAINER_CREDENTIALS_FULL_URI”,则使用该 URI 访问元数据服务。可以通过设置“AWS_CONTAINER_AUTHORIZATION_TOKEN”环境变量将授权令牌包含在请求的“Authorization”头部中。
- 如果未指定上述任何环境变量,将尝试使用 InstanceProfileCredentialsProvider 从 Amazon EC2 实例元数据服务加载凭证。
这类似于废弃的 ContainerCredentialsProvider() :
默认情况下,URI 路径从容器环境中的环境变量“AWS_CONTAINER_CREDENTIALS_RELATIVE_URI”中检索。
更新:如果您不确定会使用哪种机制或想与环境变量、系统属性、配置文件凭证和容器凭证兼容,您可以使用 DefaultAWSCredentialsProviderChain
,它将确保尝试所有选项(如 @Imran 在评论中指出的):
AWSSimpleSystemsManagement ssm =
AWSSimpleSystemsManagementClientBuilder
.standard()
.withRegion(region)
.withCredentials(new DefaultAWSCredentialsProviderChain())
.build();
例如,1.11 SDK 的实现看起来像这样(基本上会尝试所有选项,直到找到一个可用的):
例如,1.11 SDK 的实现看起来像这样(基本上会尝试所有选项,直到找到一个可用的):
public DefaultAWSCredentialsProviderChain() {
super(new EnvironmentVariableCredentialsProvider(),
new SystemPropertiesCredentialsProvider(),
new ProfileCredentialsProvider(),
new EC2ContainerCredentialsProviderWrapper());
}
这样做可以让您与可能引入另一种身份验证类型或者某个选项过时的新版本兼容。
DefaultAWSCredentialsProviderChain
来确保可以利用分配给您的容器角色?https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/DefaultAWSCredentialsProviderChain.html - Imran