fzf で AWS CLI のプロファイルを快適に切り替える

こんにちは、SRE の唐津です。

AWS リソースを操作・参照する際に、AWS CLI を活用することがあるかと思います。
マネジメントコンソールでは時間のかかる作業を効率的に実行できたりする一方で、誤ったプロファイルを利用すると意図せぬ結果を招くリスクもあります。
複数のプロファイルを利用する場合は、適切に使い分ける必要がありますが、切替がそこそこ面倒ですよね。

ということで、 プロファイルの切り替えを少し快適にする方法をご紹介します。

前提

プロファイルを切り替えるということで、当然ですが、事前に AWS CLI の認証情報を設定しておく必要があります。
詳細な手順は割愛しますが、未設定の場合はドキュメントを元に設定してください。

また、以降の手順で実行するコマンドは、AWS CLI のバージョン 2 でのみ動作するものを含みます。
バージョン 1 を利用している方は、アップデートしてからご利用ください。

AWS CLI のプロファイルを切り替える方法

複数のプロファイルの切り替えを補助するものとして、「AWSP - AWS Profile Switcher」というツールが公開されています。
設定しているプロファイル名を一覧表示し、利用したいものを選択することができます。

こちらも使いやすいツールなのですが、プロファイルの選択を上下キー、もしくは j / p キーで行う必要があり、
切り替え対象となるプロファイル数が増えてくると、若干選択が面倒になってきます。
行っている処理としては、環境変数「AWS_PROFILE」に、選択したプロファイル名を設定するという単純なものなので、
こちらの考え方をベースに、以下ではもう少し快適に切り替えられるようにしてみました。

なお、AWS CLI のコマンド実行時に参照される認証情報の優先順位や、
環境変数「AWS_PROFILE」の役割については、必要に応じて以下ドキュメントを参照ください。

fzf を用いてプロファイルを切り替える

上記のプロファイルが増加してきた際の問題に対応するために fzf というツールを使います。
これは、CLI 上で曖昧検索を可能にするツールです。
パイプで fzf に渡した結果をインタラクティブに選択し、その結果を標準出力に返すことができます。

実行してみた方がわかりやすいので、何はともあれ README に従ってインストールしてみましょう。
Mac の場合は、 brew でインストール可能です。

brew install fzf

インストールできたら、以下のコマンドを実行してみましょう。
aws configure list-profiles で、すべてのプロファイル名を一覧表示して fzf に渡し、
ユーザが選択したプロファイル名を「AWS_PROFILE」に設定する処理を行っています。

❯ echo $AWS_PROFILE
# 出力なし

❯ export AWS_PROFILE=$(aws configure list-profiles | fzf)
# hogehoge-1 を選択

❯ echo $AWS_PROFILE
hogehoge-1

これの何が良いのかというと、前述の通り、曖昧検索しながらプロファイルを選択できることです。
例えば、hogehoge と hugahuga というプロファイルが複数あるとします。

❯ aws configure list-profiles
hogehoge-1
hogehoge-2
hogehoge-3
...(略)...
hogehoge-9
hugahuga-1
hugahuga-2
hugahuga-3
...
hugahuga-9

上記のように多くのプロファイルの中からhogehoge-1 を選択したい場合、
fzf に渡してから hoge 1 などと入力することで、hogehoge-1 という名称のプロファイルを絞り込んで選択することができます。

個々のプロファイルの名称を正確に覚えておくのは現実的ではないと思いますが、
一部だけでもなんとなく覚えておけば、多数あるプロファイルの中から目的のものを簡単に選択できるようになります。

お使いのシェルに応じて、 ~/.zshrc~/.bashrc に以下の内容を記載すれば、awsp というエイリアスで上記の処理を実行できます。
シンプルに導入したい方はこちらを利用してみてください。

alias awsp='export AWS_PROFILE=$(aws configure list-profiles | fzf)'

より快適にプロファイルを切り替える

上記もシンプルで良いのですが、もう少し fzf を有効活用しつつ、
より快適に選択できるようにしたいので、以下のスクリプトを書きました。

