[小ネタ]AWS SDK for Java v2を使ってAssume Roleする

2020.12.06

概要

表題の通りです。

やりかた

認証情報を操作してAWSの各サービスにアクセスする場合、クライアントの CredentialsProvider を変更する必要があります。

STSライブラリにはAssume Role後の認証情報を提供する StsAssumeRoleCredentialsProvider があり、これをクライアントが利用することで対象RoleとしてAWSサービスへのアクセスを行えるようになります。

以下のコードは、実際に StsAssumeRoleCredentialsProvider を使って指定されたRoleで StsClient#getCallerIdentity を呼び出し、自身の Role ARN を表示しています。

package sample;

import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider;
import software.amazon.awssdk.services.sts.StsClient;
import software.amazon.awssdk.services.sts.auth.StsAssumeRoleCredentialsProvider;
import software.amazon.awssdk.services.sts.model.AssumeRoleRequest;

public class Sample {
    public static void main(String... args){
        String ROLE_ARN = "arn:aws:iam::012345678901:role/test_role";
        String SESSION_NAME = "assumeRoleTest";

        AssumeRoleRequest req = AssumeRoleRequest.builder()
                .roleArn(ROLE_ARN).roleSessionName(SESSION_NAME).build();

        AwsCredentialsProvider provider = StsAssumeRoleCredentialsProvider.builder()
                .stsClient(StsClient.builder().build())
                .refreshRequest(req).build();

        StsClient client = StsClient.builder()
                .credentialsProvider(provider).build();

        System.out.println(client.getCallerIdentity().arn());
    }
}

StsAssumeRoleCredentialsProvider.Builder#refreshRequest にConsumerを指定することで、 AssumeRoleRequest の生成を簡略化することもできます(参考)。

Similar to refreshRequest(AssumeRoleRequest), but takes a lambda to configure a new AssumeRoleRequest.Builder. This removes the need to called AssumeRoleRequest.builder() and AssumeRoleRequest.Builder#build().

...
    public static void main(String... args){
        String ROLE_ARN = "arn:aws:iam::012345678901:role/test_role";
        String SESSION_NAME = "assumeRoleTest";

        AwsCredentialsProvider provider = StsAssumeRoleCredentialsProvider.builder()
                .stsClient(StsClient.builder().build())
                .refreshRequest(b -> b.roleArn(ROLE_ARN).roleSessionName(SESSION_NAME)).build();

        StsClient client = StsClient.builder()
                .region(Region.AWS_GLOBAL)
                .credentialsProvider(provider).build();

        System.out.println(client.getCallerIdentity().arn());
    }
...

参考