如何使用AWS Java SDK设置AWS容器凭证

10

我想使用ContainerCredentialsProvider(CredentialsEndpointProvider)代替ContainerCredentialsProvider(),因为后者已经被弃用。

目前我正在使用如下的过时构造函数ContainerCredentialsProvider():

AWSSimpleSystemsManagement ssm = 
    AWSSimpleSystemsManagementClientBuilder
        .standard()
        .withRegion(region)
        .withCredentials(new ContainerCredentialsProvider())
        .build();

CredentialsEndpointProvider 是一个抽象类。我需要在我的 Docker 中使用像 ECSCredentialsEndPointProvider 这样的东西,但我不确定该如何做。任何帮助都将不胜感激。


2
为什么不能使用 DefaultAWSCredentialsProviderChain 来确保可以利用分配给您的容器角色?https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/DefaultAWSCredentialsProviderChain.html - Imran
为什么你需要这样做?难道你没有集群角色吗? - neocorp
2
它可能有助于调试,例如...您的反问绝对没有帮助。 - trudolf
2个回答

11

我知道现在可能有点晚了,但希望这会对像我一样甚至在2020年来到这里的其他人有所帮助 :)

根据您的代码示例,您应该尝试这个

AWSSimpleSystemsManagement ssm = 
    AWSSimpleSystemsManagementClientBuilder
        .standard()
        .withRegion(region)
        .withCredentials(new EC2ContainerCredentialsProviderWrapper())
        .build();

EC2ContainerCredentialsProviderWrapper 实现了 AWSCredentialsProvider 接口,并从 Amazon 容器(如 EC2)凭证中加载凭证,按以下顺序解决它们:

  1. 如果设置环境变量“AWS_CONTAINER_CREDENTIALS_RELATIVE_URI”(通常在 EC2 上),则用它来访问元数据服务,在以下端点处: http://169.254.170.2
  2. 如果设置了环境变量“AWS_CONTAINER_CREDENTIALS_FULL_URI”,则使用该 URI 访问元数据服务。可以通过设置“AWS_CONTAINER_AUTHORIZATION_TOKEN”环境变量将授权令牌包含在请求的“Authorization”头部中。
  3. 如果未指定上述任何环境变量,将尝试使用 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());
}

这样做可以让您与可能引入另一种身份验证类型或者某个选项过时的新版本兼容。


帮了很多忙,伙计! - Andrei
非常有帮助。我苦苦寻找这个解决方案已经好几天了。 - domino_katrino

1

我觉得你应该使用 EC2ContainerCredentialsProviderWrapper

val ecsCredProvider = new EC2ContainerCredentialsProviderWrapper()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接