MFAが必須の場合のCLIでのスイッチロール

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})