首页 > 解决方案 > 在 ec2 上使用 java SDK 在 aws 中担任不同的角色,该 SDK 使用分配的 IAM 进行访问

问题描述

我在 EC2 实例上的 docker 容器中运行一个简单的 Java 应用程序。Java 应用程序本身没有硬编码凭证,并且 aws sdk 假定分配给 EC2 实例的凭证。

这工作正常,但我现在需要它在执行中期动态承担不同的角色。我试图让下面的代码帮助做到这一点,但我在倒数第二行遇到了一个异常“AssumeRoleResult roleResponse = stsClient.assumeRole(roleRequest);”

    public void awsAssumeRole(String region,String roleARN, String roleName) {
        AWSSecurityTokenService stsClient = AWSSecurityTokenServiceClientBuilder.standard()
                .withCredentials(new ProfileCredentialsProvider())
                .withRegion(region)
                .build();

        AssumeRoleRequest roleRequest = new AssumeRoleRequest()
                .withRoleArn(roleARN)
                .withRoleSessionName(roleName);
        AssumeRoleResult roleResponse = stsClient.assumeRole(roleRequest);
        Credentials sessionCredentials = roleResponse.getCredentials();
}

以下例外:

Exception in thread "main" java.lang.IllegalArgumentException: No AWS profile named 'default'

我通过的变量采用以下格式:

roleARN=arn:aws:iam::account-id
roleName=role/role-name-with-path

我不知道如何指定默认配置文件,因为运行应用程序的 docker 容器上没有凭据,甚至没有 .aws 文件夹来放置配置,而且我不能这样做,因为我们不允许对凭据进行编码。

有没有办法在我的情况下实现角色切换?

我正在运行当前在 intellij 中的应用程序,使用临时生成的凭据作为环境变量传递,以尝试复制应用程序在 docker 容器中运行期间将看到的内容,但我不知道这在复制如何准确应用程序将在 EC2 实例上的 docker 容器中运行。

我对 AWS 角色也很陌生,角色转换请原谅任何滥用的术语。

非常感谢

标签: javaamazon-web-servicesdockeramazon-ec2amazon-iam

解决方案


根据评论,有两个问题:

  1. 的格式不正确roleARN。它应该是完整的角色。
  2. 使用ProfileCredentialsProvidergets代替EnvironmentVariableCredentialsProvider

推荐阅读