AWS CLI のエイリアスを使ってメチャクチャ簡単にスイッチロールできるようにしてみた
2022-07-01AWS CLI でスイッチロールする場合、 sts assume-role で認証情報を取得し、それを環境変数なり ~/.aws/credentials
に追記したりする必要があります。さくっとスイッチしたいだけなのに少々手間がかかるので、 AWS CLI のエイリアスを使ってコマンド一つでスイッチロールできるようにしてみました。
結論
これです。
awscli-aliases/alias at 9edd908f2d27c8a4acf07a6dc31ce7d19dc6ced3 · michimani/awscli-aliases
AWS CLI でスイッチロールする流れ
そもそものスイッチロールの仕組みと AWS CLI でスイッチロールする方法については下記の AWS Blog の記事に書かれています。
IAM チュートリアル: AWS アカウント間の IAM ロールを使用したアクセスの委任 - AWS Identity and Access Management
AWS CLI での流れを要約すると下記の通りとなります。
aws sts assume-role
コマンドで、スイッチしたいロールの一時認証情報を取得する- 取得した認証情報から、必要な値を下記の環境変数にそれぞれ設定する
AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY
AWS_SESSION_TOKEN
たったこれだけですが、 2
の部分が多少手間がかかります。というのも、普通にやると sts assume-role
の実行結果から必要な情報をコピペしてくる必要があるからです。
この手順 1, 2 を --query
オプションを使っていい感じにしてみます。
query オプションを使ってワンライナーで書く
まずは、手順 1 で実行するコマンドから。
今回は、例として下記のような IAM ロールにスイッチしたいとします。 (iam get-role
の出力の一部を抜粋)
{
"Role": {
"Path": "/demo/",
"RoleName": "target-role",
"RoleId": "AROA2XXXXXXXXXXXXXXXX",
"Arn": "arn:aws:iam::00000000:role/demo/target-role",
}
}
上記のロールにスイッチするためには下記コマンドを実行します。
aws sts assume-role \
--role-arn 'arn:aws:iam::00000000:role/demo/target-role'
--role-session-name 'switch-to-target-role'
正常に実行できれば、下記のような出力が得られます。
{
"Credentials": {
"AccessKeyId": "ASIAXXXXXXXXXXXXXXXX",
"SecretAccessKey": "FbNIxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"SessionToken": "IQxxxxx...............xxxxx+4w==",
"Expiration": "2022-06-30T16:05:13+00:00"
},
"AssumedRoleUser": {
"AssumedRoleId": "AROA2XXXXXXXXXXXXXXXX:switch-to-target-role",
"Arn": "arn:aws:sts::00000000:assumed-role/target-role/switch-to-target-role"
}
}
この中から、 AccessKeyId
、 SecretAccessKey
、SessionToken
をそれぞれ環境変数 AWS_ACCESS_KEY_ID
、 AWS_SECRET_ACCESS_KEY
、 AWS_SESSION_TOKEN
に設定することでスイッチしたロールで AWS CLI のコマンドを実行することができます。
Linux または macOS では環境変数の設定には export
コマンドを使用するので、 --query
オプションを使って環境変数設定用のコマンドを生成します。具体的には下記のように実行します。
aws sts assume-role \
--role-arn 'arn:aws:iam::00000000:role/demo/target-role'
--role-session-name 'switch-to-target-role'
--query 'Credentials.join(``,[`export AWS_ACCESS_KEY_ID=\"`,AccessKeyId,`\" AWS_SECRET_ACCESS_KEY=\"`,SecretAccessKey,`\" AWS_SESSION_TOKEN=\"`,SessionToken,`\"`])' \
--output text
出力としては下記のようになります。
export AWS_ACCESS_KEY_ID="FbNIxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" AWS_SECRET_ACCESS_KEY="IQxxxxx...............xxxxx+4w==" AWS_SESSION_TOKEN="IQxxxxx...............xxxxx+4w=="
これをコピペして実行すればいいのですが、それもコマンドでやってしまいます。
この出力を一旦変数に入れ、それを eval
で展開して実行します。
SWITCH_CMD=$( \
aws sts assume-role \
--role-arn $( \
aws iam get-role \
--role-name 'target-role' \
--query 'Role.Arn' \
--output text) \
--role-session-name 'switch-to-target-role' \
--query 'Credentials.join(``,[`export AWS_ACCESS_KEY_ID=\"`,AccessKeyId,`\" AWS_SECRET_ACCESS_KEY=\"`,SecretAccessKey,`\" AWS_SESSION_TOKEN=\"`,SessionToken,`\"`])' \
--output text) \
&& eval ${SWITCH_CMD} \
&& aws sts get-caller-identity
eval
で export
コマンドを実行したあとは、正常にスイッチできているかを確認するために aws sts get-caller-identity
を実行しています。
実行結果としては下記のようになります。
{
"UserId": "AROA2XXXXXXXXXXXX:switch-to-target-role",
"Account": "000000000000",
"Arn": "arn:aws:sts::000000000000:assumed-role/target-role/switch-to-target-role"
}
以上で、ワンライナーでスイッチロールできるようになりました。最後に、これを AWS CLI のエイリアスコマンドとして設定し、より簡単にスイッチロールできるようにしてみます。
AWS CLI のエイリアスコマンドを設定する
AWS CLI では、ユーザが任意のエイリアスコマンドを設定できるようになっています。
AWS CLI エイリアスの作成と使用 - AWS Command Line Interface
例えば、下記のようなエイリアスを設定しておけば aws id
と実行するだけでアカウント ID を確認することができます。
id = sts get-caller-identity \
--query 'Account' \
--output text
エイリアスには引数で値を渡すこともできます。今回であれば可変なのはロール名のみなので、エイリアスの引数にロール名を渡すようにすればよいので、下記のようなエイリアスを設定することになります。
switch-role =
!f() {
SWITCH_CMD=$( \
aws sts assume-role \
--role-arn $( \
aws iam get-role \
--role-name "${1}" \
--query 'Role.Arn' \
--output text) \
--role-session-name "switch-to-${1}" \
--query 'Credentials.join(``,[`export AWS_ACCESS_KEY_ID=\"`,AccessKeyId,`\" AWS_SECRET_ACCESS_KEY=\"`,SecretAccessKey,`\" AWS_SESSION_TOKEN=\"`,SessionToken,`\"`])' \
--output text) \
&& eval ${SWITCH_CMD} \
&& aws sts get-caller-identity
}; f
あとは aws switch-role 'target-role'
と実行するだけでスイッチロールできます。
さいごに
- AWS CLI のエイリアスいいぞ
- ワンライナー最高
- どんどんスイッチしたくなる
ちなみに、元のロールに戻りたい場合は下記コマンドを実行して各環境変数の値をクリアすれば OK です。
unset AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN
comments powered by Disqus