PowerShellでassume-roleを楽にするツールaws-masqueradeを使ってみた

PowerShellでassume-roleが楽になりました。
2022.06.21

こんにちはCX事業本部IoT事業部のさかじです。 IAMロールを切り替えることがPowerShellで手軽に切り替えられないかなと、社内Slackに投げた所、作者本人の夏目さんから紹介を受けたので使ってみました。

環境

  • Windows10

前提条件

  • AWS CLIがインストールしてあること
PS C:\> aws --version
aws-cli/2.7.7 Python/3.9.11 Windows/10 exe/AMD64 prompt/off

はじめに

今回実施したかったスイッチロールする方法はAWS CLIの標準機能を使用して実施できます。しかし、MFAの自動認証ができるなど手間を省ける機能がありますので、aws-masqueradeというツールを使ってみました。

やってみた

※ ビルド済みのバイナリをこちらからダウンロードできます。ビルド済みバイナリを使う場合には以下の作業は不要です。

  • Visual Studioビルドツールインストール
  • Rustインストール

Visual Studioビルドツールインストール

Build Tools for Visual Studio 2022インストール
ダウンロードページ

ダウンロード画面

ダウンロードされた vs_BuildTools.exeを起動します。

インストール開始

インストーラーが起動します。

インストール中

「C++によるデスクトップ開発」「.NETデスクトップビルドツール」「ユニバーサルWindowsプラットフォームビルドツール」を選択して「インストール」をクリックします。

インストール選択画面

インストール進行状況

インストールプログレスバー

インストールが完了しましたら再起動します。

Rustインストール

Rustをインストールページへ行き、[RUSTUP-INIT.EXE(64BIT)]をダウンロードします。
※ 環境に合わせてダウンロードしてください。

ダウンロードしたrustup-init.exeを起動します。
1 を選択して進めます。

インストール内容設定

インストールが終了しましたら、PowerShellを起動します。

バージョンをチェックします。

PS C:\> cargo --version
cargo 1.61.0 (a028ae42f 2022-04-29)
PS C:\> rustc -V
rustc 1.61.0 (fe5b13d68 2022-05-18)
PS C:\> rustup -V
rustup 1.24.3 (ce5817a94 2021-05-31)
info: This is the version for the rustup toolchain manager, not the rustc compiler.
info: The currently active `rustc` version is `rustc 1.61.0 (fe5b13d68 2022-05-18)`
PS C:\> rustup show
Default host: x86_64-pc-windows-msvc
rustup home:  C:\Users\ユーザ名\.rustup

stable-x86_64-pc-windows-msvc (default)
rustc 1.61.0 (fe5b13d68 2022-05-18)
PS C:\>

aws-masqueradeを使ってみる

aws-masqueradeのインストール

PS C:\> cargo install aws-masquerade
PS C:\> aws-masquerade.exe --version
aws-masquerade 0.2.2

プロファイルを追加

PS C:\> aws-masquerade.exe add
account name (required): test ※1
source profile name []: source_profile ※2
role arn (required): arn:aws:iam::123456789012:role/RoleName
mfa arn []: arn:aws:iam::123456789012:mfa/UserName
mfa secret []: xxxxxxxxxxxxxxxxxxxxxxxx ※3
Select Credential Output Type:
 [0] SharedCredentials
 [1] bash
 [2] fish
 [3] PowerShell

 > [0]: 3

Select awscli output type:
 [0] json
 [1] text
 [2] table

 > []: 1
Default Region Name []: ap-northeast-1
  • ※1 : プロファイル名を入力します
  • ※2 : ~\.aws\credentialsに定義しているプロファイル名を入力します
  • ※3 : MFAを設定するためのシークレット設定キー。わからない場合には入力しなくても使用できます

すべて入力すると設定したjsonが作成されますので問題なければ yを入力して完了です。

{
  "test": {
    "sourceProfile": "classmethod",
    "roleArn": "arn:aws:iam::123456789012:role/RoleName",
    "mfaArn": "arn:aws:iam::123456789012:mfa/UserName",
    "mfaSecret": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "credentialOutput": "PowerShell",
    "output": "text",
    "region": "ap-northeast-1"
  }
}

Do you confirm add account? (y/n) [y]: y

assume-roleしてみる

MFAシークレット設定キー設定済みの場合

PS C:\> aws-masquerade.exe assume -a test | Invoke-Expression
PS C:\>

これで完了です。

MFAシークレット設定キー設定されていない場合

コマンドを実行すると各環境設定ファイルが表示されます。これらをコピーし環境設定そのまま実行すると環境設定が行われます。

PS C:\> aws-masquerade.exe assume -a test

MFA TOKEN: 123456

$env:AWS_ACCESS_KEY_ID="xxxxxxxxxxxxxxxxxxx"
$env:AWS_SECRET_ACCESS_KEY="xxxxxxxxxxxxxxxx"
$env:AWS_SESSION_TOKEN="xxxxxxxxxxxxxxxxxxxxx"
$env:AWS_SECURITY_TOKEN="xxxxxxxxxxxxxxx"
$env:AWS_DEFAULT_OUTPUT="text"
$env:AWS_DEFAULT_REGION="ap-northeast-1"

コマンド実行
PS C:\> $env:AWS_ACCESS_KEY_ID="xxxxxxxxxxxxxxxxxxx"
PS C:\> $env:AWS_SECRET_ACCESS_KEY="xxxxxxxxxxxxxxxx"
PS C:\> $env:AWS_SESSION_TOKEN="xxxxxxxxxxxxxxxxxxxxx"
PS C:\> $env:AWS_SECURITY_TOKEN="xxxxxxxxxxxxxxx"
PS C:\> $env:AWS_DEFAULT_OUTPUT="text"
PS C:\> $env:AWS_DEFAULT_REGION="ap-northeast-1"

assume-roleされたか確認します。今回はS3にあるファイル一覧を取得します。

PS C:\> aws s3 ls
2022-06-18 19:43:33 xxx
2020-02-20 08:07:56 xxx
2020-06-12 02:50:43 xxx

使用したいRoleが複数ある場合

aws-masquerade.exe addコマンドを実行し、必要な情報を設定し使い分けることができます。

参考サイト

最後に

昨年まではMacを使用していたため、不自由していなかったのですがWindowsPCに変更して少しでもPowerShellと仲良くなりたいと思い、弊部のSlackへぼやいた所素敵なツール(それも作者)を紹介してもらい非常に助かりました。