【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
を使ったら理想に近いことが出来ることが分かりました(著者の平野さんに感謝!)。
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 補完のやり方が整理できたのも良かったと思ってます。何かの参考になれば幸いです。
参考
- Bash-Completion で複雑な補完をする - いますぐ実践! Linuxシステム管理 / Vol.236
- [ターミナル]fzfを使った自作インタラクティブアプリを作ってみよう!〜git addを快適に〜 | DevelopersIO
- 環境変数 - AWS Command Line Interface
脚注
-
先日
~/.aws/config
内のプロファイル数を数えてみたら 11 個ありました ↩ - 【小ネタ】複数のSwitch Roleでのクロスアカウントアクセスをブラウザのブックマークで管理する | DevelopersIO ↩
- AWS IAM Switch Roleのリストを増やすChrome Extensionを作った - tilfin's note ↩
-
昔は
AWS_DEFAULT_PROFILE
を使っていたんですが、今でこちららしいです…本環境では一応同時に両方設定するようにしています ↩ - ZSHにも強力な補完機能があるので、やりようによっては使えるようにすることも可能と思うのですが、ZSHは普段使っていないので… ↩