MFAが必須の場合のCLIでのスイッチロール方法のメモ。
参考リンク
CLIでのスイッチロール
アクセスキーだけでMFAが必須なIAMロールへスイッチロールすると以下のようにエラーとなる。
$ aws sts get-caller-identity { "UserId": "XXXXXXXXXXXXXXXXXXXXX", "Account": "111111111111", "Arn": "arn:aws:iam::111111111111:user/hogehoge" } $ aws sts assume-role --role-arn "arn:aws:iam::222222222222:role/hogehoge-role" --role-session-name AWSCLI-Session An error occurred (AccessDenied) when calling the AssumeRole operation: User: arn:aws:iam::111111111111:user/hogehoge is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::222222222222:role/hogehoge-role
なので、まず、MFAデバイスのARNを取得する。
mfa_device_arn=$(aws iam list-mfa-devices --user-name "hogehoge" | jq -r '.MFADevices[].SerialNumber')
デバイスからコードを入力してクレデンシャルを受け取る。
code_from_token="123456" AWS_STS_CREDENTIALS=$(aws sts get-session-token --serial-number ${mfa_device_arn} --token-code ${code_from_token})
クレデンシャルを変数に格納する。
export AWS_ACCESS_KEY_ID=$(echo ${AWS_STS_CREDENTIALS} | jq -r '.Credentials.AccessKeyId') export AWS_SECRET_ACCESS_KEY=$(echo ${AWS_STS_CREDENTIALS} | jq -r '.Credentials.SecretAccessKey') export AWS_SESSION_TOKEN=$(echo ${AWS_STS_CREDENTIALS} | jq -r '.Credentials.SessionToken')
これでユーザーは変わっていないが、MFA認証された状態になったので、スイッチロールを行い、クレデンシャルを受け取る。
AWS_STS_CREDENTIALS=$(aws sts assume-role --role-arn "arn:aws:iam::222222222222:role/hogehoge-role" --role-session-name AWSCLI-Session)
クレデンシャルを変数に格納する。
export AWS_ACCESS_KEY_ID=$(echo ${AWS_STS_CREDENTIALS} | jq -r '.Credentials.AccessKeyId') export AWS_SECRET_ACCESS_KEY=$(echo ${AWS_STS_CREDENTIALS} | jq -r '.Credentials.SecretAccessKey') export AWS_SESSION_TOKEN=$(echo ${AWS_STS_CREDENTIALS} | jq -r '.Credentials.SessionToken')
アイデンティティを確認する。
$ aws sts get-caller-identity { "UserId": "YYYYYYYYYYYYYYYYYYYYY:AWSCLI-Session", "Account": "222222222222", "Arn": "arn:aws:sts::222222222222:assumed-role/hogehoge-role/AWSCLI-Session" }
(追記)
上記では、一度get-session-token
してからassume-role
しているが、この必要はなく、いきなりassume-role
してその際に--serial-number
と--token-code
を指定すればよい。
AWS_STS_CREDENTIALS=$(aws sts assume-role --role-arn "arn:aws:iam::222222222222:role/hogehoge-role" --role-session-name AWSCLI-Session --serial-number ${mfa_device_arn} --token-code ${code_from_token})