ちょっと話題の記事

マネコン起動もできるAWSのスイッチロール用CLIツール「AWSume」の紹介

プロファイル指定したマネジメントコンソールの起動までできる、コマンドラインツールです。全AWSユーザーが求めていたのはこれなんじゃないでしょうか。どすこい。
2022.11.18

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

「スイッチロールからの作業、AWSのベストプラクティスだけれどツールの設定がめんどくさいよね」

ハマコー、最近会社のパソコンをIntel MacからM1 Macに切替たことがきっかけで、いろんなツールを再度セットアップしてました。

普段AWS触っている身としてはスイッチロールして作業する環境も必須なので、改めて最新ツールを物色していたところ、弊社技術番長の岩田御大に教えてもらったAWSumeというツールが圧倒的に便利だったので、前のめりに紹介します。

  • 標準公式のconfigとcredentialファイルのみで動作し、別途設定ファイルは不要
  • コマンドラインから、プロファイル名の自動補完に対応
  • 指定したプロファイルから、マネジメントコンソールの起動も可能

と、スイッチロールに関わるほぼすべての領域を完全網羅しているツールで、セットアップもめちゃくちゃ簡単な素晴らしい逸品でした。普段AWS環境をスイッチロールで作業している全てのAWSユーザーにおすすめしたいツールです。

これが神ツールか…!!

  ( ゚д゚) ガタッ
  /   ヾ
__L| / ̄ ̄ ̄/_
  \/   /

すぐ、神とかいうやん。

この記事を読む前提知識

この記事は、スイッチ用IAMロールの概念と作成方法、AWS CLIを利用するときの認証情報の設定などの基礎知識があることを前提としています。このあたりがまだ不安な方は、以下の記事を参考に、学びながらIAMロールの作成や、AWS CLIの設定を実施しておきましょう。

AWS CLIでスイッチロールするために必要なファイルの用意

IAMユーザーと、スイッチロールして作業するIAMロールを作成したら、以下の2つのファイルを用意します。

~/.aws/credentials

[default]
aws_access_key_id = AKIAXXXXXXXXXXXXXXXXXXXXX
aws_secret_access_key = vdYYYYYYYYYYYYYYYYYYYYYYYY

~/.aws/config

[default]
region = ap-northeast-1
output = json

[profile <スイッチロール時に指定するプロファイル名>]
role_arn = arn:aws:iam::<スイッチロール先のアカウントID>:role/cm-hamada.koji
mfa_serial = arn:aws:iam::<スイッチロール元のアカウントID>:mfa/cm-hamada.koji
source_profile = default

mfa_serialは、スイッチロール先のロールの信頼ポリシーでMFA認証が必須な場合に設定する必要があります。断言しますが、MFAを利用しないスイッチロールは超絶事故の原因になるので、必ず設定しておくことをオススメします。

利用するファイルの用途や設定内容の詳細は、以下を参考に。

AWSumeとは?

「AWSume」はセッショントークンの管理とIAMロール用のクレデンシャルを引受けるためのシンプル、かつ高機能なコマンドラインツールです。公式ページはこちら。

できることの概要は、公式ページから引用している下記動画GIFをみてもらえれば一目瞭然。どうです?便利そうでしょ?

AWSumeのセットアップ

セットアップはシンプル。以下公式手順に則って進めてください。

Installation and Quick Start | AWSume

自分のMacでは、クライアントにpipxがなかったので、以下の手順で進めました。

$ brew install pipx
$ pipx install awsume

自分の環境では、上記インストール実施後、以下のメッセージが表示されたので、メッセージにそって、awsume-configureを実行することでエイリアス関連の設定が書き込まれました。

$ pipx install awsume

