2022年9月22日木曜日

AWS CLIで「An error occurred (AccessDenied) when (略) with an explicit deny in an identity-based policy」というエラーで失敗する

 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