この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
概要
表題の通りです。
やりかた
認証情報を操作して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());
}
...