Links

AWS CLIでのスイッチロールの設定手順

概要

スイッチロールの設定手順にて、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 で設定済みであれば、およそ以下のような設定になっているはずです。
~/.aws/confg
[default]
region = ap-northeast-1
output = json
~/.aws/credentials
[default]
aws_access_key_id = ***
aws_secret_access_key = ***
~/.aws/config に設定を追記し、以下のようにします。
~/.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/[email protected]
[profile sw-production]
source_profile = default
role_arn = arn:aws:iam::111111111111:role/delegate_root_organization
mfa_serial = arn:aws:iam::123456789012:mfa/[email protected]
このとき、設定内容は以下のようにします。
  • プロファイル名(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/[email protected]: # MFAコード利用の場合、認証コードの入力を求められます
# ...スイッチ先アカウント1のS3バケットが表示されます
% AWS_PROFILE=sw-production aws s3 ls
Enter MFA code for arn:aws:iam::123456789012:mfa/[email protected]:
# ...スイッチ先アカウント2のS3バケットが表示されます
個人的には、以下のように使い分けると便利かと思います。
  • 引数: チーム内で同じアカウントは同じ名前に統一しておけば、コマンドを共有するだけでスイッチロールして実行させることができます
  • 環境変数: シェルスクリプトにまとまっているときなど、コマンドを書き換えたくないときに便利です

CLIをバッチ実行する必要があるとき

role_wrapper.sh という名前で以下スクリプトを作成します(jq コマンドが必要です)。
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/[email protected] \
--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の株式会社プレセナ・ストラテジック・パートナーズエンジニア公式アカウントで発信しています。ご確認ください。