AWSのリソースを列挙して選択するコマンドを作った

↓のgifのように、awsのリソース(ec2のインスタンス、RDSのDBインスタンス等)を一覧で表示し、選択できるコマンドを作りました。


![Peek 2020-06-19 22-06.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8753/3ef209b2-f3b3-fd2a-2996-e661100ec6c1.gif)

## 動機
AWS CLIの以下の2つのサブコマンドは非常に便利です。

- CloudWatch Logsのロググループに対してtail -fできる[aws logs tail  --follow](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/logs/tail.html)
- ブラウザではなく、普段使ってる仮想端末でsshみたいなことができる[aws ssm start-sessoin](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-working-with-sessions-start.html#sessions-start-cli)

ただ、これらのコマンドを利用する際、tailではロググループ名、start-sessionではec2のインスタンスIDを要求されます。ロググループ名は/aws/xxx/xxxxxxxみたいなやつで、インスタンス名はi-00000000000みたいなもので、自分はどちらも全く覚えることができません。

今年2月に一般利用可能になったAWS CLI v2ではパラメータ名に加え、[値となるリソース値も補完してくれるようになった](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-completion.html)のですが、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](https://github.com/K2Da/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](https://github.com/denisidoro/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](https://github.com/lotabout/skim#key-bindings)を参照ください。

画面右のpreviewは自分がリソースを選択する際に見そうな項目を適当に抽出してあります。全部見たい場合は、~/.cache/hrkk 以下にcache用にレスポンスが保存されるので、そっちをご覧ください。

## インストール
### homebrew
homebrewが使えるlinuxかmacであれば、

```
brew install K2Da/tap/hrkk
```

でインストールできると思います。自分の環境以外では試せてない(macも持ってない)ので動かなかったらすいません。

homebrewを利用してますが、homebrewのFormulaにはbin.installを指定してあり、実際には[releaseページ](https://github.com/K2Da/hrkk/releases/)のバイナリをコピーするだけになっています。ビルドターゲットは、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](https://github.com/K2Da/ngydv)という別のコマンドも作ったので併用すると便利かも知れません。こちらは、create-sessionやassume-roleして取得したtokenをファイルに出力しておき、環境変数に設定することでprofileを切り替えるためのコマンドです。