スイッチロールでAWS SDKを実行する
「開発用のAWSアカウントにスイッチロールで入る」方法でコンソールを利用してる人が、同じように「開発用のPCからスイッチロールでAWS-SDKを実行する」方法。
CLIは --profile
でできるけど、SDKはどうやるのか分からなかったから調べた。
前提
ここでは、アカウントAで作成したIAMユーザー (MFA認証あり) を、アカウントBのIAMロールにスイッチして開発できるようにします。
この記事は以下の前提で記載するので、自分の環境に読み替えてください。
- アカウントA (スイッチ元) のID …
000000000000
- アカウントA (スイッチ元) のIAMユーザー名 …
kiriukun
- アカウントB (スイッチ先) のID …
999999999999
- アカウントB (スイッチ先) のIAMロール名 …
switch-DevRole
手順1. スイッチ元のアクセスキーを認証情報ファイルに記載
まずアカウントAでアクセスキーを作成し、シークレットとともにローカルの認証情報ファイル ~/.aws/credentials
に記載。
ファイルの内容は以下の通りになる。
[default]
aws_access_key_id = アカウントAのアクセスキー
aws_secret_access_key = アカウントAのシークレット
もちろんCLIで aws configure
を使ってセットしてもOK。
なお、この記事ではプロファイルは default
とする。単純に aws configure
でセットすればプロファイルは default
のはず。
手順2. スイッチ先のロールを設定ファイルに記載
次に、ローカルの設定ファイル (~/.aws/config
) にスイッチロールの記載を追加する。
この記事ではプロファイル develop
として、セクション [profile develop]
を追加し、ファイルの内容は以下の通りになる。
[default]
region = ap-northeast-1
output = json
[profile develop]
role_arn = arn:aws:iam::999999999999:role/switch-DevRole
source_profile = default
mfa_serial = arn:aws:iam::000000000000:mfa/kiriukun
スイッチ先のロールを role_arn
として、スイッチ元のプロファイルを source_profile
として、MFAデバイスを mfa_serial
として記載する必要がある。
region
と output
は気にしなくてOK。また、MFA認証を使わない場合は mfa_serial
の行は不要。
プロファイル名は develop
である必要はなく、好きな名前をつけてよい。
AWS CLIで叩いてみる
ここまでの手順で、CLIでオプション --profile
を指定することで、スイッチ先のロールでCLIを実行できるようになる。
ここでは試しに aws sts get-caller-identity
を実行して、実行者の情報を取得してみる。
まず、オプション --profile
未指定で実行。
aws sts get-caller-identity
{
"UserId": "XXXXXXXXXXXXXXXXXXXXX",
"Account": "000000000000",
"Arn": "arn:aws:iam::000000000000:user/kiriukun"
}
アカウントAの情報が返却された。次に、オプション --profile
でプロファイル develop
を指定して実行。
aws sts get-caller-identity --profile develop
{
"UserId": "YYYYYYYYYYYYYYYYYYYYY:botocore-session-7777777777",
"Account": "999999999999",
"Arn": "arn:aws:sts::999999999999:assumed-role/switch-DevRole/botocore-session-7777777777"
}
Arn
に注目。スイッチ先のロール switch-DevRole
による一時的なアクセス情報が返却されている。
これで、スイッチロールを使ってCLIを叩けることを確認できた。
手順3. AWS SDKが設定ファイルを読み込むようにする
環境変数 AWS_SDK_LOAD_CONFIG
に 1
をセットする。これをしないとAWS SDKが設定ファイルを読み込んでくれず、プロファイルを認識しない。
export AWS_SDK_LOAD_CONFIG=1
一度設定したら変えるものではないと思うので、これは永続的に設定しても大丈夫。
手順4. デフォルトのプロファイルを設定する
最後に、環境変数 AWS_PROFILE
でデフォルトとなるプロファイルを設定する。
ここでは前述のスイッチロールを設定した develop
プロファイルをセットする。
export AWS_PROFILE=develop
これをセットすると、CLIで使われるデフォルトのプロファイルも変更されるので注意。なお、Linuxでは以下のコマンドで環境変数を削除できる。
export -n AWS_PROFILE
AWS SDKで叩いてみる
前述の aws sts get-caller-identity
をAWS SDKから実行してみる。
npm install aws-sdk
したディレクトリで、コマンドラインから node
の対話モードで以下を実行。
const AWS = require('aws-sdk');
AWS.config.update({ region: 'ap-northeast-1' });
const sts = new AWS.STS();
sts.getCallerIdentity().promise().then(res => console.log(res)).catch(err => console.error(err));
{
"ResponseMetadata": {
"RequestId": "00000000-0000-0000-0000-000000000000"
},
"UserId": "YYYYYYYYYYYYYYYYYYYYY:aws-sdk-js-6666666666666",
"Account": "999999999999",
"Arn": "arn:aws:sts::999999999999:assumed-role/switch-DevRole/aws-sdk-js-6666666666666"
}
このように、スイッチ先のロール switch-DevRole
による一時的なアクセス情報が返却されれば成功。
以下のようにエラーが表示された場合は設定ファイルが読み込めていないので、環境変数 AWS_SDK_LOAD_CONFIG
に 1
がセットされているかもう一度確認。
Error [CredentialsError]: Missing credentials in config, if using AWS_CONFIG_FILE, set AWS_SDK_LOAD_CONFIG=1
以上
これだと、別のAWS環境も利用する人はたびたび環境変数 AWS_PROFILE
を手動で設定しなきゃいけなくて面倒かも。そこはどうしようって感じ。
ちなみに環境変数 AWS_PROFILE
を使わずに、以下のようにコード内でプロファイルを指定する方法もある。
const AWS = require('aws-sdk');
AWS.config.credentials = new AWS.SharedIniFileCredentials({ profile: 'develop' }); // ここ
AWS.config.update({ region: 'ap-northeast-1' });
const sts = new AWS.STS();
sts.getCallerIdentity().promise().then(res => console.log(res)).catch(err => console.error(err));
でもこれで開発しちゃうと、本番環境でココどうするのって結局なるから、環境変数 AWS_PROFILE
で設定するのがいいかなと個人的には思う。
参考にさせていただいた記事
IAM初心者がAWS CLIでスイッチロールするまで | DevelopersIO
設定の基本 - AWS Command Line Interface
AWS CLI での IAM ロールの使用 - AWS Command Line Interface
IAM ロール (AWS CLI) の切り替え - AWS Identity and Access Management