Help us understand the problem. What is going on with this article?

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

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

Peek 2020-06-19 22-06.gif

動機

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

ただ、これらのコマンドを利用する際、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を切り替えるためのコマンドです。

K2Da
プログラマーです。
http://d.hatena.ne.jp/ps1/
stmn-co
名古屋のITスタートアップベンチャーです。「一人でも多くの人に、感動を届け、幸せを広める。」の経営理念のもと、 エンゲージメント経営コンサルティング「TUNAG」などのサービスを展開しています。
https://stmn.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした