CloudShell上で一発でAssumeRoleできるワンライナーを作ってみた

CloudShell上でAssumeRoleしたい時に便利なワンライナーを作ったよ
2024.02.07

はじめに

検証時に IAM ロールの作成→AssumeRole を CloudShell 上でサクッと行いたい時があったので、ワンライナーを作ってみました。

厳密にはAssumeRoleして取得した一時的な認証情報を環境変数に設定します。

CloudShell を開いている IAM プリンシパルが AssumeRole する権限を持っている前提です。

ローカルで実行する場合は以下のブログの方が適しているのでご参照ください。 AssumeRole(スイッチロール)で一時クレデンシャルを取得して環境変数にセットするワンライナー | DevelopersIO

作成したワンライナー

コマンドは以下です。{AccountId}{RoleName}は適宜置き換えてください。{SessionName}は任意のもので OK です。

eval $(aws sts assume-role \
    --role-arn "arn:aws:iam::{AccountId}:role/{RoleName}" \
    --role-session-name "{SessionName}" \
    --query 'Credentials.[AccessKeyId,SecretAccessKey,SessionToken]' \
    --output text | \
awk '{print "export AWS_ACCESS_KEY_ID="$1"\n" \
            "export AWS_SECRET_ACCESS_KEY="$2"\n" \
            "export AWS_SESSION_TOKEN="$3}')

試してみる

事前に AssumeRole したい IAM ロールを作成しておきます。今回はAssumeRoleOneLinerという IAM ロールを作成しました。

それでは作成したワンライナーを実行してみます。

$ eval $(aws sts assume-role \
>     --role-arn "arn:aws:iam::111111111111:role/AssumeRoleOneLiner" \
>     --role-session-name "AssumeRoleOneLinerTest" \
>     --query 'Credentials.[AccessKeyId,SecretAccessKey,SessionToken]' \
>     --output text | \
> awk '{print "export AWS_ACCESS_KEY_ID="$1"\n" \
>             "export AWS_SECRET_ACCESS_KEY="$2"\n" \
>             "export AWS_SESSION_TOKEN="$3}')

戻り値はないので、エラーが出なければ成功しています。

ちゃんと AssumeRole できたか確認してみましょう。

確認にはaws sts get-caller-identityを実行します。

$ aws sts get-caller-identity
{
    "UserId": "AROA5J5QSVFRVTXCIMD5K:AssumeRoleOneLinerTest",
    "Account": "111111111111",
    "Arn": "arn:aws:sts::111111111111:assumed-role/AssumeRoleOneLiner/AssumeRoleOneLinerTest"
}

Arn に AssumeRole したロール名とセッション名が記載されていますね。

コマンドの解説

もう少しコマンドの解説を知りたい方だけどうぞ。

まずaws sts assume-roleの結果を query と output text を使って必要な認証情報だけを取得しています。

aws sts assume-role \
>     --role-arn "arn:aws:iam::111111111111:role/AssumeRoleOneLiner" \
>     --role-session-name "AssumeRoleOneLinerTest" \
>     --query 'Credentials.[AccessKeyId,SecretAccessKey,SessionToken]' \
>     --output text |

この結果、AccessKeyIdSecretAccessKeySessionTokenの値がスペース区切りで取得できます。

これを|を使って次の ark コマンドに渡しています。

awk '{print "export AWS_ACCESS_KEY_ID="$1"\n" \
            "export AWS_SECRET_ACCESS_KEY="$2"\n" \
            "export AWS_SESSION_TOKEN="$3}')

arkコマンドでは、print コマンドを使って環境変数に設定する export 分を出力します。この時$1,$2,$3にはそれぞれAccessKeyIdSecretAccessKeySessionTokenを参照しています。

なので、ここだけを見ると以下の出力が行われます。

export AWS_ACCESS_KEY_ID=取得したAccessKeyId
export AWS_SECRET_ACCESS_KEY=取得したSecretAccessKey
export AWS_SESSION_TOKEN=取得したSessionToken

最後にこの作成された export コマンドをevalによって実行しています。

まとめ

CloudShell 上で使える AssumeRole できるワンライナーを作ってみました。もし CloudShell でサクッと使いたい時にご利用ください。

参考

AssumeRole(スイッチロール)で一時クレデンシャルを取得して環境変数にセットするワンライナー | DevelopersIO [初心者向け]Awkの使い方 #Linux - Qiita