概要
スイッチロールの設定手順にて、AWSコンソールでのスイッチロールの方法について記載しました。
開発中にスイッチロール先でAWS CLIを利用したい場面もあるかと思います。 その場合の設定内容について記載します。
状況定義
以下のようにアカウント設定されているとします。
- スイッチ元アカウント
- ID: 123456789012
aws configure
でデフォルトのプロファイルに設定済
- スイッチ先アカウント1
- ID: 210987654321
- スイッチで引き受けるロール:
arn:aws:iam::210987654321:role/delegate_root_organization
- スイッチするときに使うプロファイル名:
sw-staging
- スイッチ先アカウント2
- ID: 111111111111
- スイッチで引き受けるロール:
arn:aws:iam::111111111111:role/delegate_root_organization
- スイッチするときに使うプロファイル名:
sw-production
準備: configファイルでの設定
スイッチ元のアカウントを aws configure
で設定済みであれば、およそ以下のような設定になっているはずです。
{% code title="~/.aws/confg" %}
[default] region = ap-northeast-1 output = json
{% endcode %}
{% code title="~/.aws/credentials" %}
[default] aws_access_key_id = *** aws_secret_access_key = ***
{% endcode %}
~/.aws/config
に設定を追記し、以下のようにします。
{% code title="~/.aws/config" %}
[default] region = ap-northeast-1 output = json [profile sw-staging] source_profile = default role_arn = arn:aws:iam::210987654321:role/delegate_root_organization mfa_serial = arn:aws:iam::123456789012:mfa/your.mail@example.com [profile sw-production] source_profile = default role_arn = arn:aws:iam::111111111111:role/delegate_root_organization mfa_serial = arn:aws:iam::123456789012:mfa/your.mail@example.com
{% endcode %}
このとき、設定内容は以下のようにします。
- プロファイル名(
sw-staging, sw-production
): 任意の名前で大丈夫です。CLIで利用するときにこの名前を指定します source_profile
: スイッチ元のプロファイルを指定しますrole_arn
: スイッチロールで引き受けるロールのARNを指定しますmfa_serial
: スイッチ元でMFAを設定している場合、MFAデバイスのARNを設定します
実行方法
インタラクティブに実行できるかどうかで方法が変わってきます。
CLIをインタラクティブに実行するとき
ユーザー自身が aws s3 ls
を実行する場合など、インタラクティブに実行できる場合は、以下の2通りの方法が利用できます。
--profile
引数にプロファイル名を指定AWS_PROFILE
環境変数にプロファイル名を指定
例としては以下のとおりです。
% aws --profile sw-staging s3 ls Enter MFA code for arn:aws:iam::123456789012:mfa/your.mail@example.com: # MFAコード利用の場合、認証コードの入力を求められます # ...スイッチ先アカウント1のS3バケットが表示されます % AWS_PROFILE=sw-production aws s3 ls Enter MFA code for arn:aws:iam::123456789012:mfa/your.mail@example.com: # ...スイッチ先アカウント2のS3バケットが表示されます
個人的には、以下のように使い分けると便利かと思います。
- 引数: チーム内で同じアカウントは同じ名前に統一しておけば、コマンドを共有するだけでスイッチロールして実行させることができます
- 環境変数: シェルスクリプトにまとまっているときなど、コマンドを書き換えたくないときに便利です
CLIをバッチ実行する必要があるとき
role_wrapper.sh
という名前で以下スクリプトを作成します(jq
コマンドが必要です)。
{% code title="role_wrapper.sh" %}
#!/bin/bash set -euo pipefail code=$1 shift # assume-role aws_credentials=$( aws sts assume-role \ --role-arn arn:aws:iam::210987654321:role/delegate_root_organization \ --role-session-name session-staging \ --serial-number arn:aws:iam::123456789012:mfa/your.mail@example.com \ --token-code ${code} ) # assume-roleの結果をAWS環境変数に展開 export AWS_ACCESS_KEY_ID=$(echo $aws_credentials | jq -r '.Credentials.AccessKeyId') export AWS_SECRET_ACCESS_KEY=$(echo $aws_credentials | jq -r '.Credentials.SecretAccessKey') export AWS_SESSION_TOKEN=$(echo $aws_credentials | jq -r '.Credentials.SessionToken') # 処理を実行 $@
これを使って、以下のように実行します。
% ./role_wrapper.sh <MFAコード> aws s3 ls
また、aws-vaultを利用すると aws-vault exec
を使って同様のことが実現できます。別記事をご参照ください。
本サイトの更新情報は、Twitterの株式会社プレセナ・ストラテジック・パートナーズエンジニア公式アカウントで発信しています。ご確認ください。