MFAが有効になっていて、ユーザーに割り当てられたポリシーに「MFAの認証が行われていないリクエストを拒否する」という設定が行われていると発生する。
すべてがそうというわけではないけど。
aws sts get-session-tokenで取得したトークンを環境変数にセットするとエラーは起きなくなる。が面倒くさいのでスクリプト化がオススメ。
以下、そのスクリプト。jq必須。
#! /bin/bash unset AWS_ACCESS_KEY_ID unset AWS_SECRET_ACCESS_KEY unset AWS_SESSION_TOKEN USER_ARN=$(aws iam get-user --query "User.Arn" --output text) MFA_SERI=$(aws iam list-virtual-mfa-devvices --query "VirtualMFADevices[?contains(User.Arn, '${USER_ARN}')].SerialNumber" --output text) read -p 'input MFA code > ' CODE CRED=$(aws sts get-session-token --serial-number ${MFA_SERI} --token-code ${CODE}) ID=$(echo ${CRED} | jq -r .Credentials.AccessKeyId) KEY=$(echo ${CRED} | jq -r .Credentials.SecretAccessKey) TOKEN=$(echo ${CRED} | jq -r .Credentials.SessionToken) export AWS_ACCESS_KEY_ID="${ID}" export AWS_SECRET_ACCESS_KEY="${KEY}" export AWS_SESSION_TOKEN="${TOKEN}"
スクリプト実行時にsourceをつけること。
例> source getMfaToken.sh