はじめに
以下のようにMFA保護を強制されたIAMユーザーの場合、MFA認証されていない場合すべてのAWSアクションへのアクセスが拒否されます。
IAMユーザーの認証情報を利用する場合もMFAトークンの入力が必要になり、AWS CLIを利用したい場合は一時認証情報を払い出す必要があります。
FYIにあるようにget-session-token
で払い出した一時認証情報を環境変数へエクスポートを行うのですが、コピペする手間を極力無くすために関数にすることで簡略化できます
FYI
Require
- AWS CLI
- jq
コード
.bashrcや.zshrcに追記してご利用ください
function _aws_get_session_token() {
local PROFILE_NAME=$1
local MFA_TOKEN_CODE=$2
local DURATION_SECONDS=3600
# プロファイル, mfa
if [ $# -ne 2 ]; then
echo "引数が足りません"
return 1
fi
local TARGET_AWS_ACCOUNT_ID=$(aws sts get-caller-identity \
--query 'Account' \
--output text \
--profile $PROFILE_NAME \
)
local SERIAL_NUMBER=$(aws sts get-caller-identity \
--query 'Arn' \
--output text \
--profile $PROFILE_NAME \
| sed -e s/:user/:mfa/g
)
local SESSION_TOKEN=$(aws sts get-session-token \
--duration-seconds ${DURATION_SECONDS} \
--serial-number $SERIAL_NUMBER \
--token-code $MFA_TOKEN_CODE \
--profile $PROFILE_NAME \
)
echo "${TARGET_AWS_ACCOUNT_ID} MFA Authentication Success. (${SERIAL_NUMBER})"
_unset_aws_session_token
export AWS_ACCESS_KEY_ID=$(echo $SESSION_TOKEN | jq -r .Credentials.AccessKeyId)
export AWS_SECRET_ACCESS_KEY=$(echo $SESSION_TOKEN | jq -r .Credentials.SecretAccessKey)
export AWS_SESSION_TOKEN=$(echo $SESSION_TOKEN | jq -r .Credentials.SessionToken)
}
function _unset_aws_session_token() {
unset AWS_ACCESS_KEY_ID
unset AWS_SECRET_ACCESS_KEY
unset AWS_SESSION_TOKEN
}
# エイリアスコマンド
alias mfa_session_token="_aws_get_session_token my_profile_name"
利用方法
MFAトークンを引数としエイリアスコマンドを実行します。
mfa_session_token NNNNNN
一時認証が成功すれば以下が出力されます。
123456789012 MFA Authentication Success. (arn:aws:iam::123456789012:mfa/daisuke-araki)