Warning: the awsume shell script is not being sourced, please use awsume-configure to install the alias
/Users/hamada.koji/.local/bin/awsume: line 183: return: can only `return' from a function or sourced script

$ awsume-configure

<以下の内容が、.bash_profileに書き込まれる>
#AWSume alias to source the AWSume script
alias awsume="source awsume"

#Auto-Complete function for AWSume
_awsume() {
    local cur prev opts
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    opts=$(awsume-autocomplete)
    COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
    return 0
}
complete -F _awsume awsume

awsume-configureは、AWSumeの初期セットアップ用のツールで、インストール時に自動セットアップがうまくいかなかったとき、手動実行するために用意されているツールです。インストールはできたけどどうにもエラーでうまく動かないときは、こちらのドキュメントを参考に再設定してみてください。

awsume-configure | AWSume

.bash_profileが更新されているので、ターミナルを再起動します。

AWSumeを利用して、スイッチロールしてみる

実際のスイッチロール方法は、ものすごく簡単。これだけです。

awsume <profile_name>

例えば、以下のconfigがある状態だとします。

~/.aws/config

[default]
region = ap-northeast-1
output = json

[profile cm-hamada]
role_arn = arn:aws:iam::BBBBBBBBBB:role/cm-hamada.koji
mfa_serial = arn:aws:iam::AAAAAAAAAA:mfa/cm-hamada.koji
source_profile = default

こんな感じでスイッチロールできます。MFAが必須な場合は、途中でMFA tokenを聞かれます。

$ awsume cm-hamada
Enter MFA token: 030152
Session token will expire at 2022-11-18 11:20:32
[cm-hamada] Role credentials will expire 2022-11-18 00:20:33

認証情報を確認するaws sts get-caller-identityで、意図した認証情報を取得できていればOK。

aws sts get-caller-identity
{
    "UserId": "AAAAAAAAAAAAAAAAAAA:cm-hamada",
    "Account": "BBBBBBBBBB",
    "Arn": "arn:aws:sts::BBBBBBBBBB:assumed-role/cm-hamada.koji/cm-hamada"
}

認証情報をクリアする場合は、--unsetコマンドを使います。

awsume --unset

AWSumeの便利機能の数々!!

これだけでも自分としては、「めっちゃ便利やん!!」と感動しきりなんですが、様々な便利機能がAWSumeには搭載されているので、いくつか紹介します。

プロファイル名のオートコンプリート

開発〜ステージング〜本番など、複数環境でスイッチロールして作業する人も多いと思います。そんなときに便利なのが、プロファイル名のオートコンプリート。

例えば、configがこんな感じになっていたとして。

~/.aws/config

[default]
region = ap-northeast-1
output = json

[profile cm-hamada]
<中略>

[profile cm-dev-hamada]
<中略>

[profile cm-prd-hamada]
<中略>

プロファイル名を途中まで入力して、Tabキーを押すとこんな感じで、入力候補を表示してくれます。

$ awsume cm- <Tabキー入力>
cm-dev-hamada  cm-hamada      cm-prd-hamada

プロファイル一覧の表示

-l, --list-profileオプションで、設定されているプロファイルの一覧が表示可能。

$ awsume --list-profile
Listing...

==========================AWS Profiles==========================
PROFILE        TYPE  SOURCE   MFA?  REGION          ACCOUNT     
cm-dev-hamada  Role  default  Yes   None            BBBBBBBBBBBB
cm-hamada      Role  default  Yes   None            BBBBBBBBBBBB
cm-prd-hamada  Role  default  Yes   None            BBBBBBBBBBBB
default        User  None     No    ap-northeast-1  Unavailable

クレデンシャル引受け時のコマンド表示

-s, --show-commandsオプションで、ロール引受時に実行されるクレデンシャル設定用のコマンドが表示されます。

$ awsume my-admin -s
export AWS_ACCESS_KEY_ID=<SECRET>
export AWS_SECRET_ACCESS_KEY=<SECRET
export AWS_SESSION_TOKEN=<SECRET>
export AWS_SECURITY_TOKEN=<SECRET>
export AWS_REGION=<REGION>
export AWS_DEFAULT_REGION=<REGION>
export AWSUME_PROFILE=my-admin
export AWSUME_EXPIRATION=<YYYY-mm-ddTHH:MM:SS>

「個人的に最高」マネジメントコンソールの起動

別途プラグインを導入することで、任意のプロファイルの認証情報を利用したマネジメントコンソールの起動ができます。これが神と言わずして何が神か!!

プラグインのインストール方法と利用法は、以下のページを参照。

trek10inc/awsume-console-plugin: This is a plugin that enables you to use your assumed role credentials to open the AWS console in your default browser.

awsumeインストール時の方法に合わせて、pipxまたはpipでプラグインをインストールします。

pip install awsume-console-plugin
or
pipx inject awsume awsume-console-plugin

ここから先は、興奮しっぱなしですよ。

コンソールの起動

-cオプションで、指定したプロファイルの認証情報を利用した状態で、デフォルトブラウザでマネジメントコンソールが起動します。最高に便利。

awsume <profile_name> -c

現在利用しているプロファイルを利用するだけなら、profile_nameは省略可能。

awsume -c

コンソールリンクの取得

-clオプションで、コンソールのURLが標準出力されます。

awsume <profile_name> -cl

サービスページを指定したマネジメントコンソールの起動

-csオプションとサービス名を指定することで、特定のサービスを指定した状態でマネジメントコンソールの起動が可能です。

awsume <profile_name> -cs <service>

例えば、こんな感じにすれば、指定したプロファイルでCloudFormationの画面が開きます。なんとまぁ小気味よい機能ですこと!!

awsume cm-hamada -cs cloudformation

その他、いろんなカスタム方法もあるようなので、あれこれ気になってみた方は、上で紹介した公式ページみて、あれこれ試してみてください!

MFAのワンタイムパスワードを1passwordから自動取得したい場合

専用のプラグインがあるらしいです。こちらを参考に設定してみましょう。ここまでやれば、めちゃくちゃ便利ですね。

AWSumeの「1PasswordからMFAを自動取得するプラグイン」を使ってみる | DevelopersIO

AWSumeはスイッチロールに関わる作業を全て完結できる素晴らしいツール

以前は似たようなものとして、assume-roleというツールを使っていました。

remind101/assume-role: Easily assume AWS roles in your terminal.

これをdirenvを併用して、ディレクトリ移動で自動的に対象プロファイルにスイッチロールする仕組みを利用していました。このブログには何度お世話になったことか…

[小ネタ]ディレクトリ移動した際に自動で一時クレデンシャルを取得・設定する | DevelopersIO

なのですが、最近Apple Silicon Macに変えたところ、assume-roleが動かなくなっており、そのための代替策として、以下のブログを試そうとしていたところでした。

そんな悩みを社内Slackにつぶやいたところ、弊社の技術番長岩田先生に教えてもらったのが、このAWSumeだったということです。

さらに、今まではマネジメントコンソールでの操作は、この便利ブラウザ拡張機能、aws-extend-switch-rolesに大変お世話になっていたのですが、AWSumeでブラウザ起動もなんとワンツールで完結できてしまいました。

世界中の全AWSユーザー歓喜のツールだと思うので、気になった方は是非一度試していただければと思います。

それでは、今日はこのへんで。濱田(@hamako9999)でした。