# Set AWS PROFILE using fzf.
alias awsp=set_aws_profile

function set_aws_profile() {
  # Select AWS PROFILE
  local selected_profile=$(aws configure list-profiles |
    grep -v "default" |
    sort |
    fzf --prompt "Select PROFILE. If press Ctrl-C, unset PROFILE. > " \
        --height 50% --layout=reverse --border --preview-window 'right:50%' \
        --preview "grep {} -A5 ~/.aws/config")

  # If the profile is not selected, unset the environment variable 'AWS_PROFILE', etc.
  if [ -z "$selected_profile" ]; then
    echo "Unset env 'AWS_PROFILE'!"
    unset AWS_PROFILE
    unset AWS_ACCESS_KEY_ID
    unset AWS_SECRET_ACCESS_KEY
    return
  fi

  # If a profile is selected, set the environment variable 'AWS_PROFILE'.
  echo "Set the environment variable 'AWS_PROFILE' to '${selected_profile}'!"
  export AWS_PROFILE="$selected_profile"
  unset AWS_ACCESS_KEY_ID
  unset AWS_SECRET_ACCESS_KEY
  
  # Check sso-session 
  local AWS_SSO_SESSION_NAME="your 'sso-session' name"  # sso-sessionの名称に変更

  check_sso_session=$(aws sts get-caller-identity 2>&1)
  if [[ "$check_sso_session" == *"Token has expired"* ]]; then
    # If the session has expired, log in again.
    echo -e "\n----------------------------\nYour Session has expired! Please login...\n----------------------------\n"
    aws sso login --sso-session "${AWS_SSO_SESSION_NAME}"
    aws sts get-caller-identity
  else
    # Display account information upon successful login, and show an error message upon login failure.
    echo ${check_sso_session}
  fi
}

以下の画像のように、fzf による選択画面のウィンドウサイズなどを調整し、右側に選択しているプロファイルのアカウントIDやロールを表示できるようにしています。

簡単に解説すると、以下の処理を行う関数を書き、awspというエイリアスで呼び出せるようにしています。

  • fzf で選択する際のオプションとプレビューを指定
  • プロファイルの選択時に、Ctrl + Cで中断された場合、AWS CLI に関連する環境変数を unset する
  • 予期せぬ動作を防ぐため、プロファイルの選択後に、アクセスキー・シークレットアクセスキーの環境変数を unset する
  • AWS IAM Identity Center の認証情報の有効期限が切れた際に、自動で再認証のコマンドを実行する
    • AWS IAM Identity Center を利用している場合は、 AWS_SSO_SESSION_NAME~/.aws/config に登録している「sso-session」の値に変更してください
    • 利用していない場合は、# Check sso-session 以下の処理を削除してご利用ください


最後の内容についての補足ですが、AWS CLI で AWS IAM Identity Center(旧 AWS SSO)の認証情報を利用している場合の処理となります。
こちらはAWSでも推奨されている方式で、永続的な認証情報を用いる必要がなく、AWS IAM Identity Center の設定に基づいてアカウント/ロールへのアクセスを管理できるメリットがあります。

一方で、有効期限が切れた場合は再度認証を行う必要があり、その都度コマンドを実行するのも少々面倒です。
そこで、セッション切れを示すメッセージが出力された場合に、
自動で再ログインのためのコマンド(aws sso login)を実行するようにしています。
※終了ステータスで判定すると、他のエラーの際も動作してしまうため、文字列で判定しています。

なお、個別のIAMユーザの認証情報を使用する方法などは非推奨になっていますので、
もしご利用中の場合は、可能であれば AWS IAM Identity Center を利用した方式への切り替えを検討してみてください。

具体的な設定方法は以下のドキュメントの通りです。

まとめ

今回は、AWS CLI のプロファイルの切り替え方法についてご紹介しました。
ちょっとした調査のときなどに、上記を準備しておくとさっとプロファイルを切り替えることができて便利だと思います。

また、特定の作業ディレクトリで固定のプロファイルを利用するような場合は、
direnv を使う方が便利だったりするので、状況に応じて使い分けると良いかなと思っています。

もしよければ活用してみてください。