↓のgifのように、awsのリソース(ec2のインスタンス、RDSのDBインスタンス等)を一覧で表示し、選択できるコマンドを作りました。
動機
AWS CLIの以下の2つのサブコマンドは非常に便利です。
- CloudWatch Logsのロググループに対してtail -fできるaws logs tail --follow
- ブラウザではなく、普段使ってる仮想端末でsshみたいなことができるaws ssm start-sessoin
ただ、これらのコマンドを利用する際、tailではロググループ名、start-sessionではec2のインスタンスIDを要求されます。ロググループ名は/aws/xxx/xxxxxxxみたいなやつで、インスタンス名はi-00000000000みたいなもので、自分はどちらも全く覚えることができません。
今年2月に一般利用可能になったAWS CLI v2ではパラメータ名に加え、値となるリソース値も補完してくれるようになったのですが、start-sessionの場合、補完対象のインスタンスIDがi-00000000000形式で列挙されるだけなので、この場面において、自分にとってはほぼ無力な機能です。
aws ssm start-session --targetを入力してからタブキーを押すとこのような状態になります。選ぶための手がかりがない……。
$ aws ssm start-session --target i-0
i-01dbc40d8766f2e2a i-04075abf1e235eca7 i-0a3e5b84784834154 i-0d3a413486b29ec6e
i-01c08ae12cf4ec1dc i-02fade28796f8cbe8 i-0d71d42852cc2979f i-0e51e9f37b37d987e
つくったもの
この事態に対処すべく、hrkkというコマンドを作りました。指定されたリソースをawsのAPIから取得し画面に表示、ファジーファインダー(skimを使ってます)を使って選択、選択されたもののIDを標準出力に返します。たとえば、hrkk ec2 instanceとして実行すると、ec2 instanceのNameタグの値、インスタンスIDなどを一覧で表示し、選択されたインスタンスのインスタンスIDを標準出力へ返します。
aws logs tailならロググループの名前が必要なので、
$ aws logs tail --follow $(hrkk -r 10 logs log-group)
とすることで、アカウントに存在するロググループ名のリストを表示、あいまい検索して絞り込んでから選択し、そのロググループをtailすることができます。自分はbashを使ってるので$()ですが、他のシェルにも同じような機能があると思います(よく知りません)。あと、実際には↑のコマンドも覚えられないので、naviというチートシートツールに上のコマンドを登録して使っています。
*) -r オプションはリクエスト発行上限数です。aws APIのdescribe-XX系のコマンドは、一回の取得数に上限が設けられているため、繰り返しリクエストして取得する前提なのですが、あまりにも多数リクエストするとコストもかかるので、オプションで上限を指定してます。デフォルトは1なので、1リクエストで取得できる分しか取得しません
イメージが湧きづらいと思うので、用意したgifが一番↑のものです。
もともとは上記2つのコマンドのパラメーターを入力しやすくするために作り始めたのですが、コンソールからAWSの状態が確認できるとなんか面白いということがわかったので、現状、
- ssm : session, document, automation-execution
- rds : db-instance
- logs : log-stream, log-group
- ec2 :instance
- cloudwatch : alarm-history, alarm
などが追加してあります。
また、--exportオプションを使用すると、選択したリソースの情報をyamlで現在のディレクトリに出力できます。これはこの2つって設定おなじに見えるけど実際にはどこか違うの?というのをdiffで確認したりするのに使えます。
ちなみに複数選択する場合はタブキーを使用します。一覧の表示はskimをライブラリとして組み込んで使用しているので、キーバインド等はskimのreadmeを参照ください。
画面右のpreviewは自分がリソースを選択する際に見そうな項目を適当に抽出してあります。全部見たい場合は、~/.cache/hrkk 以下にcache用にレスポンスが保存されるので、そっちをご覧ください。
インストール
homebrew
homebrewが使えるlinuxかmacであれば、
brew install K2Da/tap/hrkk
でインストールできると思います。自分の環境以外では試せてない(macも持ってない)ので動かなかったらすいません。
homebrewを利用してますが、homebrewのFormulaにはbin.installを指定してあり、実際にはreleaseページのバイナリをコピーするだけになっています。ビルドターゲットは、linuxがx86_64-unknown-linux-musl、macがx86_64-apple-darwinです。逆に言うと、homebrewがない場合は、バイナリをコピーすれば動くと思います。
cargo
cargo環境がある方は、cargo install hrkkで良いと思います。
AWS cli設定
aws cliが動作するのに必要な設定(~/.aws/以下のファイル、もしくは環境変数)が必要です。hrkkを使うだけなら、aws cli自体は不要です。
Rusotoの認証を使っているので、基本的にaws cliと同じ順番でプロファイルを選択するようになっており、
- --profileオプションがあれば、指定されたプロファイル
- なければ環境変数
- 環境変数もなければdefaultプロファイル
を使います(はずです)。
describe-XX系の権限あるけどMFAしないと使えない、もしくはMFA + assume roleが必要、という方は、ngydvという別のコマンドも作ったので併用すると便利かも知れません。こちらは、create-sessionやassume-roleして取得したtokenをファイルに出力しておき、環境変数に設定することでprofileを切り替えるためのコマンドです。