Peco & ec2list で快適にEC2インスタンスにSSHする


AWSのAPIをカジュアルに」の 24 ページ目に"Unix的な小道具を作る"とあるのですが、これがとても便利そうでした。
何をするのかというと EC2 インスタンスの一覧を取得し、選択したホストに SSH します。
というわけでさっそく Zsh に設定してみました。

事前準備

IAM Management Console」に登録して API のアクセスキーを発行し、~/.aws/config に保存しておく。
この時に role をあたえていなくて API にアクセスできていなかったので要注意。

Peco をインストール

Homebrew を使っている場合

$ brew tap peco/peco
$ brew install peco

Go の環境がある場合

$ go get github.com/peco/peco/cmd/peco

ec2list をインストール

$ gem install ec2list

(※) ec2list は memoize しているので毎回リクエストが発生するわけではありません。

$ ec2list

これで一覧が表示されていれば成功です。
default 以外の profile を使用する場合は以後、 s/ec2list/ec2list --profile [profile名]/ で置換してください。
エラーがでる場合は Policy の設定がおかしいか、~/.aws/config の設定がおかしいかだと思います。

Zsh の設定

$ ec2list | peco | cut -f 3 | xargs -o -n 1 ssh

このコマンドで選択したホストに SSH ができれば成功です。
毎回これを実行するのもめんどくさいので alias か、もしくは keybind を設定しておけば幸せになれるかと思います。

alias

~/.zshrc
alias peco-ec2ssh="ec2list | peco | cut -f 3 | xargs -o -n 1 ssh"

keybind

~.zshrc
function peco-ec2ssh() {
  echo "Fetching ec2 host..."
  local selected_host=$(ec2list | peco | cut -f 3)
  if [ -n "${selected_host}" ]; then
    BUFFER="ssh ${selected_host}"
    zle accept-line
  fi
  zle clear-screen
}
zle -N peco-ec2ssh

bindkey '^q' peco-ec2ssh

こうすることによって ^q を押せば SSH できるようになりました。
便利ですね。

Peco と ec2list の組み合わせでやりましたが、ec2sshgrep -E '^Host[[:space:]]+[^*]' ~/.ssh/config | peco | awk "{print \$2}" | xargs -o -n 1 ssh の組み合わせでもいいと思います。

ではでは。