【TAB補完】BASH Complete と fzf で「ぼくのかんがえたさいきょうの AWS_PROFILE 環境変数設定環境」をつくる【メニュー選択】

TL;DR

  • 普段使ってる .aws/config にプロファイルが多い。選んで設定するのも大変
  • 手軽に設定する方法はないものか
  • 環境変数を設定するのに TAB 補完したい
  • どうせならメニューで選びたい、どんな設定かプレビューしたい
  • それ、自作の bash complete と fzf 使えば出来るよね? → できた!

はじめに

みなさん、AWS CLI 使ってますか!(挨拶

業務柄、現在複数の AWS アカウントを使い分け、切り替えながら作業する生活をしています1。マネジメントコンソールであれば Switch Role 用の URL をブックマークしたり2、あるいは機能拡張3を利用したりといった方法がありますが、 AWS CLI についてはちょっと「これ!」というものが見当たりませんでした。

個人的にやりたいことはこんなことです:

  • プロファイルは AWS_PROFILE 環境変数4に設定する。一時クレデンシャルを使うこともあるので、操作性の統一という意味でいちいち --profile を指定したくない
  • よく使うプロファイルは素早く指定したい = その際には TAB 補完で指定したい
  • どれを設定すべきか悩んだときのために、メニューで一覧できるようにしたい、そのときには設定内容をプレビューしたい
  • プレビューはコードハイライトされていたら素敵では?(OPTIONAL)
  • AWS_PROFILE を設定したとき、他の関係環境変数(直前で使っていたAWS_ACCESS_KEY_IDなど)がクリアされて欲しい

このうち 3番目について、下記の記事にある fzf を使ったら理想に近いことが出来ることが分かりました(著者の平野さんに感謝!)。

[ターミナル]fzfを使った自作インタラクティブアプリを作ってみよう!〜git addを快適に〜

2番目については、Bash にあるプログラム補完(Complete)機能を使えば出来ます5。4番目は「できたら良い」くらいでしたが、highlight の TOML ハイライトを使うと実現できそう。 1番目と 5番目は単に作り込みの問題です。

というわけで日々すこしずつ環境を整えていたのですが、先日満足のいくかたちでできあがりましたので、ご紹介します。

使い方

コードは下記 Gist で公開しました。80行程度のファイル 1個だけです。

後述するセットアップを行うことで、下記のコマンドが使えるようになります。

  • aws-profile
  • unset-aws-profile

なおカラー指定のエスケープシーケンスを多用しているので、256color対応のターミナルで、なるべく背景が暗い色のテーマで使用してください。こちらでは iTerm2 と Terminal.app (OS標準ターミナル)で動作を確認しています。

AWSプロファイルの設定 (aws-profile)

環境変数 AWS_PROFILE にプロファイルを設定するコマンド(正確には BASH 関数)です。

TAB 補完

aws-profile と入力した後 [TAB] キーを 2回押すと、現在 ~/.aws/config に設定されている全てのプロファイルが候補として表示されます。

何か 1文字〜数文字入力して再度 [TAB] キーを押すと、その文字からはじまるプロファイルが補完されます。この辺りの補完の動作は、通常の TAB 補完と同じです。

全て補完してからエンターキーをおすと、そのプロファイル名が AWS_PROFILE 環境変数にセットされます。

メニューセレクト

aws-profile のみ、あるいは中途半端に補完した状態でエンターキーをおすと、選択メニューが現れます。

右には、現在選択中のプロファイルの内容(空行から空行までの範囲)が表示されています。highlight にてシンタクスハイライトされているので内容把握しやすいかと思います。

また同時に、現在有効な設定ファイルのパスも表示しています。 AWS CLI は環境変数 AWS_CONFIG_FILE にて設定ファイルのファイル名を変更することが出来るので、それに対応しています。指定がなかった場合は当然デフォルトの ~/.aws/config が読み込まれます。

メニューには fzf を使っているので、とうぜん絞り込みも可能です。

メニューを開いても、CTRL+C でキャンセルが可能です。その場合は何もセットされません。

環境変数のクリア(unset-aws-profile)

unset-aws-profile を実行すると、下記環境変数をクリア(unset)します。

  • AWS_PROFILE, AWS_DEFAULT_PROFILE
  • AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY
  • AWS_SESSION_TOKEN
  • AWS_SESSION_EXPIRATION
  • AWS_DEFAULT_REGION

なおこのコマンドは、 aws-profile にて AWS_PROFILE 環境変数をセットする直前にも呼ばれます。

導入

導入方法をご説明します。やることは以下の 3つです:

  • ファイルをひとつダウンロードする
  • 依存しているツール類をインストールする
  • 初期設定ファイルに読み込み設定を追記

1. .bash_profile_aws-profile のダウンロード

Gist から .bash_profile_aws-profile をダウンロードし、ホームディレクトリに置いて下さい。パーミションは read さえあれば良いので、特に触る必要はありません。

cd ~
curl -fsSLO https://gist.githubusercontent.com/cm-watanabeseigo/0a103315529d502ce4a82d2a8aab6cd3/raw/8a2dcb80e4c5971551717062aa1d24e810538b37/.bash_profile_aws-profile

2. 依存関係のあるツールのインストール

依存している下記ツールをインストールして下さい。

macOS の場合では Homebrew をつかって導入できます。

brew install fzf highlight

なお、正規表現によるテキストの加工に Ruby も使用しているので、デフォルトで使用できない環境の場合は別途インストールをお願いします。macOS Mojave のデフォルト(2.6.1)で動作を確認しました。

3. ログイン時読み込み設定の追加

お使いの .bash_profile に以下を追記します。どこでもいいですが末尾辺りでよいでしょう。

if [ -f ~/.bash_profile_aws-profile ]; then
  . ~/.bash_profile_aws-profile
fi

なお自分の環境のくせで .bash_profile に追記していますが、もちろん .bash_aliases.bashrc など、お使いの環境の流儀にあわせてもらって構いません。

4. .bash_profile_aws-profile の読み込み

下記を実行して、ダウンロードした .bash_profile_aws-profile を環境に読み込みましょう。あるいは 3. で .bash_profile に書き込んでいるので、別ターミナルを起動するでも良いです。

. ~/.bash_profile_aws-profile

以上で準備完了です!

コード

コメント含めて 80行くらいですので、ここにも埋め込みます。

  • 主要関数
    • aws-profile ... 引数を渡しつつ select-aws-profile を呼び出し、プロファイルが選択されたら環境変数にセット
    • unset-aws-profile ... AWS環境変数をクリア
  • 補助関数
    • list-aws-profile ... プロファイルの一覧を生成
      • 正規表現で一覧を取り出すために Ruby を使用
    • select-aws-profile ... プロファイルの選択メニューを表示
      • CLI メニュー表示のために fzf を使用
      • fzf のプレビュー機能にて、シンタクスハイライトを行うために highlight を使用
      • 正規表現で該当する設定部分を取り出すために Ruby を使用
  • Complete設定
    • complete -C list-aws-profile aws-profile(80行目)
    • aws-profile に対する TAB 補完データとして、list-aws-profile を呼び出すよう設定

まとめ

「ぼくのかんがえたさいきょうのAWS_PROFILE環境変数設定環境」を作ってみました。ひとにより状況は様々で、例えば direnv がぴったりハマる状況もあろうかと思います。この機会に、普段煩雑な「AWS環境変数の設定」作業手順を見直してみるのは如何でしょうか。

なお今回使ったツールのうち、 fzf (や peco ( https://github.com/peco/peco ) )はちょっとした CLI メニューを手軽に作れますし、highlight はターミナル上で手軽にシンタクスハイライト処理をすることが可能なので応用が利きそうです(HTML 等として出力することもできます)。それに TAB 補完のやり方が整理できたのも良かったと思ってます。何かの参考になれば幸いです。

参考

脚注


  1. 先日 ~/.aws/config 内のプロファイル数を数えてみたら 11 個ありました 
  2. 【小ネタ】複数のSwitch Roleでのクロスアカウントアクセスをブラウザのブックマークで管理する | DevelopersIO 
  3. AWS IAM Switch Roleのリストを増やすChrome Extensionを作った - tilfin's note 
  4. 昔は AWS_DEFAULT_PROFILE を使っていたんですが、今でこちららしいです…本環境では一応同時に両方設定するようにしています 
  5. ZSHにも強力な補完機能があるので、やりようによっては使えるようにすることも可能と思うのですが、ZSHは普段使っていないので…