ec2-ls-hosts: EC2インスタンスを一覧するだけのシンプルツール

February 27, 2016 - golang

EC2インスタンスの一覧を表示するツールをgolangでつくりました。

以下のように、ただインスタンスの情報を列挙するだけのシンプルなツールです。

$ ls-hosts
i-00001 10.0.0.1 app01
i-00002 10.0.0.2 app02
i-00003 10.0.0.3 app03
i-00004 10.0.0.4 app04

何がうれしいか

以下のような状況において、多少便利になるツールです。

  • EC2インスタンスを複数台運用している
  • 台数が数十台規模である
  • AutoScalingを利用していて、IPやドメインが頻繁に変わる
  • aws ec2 describe-instancesのレスポンスが遅い
  • aws ec2 describe-instancesのオプション指定が複雑かつ指定が面倒

このような状況を改善するため、ec2-ls-hostsをつくりました。 このツールは、aws ec2 describe-instancesに変わる、シンプルなオプションを備えたCLIツールになります。

ec2-ls-hostsで出来ること

主に以下のオプションを備えています

  • -filters: 絞込み条件
  • -tags : タグによる絞込み
  • -fileds : 表示項目の設定

実行時のオプションでも指定できるのですが、いちいち指定するのは面倒なので、~/.ls-hosts/etc/ls-hosts に設定を保存できます。 このファイルが存在していたらそれを読み込みます。(両方ある場合は~/.ls-hostsのほうが優先されます) 設定はこんなかんじで。

[options]
tags   = Env:production,Role:app
fields = instance-id,tag:Name,public-ip,instance-state

認証は以下の優先順位で可能なものを利用します。

  • 環境変数 AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY
  • SharedCredentials (~/.aws/credentialsのdefaultプロファイルを利用)
  • EC2 Instance Profile

インスタンスプロファイルに対応しているので、たとえばEC2のReadOnly権限をを付与してあるゲートウェイインスタンスに配置することで、認証情報を直接管理せずに利用することもできます。

インストール方法

git clone https://github.com/ReSTARTR/ec2-ls-hosts.git
cd ./ec2-ls-hosts
make build -B
cp ./build/ls-hosts /path/to/bin/ls-hosts
  • コマンド名はls-hostsにしています。
  • $PATHの通っているところに配置してください:bow:

zsh + pecoでインタラクティブにSSHする

ec2-ls-hosts単体でも多少便利にはなるのですが、ツールを組み合わせた応用例も書いておきます。

たとえば以下のような結果が得られるEC2環境があったとします。

$ ls-hosts -filters instance-state-name:running -tags Env:production,Role:app -fields private-ip,tag:Name,tag:Role
10.0.0.1 app app01
10.0.0.2 app app02
10.0.0.3 app app03

これをpecoでインタラクティブに選択してそのままSSHするには、以下のようにzshrcを設定しておきます。

function peco-ec2-ls-hosts () {
  # NOTE: ~/.ls-hostsに設定したほうがより良いです
  BUFFER=$(
    ls-hosts -filters instance-state-name:running -tags Env:production,Role:app -fields private-ip,tag:Name,tag:Role | \
    peco --prompt "EC2 >" --query "$LBUFFER" | \
    awk '{echo "Login to %s; printf "ssh %s\n", $3,$1}'
  )
  CURSOR=$#BUFFER
  zle accept-line
  zle clear-screen
}
zle -N peco-ec2-ls-hosts
# キーバインドはおこのみで
bindkey '^oo' peco-ec2-ls-hosts

とすることで、インタラクティブにSSHできてヒストリーにも残ります。 以下キャプチャでは対象インスタンスがダミーなのでSSできてませんがちゃんと使えます。 (実環境の実行結果は載せられないので泣く泣くダミーです…)

https://gyazo.com/ae45206ad8215934f5e0a897b91b3d2a

※クライアントPCからパブリックIPとかで直接SSHできない場合はプロキシコマンドを利用して踏み台経由とかでプライベートIPできるssh-configを設定しておくと、この応用例を使って透過的にSSHできます(これは別記事としたほうがよいかも?)

余談

さいごの応用例はもともとaws-cli + jq + pecoで実現していたのですが、管理台数が増えるに連れてレスポンスが極端に劣化。 キャッシュ機構を入れてみたりしたものの、快適とはいえない状況になったので、「aws-sdk-goで書くだけで軽くなるのでは?」という発想から開発に至りました。

mackerel導入環境であればmkrでも似たようなことができるかもしれないですが、mackerel前提ではないソリューションとしても十分使えるかな、と。

社内利用に特化したかたちでつくったものの、ちょっとだけ汎用化すればべつに誰でも使えるようなきがしたので、手を加えたうえでgithubにて公開となりました。 まだまだ貧弱ですが、最低限役目は果たしています。