AWS プロファイル切り替えのストレスを解消!「Granted」で IAM ロールと SSO の管理を効率化してみた
どうも、こんにちは kaz です。
はじめに
みなさん、AWS CLI を利用する際にはどんなログインツールを利用していますか?
私は普段 IAM ロールや IAM Identity Center のプロファイルを切り替えて作業していますが、できる限りアカウント切り替えコストを下げたいと思っています。
この手のログインツールはいくつかありますが、なかなかこれだ!というものに出会えずにいました。
今回は、そんな悩みを解決してくれるツール「Granted」というツールを見つけたのでご紹介します!!
前提条件
- AWS CLI がインストールされていること
- IAM ロールや IAM Identity Center の AWS プロファイルが設定されていること
事前設定
ここでは、Granted を利用するための事前設定を行います。
インストール
今回は macOS を想定していますが、Linux や Windows でも利用可能です。
Homebrew でのインストールが用意されているので、これを使いましょう!めちゃくちゃ簡単です。
$ brew tap common-fate/granted
$ brew install granted
インストールが完了したら、以下のコマンドでバージョンを確認してみましょう。
$ granted -v
Granted version: 0.38.0
AWS プロファイルの設定
次に、AWS CLI のプロファイルを設定します。
IAM ロールのプロファイルと IAM Identity Center のプロファイルを設定することができます。
IAM ロールのプロファイルを設定する場合
以下のように ~/.aws/credentials
と ~/.aws/config
に記述します。
### ~/.aws/credentials
[test-secret]
aws_access_key_id = <ACCESS_KEY>
aws_secret_access_key = <SECRET_KEY>
### ~/.aws/config (リージョンや出力形式はご自由に)
[profile test-role]
source_profile = test-secret
role_arn = arn:aws:iam::<ACCOUNT_ID>:role/<ROLE_NAME>
mfa_serial = arn:aws:iam::<ACCOUNT_ID>:mfa/<MFA_DEVICE> # MFA を利用する場合は記述
region = ap-northeast-1
output = json
IAM Identity Center のプロファイルを設定する場合
以下のように ~/.aws/config
に記述します。
### ~/.aws/config (リージョンや出力形式はご自由に)
[profile TestAccount/AdministratorAccess]
sso_start_url = https://<Identifier>.awsapps.com/start
sso_region = <SSO_REGION>
sso_account_id = <ACCOUNT_ID>
sso_role_name = <SSO_ROLE_NAME>
region = ap-northeast-1
output = json
これで、IAM ロールと IAM Identity Center のプロファイルが設定できました。
Granted は AWS CLI と同じ設定ファイルを利用するため、特別な設定が不要なのも嬉しいポイントですね。
Granted の設定
次に、Granted の設定を行います。
下記は初回のみ必要な設定で Granted が利用するデフォルトのブラウザを設定します。
私は Brave を利用しているので、以下のように設定しました。
(Granted 的には Firefox が激推しみたいです!)
$ assume
[i] Thanks for using Granted!
[i] By default, Granted will open the AWS console with this browser: Brave
[!] Granted works best with Firefox but also supports Chrome, Brave, and Edge (https://docs.commonfate.io/granted/introduction#supported-browsers). You can change this setting later by running 'granted browser set'
? Use Firefox as default Granted browser? (Y/n) n # Brave を利用するため n を入力
[✔] Granted will default to using Brave
? Use a different browser than your default browser for SSO login? [? for help] (y/N) N # SSO ログインにブラウザを利用するか聞かれますが、デフォルトのブラウザを利用するので N を入力
[i] To change the web browser that Granted uses run: `granted browser -set`
[i] Here's how to use Granted to supercharge your cloud access:
[i] `assume` - search profiles to assume
[i] `assume <PROFILE_NAME>` - assume a profile
[i] `assume -c <PROFILE_NAME>` - open the console for the specified profile
デフォルトブラウザを変更したい場合には granted browser -set
コマンドを使ってね〜とのことです。
もう一度 assume
コマンドを実行してみます。
エイリアスが設定されていない。ということで Y
を入力してエイリアスを設定しておきます。
$ assume
[i] To assume roles with Granted, we need to add an alias to your shell profile (https://docs.commonfate.io/granted/internals/shell-alias)
? Install zsh alias at /Users/xxxx/.dotfiles/configs/zsh/.zshenv (Y/n) Y
[✔] Added the Granted alias to /Users/xxxx/.dotfiles/configs/zsh/.zshenv
[!] Shell restart required to apply changes: please open a new terminal window and re-run your command.
ここまで完了したら一度、新しいターミナルウィンドウを開いてシェルを再起動しましょう。
これで初期設定は完了です!めちゃくちゃ簡単じゃないですか?!
使ってみる
ここからは、実際に Granted を利用してみましょう!
ログインには assume
コマンドを使ってプロファイルを指定します。
事前に設定しておいた IAM ロールや SSO プロファイルのリストが表示されるはずです。
$ assume
? Please select the profile you would like to assume: [Use arrows to move, type to filter]
> test-role
test-sso
ここまで確認ができれば OK です!
いったん、キャンセルして「IAM ロール」と「SSO プロファイル」のログインをそれぞれ試してみましょう。
IAM ロールのログイン
ログインには assume
コマンドで直接プロファイル名を指定することもできます。
今回は test-role
という IAM ロールのプロファイルを指定してログインしてみます。
$ assume test-role
? MFA Token 000000
[!] Profile test-role has plaintext credentials stored in the AWS credentials file
[i] To move the credentials to secure storage, run 'granted credentials import test-role'
[✔] [test-role](ap-northeast-1) session credentials will expire in 1 hour
これで test-role
の IAM ロールにログインできました!
警告が表示されていますが、これは Granted がセキュアなストレージに認証情報を移行することを提案しているものです。
もしセキュアなストレージに移行したい場合は、以下のコマンドを実行します。
### Granted のセキュアなストレージに認証情報を移行する ###
# ~/.aws/credentials` から認証情報が削除され Granted が提供するセキュアなストレージに認証情報を移行 (暗号化される)
$ granted credentials import test-role
### 従来の `~/.aws/credentials` に AWS 認証情報を戻す方法 ###
# 1. セキュアなストレージに保存されているクレデンシャルのプロファイル名を表示する
$ granted credentials list
# 2. `~/.aws/credentials` に認証情報を戻す
$ granted credentials export-plaintext <PROFILE_NAME>
# 3. Granted のセキュアなストレージから認証情報を削除する
$ granted credentials remove <PROFILE_NAME>
セキュアなストレージに移行すると、認証情報が暗号化されて保存されるためセキュリティが向上します!
他のコマンドや詳細については以下を参照してください。
SSO プロファイルのログイン
次に、IAM Identity Center のプロファイルを指定してログインしてみます。
$ assume TestAccount/AdministratorAccess
[!] error retrieving IAM Identity Center token from secure storage: The specified item could not be found in the keyring
[i] If the browser does not open automatically, please open this link: https://xxxxxx.awsapps.com/start/#/device?user_code=DZWC-QKXV
[i] Awaiting AWS authentication in the browser
[i] You will be prompted to authenticate with AWS in the browser, then you will be prompted to 'Allow'
[i] Code: DZWC-QKXV
すると、自動的にブラウザが開いて SSO の認証が始まります。
画面の通りにログインを入力して認証を完了させると、以下の認証リクエスト画面が表示されます。
必ず表示された 8 文字のコードがターミナルに表示されたものと一致していることを確認して「確認して続行」をクリックします。
次の画面で「許可」をクリックします。
「リクエストが承認されました」と表示されるので、ブラウザを閉じてターミナルに戻ります。
ターミナルには以下のようなメッセージが表示されます。
[✔] [TestAccount/AdministratorAccess](ap-northeast-1) session credentials will expire in 8 hours
これで SSO プロファイルへのログインも完了しました!
ログアウト
Granted では、ログインに成功したプロファイルをキャッシュしてくれます。
このため、明示的にセッションを終了しない限り、有効期限まで残り続けてしまいます。
明示的にセッションを終了したい場合には、以下のコマンドを実行します。
# 現在のセッションを確認する
$ granted cache list
STORAGE TYPE KEY
sso-token https://xxxx.awsapps.com/start
session-credentials test-role
# すべてのセッションをクリアする
# ※ STORAGE TYPE ごとでも削除できますので help を参照してください
$ granted cache clear --all
これで基本的な使い方は以上です!!
便利な機能
Granted には他にも便利な機能がいくつかありますので、いくつかご紹介します。
プロファイルの順序を変更する
使用中のプロファイルの一覧表示方法を変更できる設定オプションがあります。
デフォルトは Frecency (最近の使用状況順)
です。
私はアルファベット順の方が望ましいので以下の設定を行いました。
$ granted settings profile-order set
? Select filter type Alphabetical
[✔] Set profile ordering to: Alphabetical
これでプロファイルの一覧がアルファベット順に表示されるようになります。
シェルのオートコンプリートを有効にする
シェルのオートコンプリートは Zsh
と Fish
をサポートしています。
なお、将来的には Bash
と PowerShell
がサポートされる予定だそうです。
今回は Zsh
のオートコンプリートを有効にしてみます。
$ granted completion -s zsh
[✔] ZSH autocompletions generated successfully
[!] A shell restart is required to apply changes, please open a new terminal to test that autocomplete is working
これで Zsh
のオートコンプリートが有効になりましたので、ターミナルを再起動して試してみてください。
$ assume <TABを押す>
test-role TestAccount/AdministratorAccess
一時的な資格情報の期間を設定する
--duration
または -d
フラグを指定して、一時的な資格情報の期間を設定できます。
ただし、IAM ロールに設定されたデフォルトの最大期間内でなければならないことに注意してください!
# とくになにも指定しない場合、Granted はデフォルトの 1 時間を設定する
$ assume test-role
[✔] [test-role](ap-northeast-1) session credentials will expire in 1 hour
# 4 時間の期間を指定してログインする場合
$ assume test-role --duration 4h
[✔] [test-role](ap-northeast-1) session credentials will expire in 4 hours
# 最大期間外を指定するとエラーになる
$ assume test-role --duration 13h
[✘] failed to refresh cached credentials, failed to refresh cached credentials, operation error STS: AssumeRole, https response error StatusCode: 400, RequestID: xxxxx, api error ValidationError: 1 validation error detected: Value '46800' at 'durationSeconds' failed to satisfy constraint: Member must have value less than or equal to 43200
なお、IAM Identity Center のプロファイルの場合は許可セットに指定されたセッション期間に基づくようです (--duration
フラグは無視されているっぽい)。
CLI からマネージメントコンソールを開く
--console
または -c
フラグを指定して、マネジメントコンソールを開くことができます。
それでは、実際にコンソールを開いてみましょう。
# プロファイルを選択してコンソールを開く
$ assume -c
# 特定のプロファイルを指定してコンソールを開く
$ assume -c test-role
私は普段は Brave を利用していますが、以下のように新しいプロファイルが自動で作成された後、コンソールが開くようです!
このため、マルチセッションサポートを利用していても、このログイン方法ではオフ状態となります。
また、コンソールを開くときにブラウザのプロファイルを指定することもできます。
上述にありますが、プロファイルを指定しない場合は新規プロファイルが作成されてコンソールが開くので拡張機能などがインストールされていない状態になります。
これだと不便なので、あらかじめ AWS コンソール用のブラウザプロファイルを作成 しておき、必要な拡張機能をインストールしておくと便利です!
今回は AWS コンソール用
というプロファイルを作成し、コンソールを開いてみます。
# ブラウザプロファイルを指定してコンソールを開く
$ assume -c test-role --browser-profile "AWS コンソール用"
日本語のプロファイル名でも問題なく開くことができました!
その他のオプション
他にも便利なオプションが利用できます。
--region
または-r
フラグ- 特定のリージョンのコンソールを開く
--service
または-s
フラグ- 特定のサービスのコンソールを開く
--console-destination
または-cd
フラグ- コンソールの URL を指定して開く (CloudWatch Dashboard など直接遷移したい場合に便利!)
# 特定のリージョンのコンソールを開く
$ assume -c test-role -r ap-northeast-1
# 特定のサービスのコンソールを開く
$ assume -c test-role -s s3
# 特定のコンソールの URL を指定して開く
$ assume -c test-role -cd https://console.aws.amazon.com/cloudwatch/home?region=ap-northeast-1#dashboards:name=MyDashboard
これはめっちゃ便利ですね。
自身がよく使うコンソールの URL をエイリアス登録しておくこと、簡単にアクセスできるようになるのでおすすめです!
# ~/.zshenv に以下を追加
alias cw-dashboard='assume -c test-role -cd https://console.aws.amazon.com/cloudwatch/home?region=ap-northeast-1#dashboards:name=MyDashboard'
ブラウザ拡張機能
Granted には ブラウザ拡張機能 が用意されています。
これを利用することで、IAM Identity Center のデバイス認証のフィッシング対策が可能になります (現在、Chrome ブラウザのみ対応)。
詳細は、以下の記事を参照してください。
一連のアカウントに対して AWS コマンドを実行する
--exec
フラグを利用して、複数のアカウントに対して一括で AWS CLI コマンドを実行できます。
あらかじめ定義しておいた AWS プロファイルを指定してクイックにコマンドを実行でき、便利です。
下記では ~/.aws/config
に定義されているプロファイルを利用して、各アカウントの aws sts get-caller-identity
コマンドを実行しています。
# AWS プロファイルを定義
$ cat profile_list.txt
test-role
TestAccount/AdministratorAccess
# 非インタラクティブな環境では FORCE_NO_ALIAS=true オプションを指定して assume コマンドを実行しましょう
# エイリアスの存在が予期せぬ動作を引き起こす可能性があります
for PROFILE in $(cat profile_list.txt); do
echo "--- Processing profile: $PROFILE ---"
FORCE_NO_ALIAS=true assume "$PROFILE" --exec "aws sts get-caller-identity --query Account --output text"
done
### 出力例
--- Processing profile: test-role ---
[✔] [test-role](ap-northeast-1) session credentials will expire in 58 minutes
111111111111
--- Processing profile: TestAccount/AdministratorAccess ---
[✔] [TestAccount/AdministratorAccess](ap-northeast-1) session credentials will expire in 8 hours
222222222222
簡単な処理を実行するだけで、複数のアカウントに対して一括でコマンドを実行できるのは非常に便利ですね!
.env ファイルに環境情報をエクスポートする
--env
または -e
フラグを指定して、ログインしたプロファイルの環境変数を .env
ファイルにエクスポートできます。
これを利用することで VS Code や Docker などの開発環境で簡単にプロファイル情報を利用できるようになります。
# .env ファイルにエクスポート (プロファイルの指定も可能)
$ assume --env
## .env ファイルが存在しない場合は作成するかどうかを聞かれますので、問題なければ `y` を入力します
? No .env file found in the current directory, would you like to create one? Yes
[✔] Successfully created a new .env file in the current directory
[✔] Exported credentials to .env file successfully
これで .env
ファイルにプロファイル情報がエクスポートされました!
認証情報を自動的に更新する
環境変数 GRANTED_ENABLE_AUTO_REASSUME
を設定することで、セッションが切れる前に自動的に認証情報を更新できます。
これにより、ツール実行などで長時間の作業を行う際にセッションが切れることを防げます。
※現時点では Zsh のみ対応していることに注意してください
# ~/.zshenv に以下を追加
export GRANTED_ENABLE_AUTO_REASSUME=true
プロファイルレジストリ
私は試していませんが、チームメンバーとプロファイルを共有するための「プロファイルレジストリ」という機能もあります。
これにより、ドキュメントやスクリプトなどで利用しているプロファイル名を一貫して採用できるようになり、不必要な混乱を避けることができます。
このプロファイルレジストリは、Git リポジトリを利用して管理するようになっており、以下のようなイメージです。
チームで開発しているようなプロジェクトでは、非常に便利な機能だと思うので、ぜひ試してみてください!
まとめ
いかがでしたでしょうか?
Granted を使うことで、IAM ロールと SSO のプロファイルを簡単に切り替えることができるようになりました。
また、セキュアなストレージへの認証情報の移行や、ブラウザ拡張機能の利用など、セキュリティ面でも安心して利用できるようになっています。
機能がいっぱいあって紹介しきれないほどですが、とても便利なツールなのでぜひ一度試してみてください!
アノテーション株式会社について
アノテーション株式会社 は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。
「らしく働く、らしく生きる」のスローガンを掲げ、さまざまな背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けています。
現在当社では AWS の構築・運用経験があり、以下の業務に携わってくれるメンバーを募集中です。
- AWS 環境の運用設計支援や構築
- 運用監視とインシデント対応
- 定型業務などの自動化
AWS 関連資格をお持ちの方、クラウドネイティブな運用経験者は大歓迎です。
少しでもご興味がありましたら 募集職種 よりご応募ください!!
一緒に働ける日を心待ちにしています!