michimani.net

AWS CLI のエイリアスを使ってメチャクチャ簡単にスイッチロールできるようにしてみた

2022-07-01

AWS 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 での流れを要約すると下記の通りとなります。

  1. aws sts assume-role コマンドで、スイッチしたいロールの一時認証情報を取得する
  2. 取得した認証情報から、必要な値を下記の環境変数にそれぞれ設定する
    1. AWS_ACCESS_KEY_ID
    2. AWS_SECRET_ACCESS_KEY
    3. 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"
  }
}

この中から、 AccessKeyIdSecretAccessKeySessionToken をそれぞれ環境変数 AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYAWS_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

evalexport コマンドを実行したあとは、正常にスイッチできているかを確認するために 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' と実行するだけでスイッチロールできます。

さいごに

ちなみに、元のロールに戻りたい場合は下記コマンドを実行して各環境変数の値をクリアすれば OK です。

unset AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN

comments powered by Disqus