アクセスキーとシークレットアクセスキーはIAMのユーザーで「アクセスキーの生成」で作れます。しかし、この方法だとアクセスキーを一定期間で交換しなければならないのでかなり手間です。
そこでEC2にIAM ROLE を割り当ててアクセスキーとはオサラバの予定でしたがIAM ROLE を適用したら以前に書いていた一時的なAccessKey、SecretAccessKeyが取得できなくなってました。
以前はこんなふうに書いていました
AWSCredentials credentials = new BasicAWSCredentials("アクセスキー", "シークレットアクセスキー");
AWSSecurityTokenServiceClient sts = new AWSSecurityTokenServiceClient(credentials);
GetSessionTokenRequest req = new GetSessionTokenRequest();
GetSessionTokenResult res = sts.getSessionToken(req);
Credentials tmpCredentials = res.getCredentials();
String accessKeyId = tmpCredentials.getAccessKeyId();
String secretAccessKeyId = tmpCredentials.getSecretAccessKey();
簡単に調べたのですがassumeRoleがよさげです。
本来は異なるアカウント間のリソースをいじるものみたいですが、
これでいいんじゃないかと。
AWSSecurityTokenService sts = new AWSSecurityTokenServiceClient();
AssumeRoleResult assumeRoleResult = sts.assumeRole(new AssumeRoleRequest()
.withRoleArn(ROLE_ARN)
.withRoleSessionName(ROLE_SESSION_NAME));
Credentials credentials = assumeRoleResult.getCredentials();
System.out.println("AccessKeyId=" + credentials.getAccessKeyId() + " SecretAccessKey=" + credentials.getSecretAccessKey()+ " SessionToken=" + credentials.getSessionToken());
ROLE_ARN、ROLE_SESSION_NAMEって何指定したらいいの?となって調べたところROLE_ARNはロールのARN
ROLE_SESSION_NAMEはてきとーな文字列
ex.「role_session」みたいな
最後に使いたいロールに
{
"Effect": "Allow",
"Action": [
"sts:AssumeRole"
],
"Resource": [
"arn:aws:iam::xxxxxxxxxxxx:role/full_ec2_lambda"
]
}
のポリシーを追加すればOKです
これで一時的な認証情報が取得できます。