こうこく
作 ▸

スイッチロールでAWS SDKを実行する

「開発用のAWSアカウントにスイッチロールで入る」方法でコンソールを利用してる人が、同じように「開発用のPCからスイッチロールでAWS-SDKを実行する」方法。

CLIは --profile でできるけど、SDKはどうやるのか分からなかったから調べた。

Ubuntu 20.04aws-sdk 2.1246.0aws-cli/2.4.9 Python/3.8.8 Linux/5.15.68.1-microsoft-standard-WSL2 exe/x86_64.ubuntu.20 prompt/off
もくじ

前提

ここでは、アカウントAで作成したIAMユーザー (MFA認証あり) を、アカウントBのIAMロールにスイッチして開発できるようにします。

この記事は以下の前提で記載するので、自分の環境に読み替えてください。

  • アカウントA (スイッチ元) のID … 000000000000
  • アカウントA (スイッチ元) のIAMユーザー名 … kiriukun
  • アカウントB (スイッチ先) のID … 999999999999
  • アカウントB (スイッチ先) のIAMロール名 … switch-DevRole

手順1. スイッチ元のアクセスキーを認証情報ファイルに記載

まずアカウントAでアクセスキーを作成し、シークレットとともにローカルの認証情報ファイル ~/.aws/credentials に記載。

ファイルの内容は以下の通りになる。

~/.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] を追加し、ファイルの内容は以下の通りになる。

~/.aws/config
[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 として記載する必要がある。

regionoutput は気にしなくて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_CONFIG1 をセットする。これをしないと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 の対話モードで以下を実行。

Node.js
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_CONFIG1 がセットされているかもう一度確認。

エラー
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

共有認証情報ファイルから Node.js に認証情報をロードする - AWS SDK for JavaScript

AWS リージョンの設定 - AWS SDK for JavaScript

この記事に何かあればこちらまで (非公開)