オプションで長くなるAWS CLIをスニペットマネージャーで簡単に実行する

こんにちは。大阪の市田です。
今回はコマンドラインの実行を簡単に実行できるスニペットマネージャをご紹介します。

背景

覚えられないコマンドの存在

普段の業務では、MacからAWS CLIの実行やサーバへのログインなどを行っています。
しかし、どうしても覚えられないコマンドってありますよね?

例えば、AWS CLIでオプションをたくさん付けたり、jqで書式を整理して実行したりする時、どうしてもコマンドが長くなってしまいます。
下記は、EC2インスタンスに対して、インスタンスタイプとプライベートIP、Nameタグの内容を表示するAWS CLIの内容です。

aws ec2 describe-instances | jq -r '.Reservations[].Instances[] | .InstanceType + "\t" + .PrivateIpAddress + "\t" + (.Tags[]? | select(.Key == "Name")).Value'

これを「自分のメモからコピペ」でもいいんですが、もっと簡単に効率的に管理したいと思います。

スニペットマネージャ「pet」

ということで、Go製の「pet」というコマンドラインのスニペットマネージャをご紹介します。シンプルなのでとても使いやすいです。

knqyf263/pet: Simple command-line snippet manager, written in Go.

petでできること

  1. コマンドスニペットを簡単に登録できる
  2. スニペットはインタラクティブに検索できる
  3. スニペットを直接実行できる
  4. スニペットの内容はTOML形式のファイルで管理できる
  5. Gistと同期できる

便利そうですね。

petを使ってAWS CLI実行

petを使うと、最初に紹介したAWS CLIの実行が下記のように簡単に登録、実行できるようになります。細かい使い方はこの後で説明しています。

petnewec2

インストール

petの利用にはpecoがインストールされている必要があります。もしインストールされていなければ、最初にインストールしておきます。

brew install peco

次に、petのインストール方法はいくつかありますが、Go製なので今回はバイナリをそのまま利用することにします。下記から環境に合わせたものをダウンロードして下さい。
ダウンロードできたら適当なパスに保存します。私の場合は/usr/local/binに保存しました。

knqyf263/pet: Latest release

petでコマンド管理

では早速使ってみます。

コマンド登録

まずは、簡単にls -lを登録してみます。登録はnewコマンドを使います。
「Command:」で登録したいコマンドを入力し、「Description:」でコマンドの説明を記載します。

pet new

Command: ls -l
Description: show all files

もう一つ登録してみます。

pet new

Command: curl ifconfig.io
Description: show my ip address

登録コマンドの表示

登録したコマンドを表示するにはlistコマンドを使います。下記のように登録されたコマンド内容が表示されます。

pet list

Description: show all files
    Command: ls -l
------------------------------
Description: show my ip address
    Command: curl ifconfig.io
------------------------------

登録内容の保存ファイル

登録した内容はTOML形式のファイルに保存されています。このファイルのパスはconfigureコマンドで確認出来ます。

pet configure

configureコマンドを実行すると、指定されているエディタ(デフォルトはvim)でpetのコンフィグファイル(~/.config/pet/config.toml)が開きます。

[General]
  snippetfile = "/Users/xxxxxxxxx/.config/pet/snippet.toml"
  editor = "vim"
  column = 40
  selectcmd = "peco"

[Gist]
  file_name = "pet-snippet.toml"
  access_token = ""
  gist_id = ""

ここで設定されているパスのTOMLファイルを直接編集することも出来ますが、スニペットの編集にはeditコマンドが利用できます。 editコマンドにより、指定のエディタでTOMLファイルを開くことが出来ます。

pet edit

コマンドの実行

execコマンドで登録したスニペットからコマンドを実行します。

pet exec

下記のように実行したいコマンドを選択できるようになります。さらにQueryでインタラクティブに検索することも出来ます。

01-petexec

実行したいコマンドを選択してEnterで実行できます。

02-petexecifconfigio

コマンドの検索

searchコマンドで、コマンドを実行せずに、実行したいコマンドを検索、表示することも可能です。

pet search

先程のexecコマンドのように対象をインタラクティブに検索できます。

03-search

対象を選択すると登録されている内容が表示されます。コマンドの引数だけ変えたい場合などに利用できます。

04-searchresult

Gistとの同期

後、少し変わった機能としてGistとの同期を行うことが出来ます。例えば、他のPCで同じスニペット内容を利用したい場合に便利です。
pet configureで開く設定ファイルに設定箇所があります。ここにGistへのアクセストークンと対象のGist IDを指定します。

[Gist]
  file_name = "pet-snippet.toml"
  access_token = ""
  gist_id = ""

同期させるにはsyncコマンドで-uオプションを使います。

pet sync -u
Upload success

これでローカルのスニペットファイルの内容がGist上で同期されます。ファイル名は先程の設定ファイルのfile_nameで指定した名前になります。デフォルトで「pet-snippet.toml」というファイル名です。

05-gistsync

syncコマンドをオプション無しで実行するとGistの内容をダウンロードして、petで利用できるようになります。
確認してみます。まずはpet editで登録内容を削除します。

pet list
(何も表示されない。つまり登録がない状態。)

次にスニペットの内容をダウンロードしてみます。

pet sync
Download success

ダウンロードできたらリスト表示してみます。確かに同じスニペットが使えるようになっています。

pet list

Description: show all files
    Command: ls -l
------------------------------
Description: show my ip address
    Command: curl ifconfig.io
------------------------------

スニペットをクリップボードにコピー

pbcopyを使うことでスニペット内容をクリップボードにコピー出来ます。例えばクリップボードに実行したいスニペットをコピーした状態で、サーバにSSHログインしてコピー内容を貼り付けて実行、といった使い道があります。

pet search | pbcopy

上記のコマンドを実行すると、pet searchの表示になるので、コピーしたいものを選択します。

06-pbcopysearch

この状態でクリップボードに選択したコマンドがコピーされています。後は利用しているPCに合わせたペーストを行うだけです。
特別なペースト用の実行はありません。WindowsならCtrl + Vというように、OS標準のペーストを実行するだけです。

直前のコマンドを簡単に登録

コマンドの登録はpet newでも行えますが、直前のコマンドならもっと簡単に登録できます。
下記の内容を~/.zshrcを追加します。

function prev() {
  PREV=$(fc -lrn | head -n 1)
  sh -c "pet new `printf %q "$PREV"`"
}

zshで動くのでシェルをzshに変更します。

zsh

登録したいコマンドを実行します。

date +%Y%m%d%H%M%S

コマンドの実行後にprevと入力すると、上記のコマンドに対してpet newした時のDescriptionの入力待ちになります。
後は、Descriptionを入力するだけで完了です。便利ですね。

prev

Command: date +%Y%m%d%H%M%S
Description: (ここで入力待ちになります)

最後に

AWS CLIはどうしても1回のコマンド内容が長くなりがちですが、petのようなコマンドスニペットが利用できると作業効率の向上が期待できそうです。
私の場合は、長いコマンドやスペル的にどうしても覚えづらいコマンド(Raspberry PiへのSSHログイン等)を登録して使っています。

なかなか便利ですので、是非一度お試し頂ければと思います。

以上になります。