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できてませんがちゃんと使えます。 (実環境の実行結果は載せられないので泣く泣くダミーです…)
※クライアントPCからパブリックIPとかで直接SSHできない場合はプロキシコマンドを利用して踏み台経由とかでプライベートIPできるssh-configを設定しておくと、この応用例を使って透過的にSSHできます(これは別記事としたほうがよいかも?)
余談
さいごの応用例はもともとaws-cli + jq + pecoで実現していたのですが、管理台数が増えるに連れてレスポンスが極端に劣化。 キャッシュ機構を入れてみたりしたものの、快適とはいえない状況になったので、「aws-sdk-goで書くだけで軽くなるのでは?」という発想から開発に至りました。
mackerel導入環境であればmkr
でも似たようなことができるかもしれないですが、mackerel前提ではないソリューションとしても十分使えるかな、と。
社内利用に特化したかたちでつくったものの、ちょっとだけ汎用化すればべつに誰でも使えるようなきがしたので、手を加えたうえでgithubにて公開となりました。 まだまだ貧弱ですが、最低限役目は果たしています。