Amazon EC2 で SSH するなら ec2-ssh が便利

AWSを本格的に使い始めて約3ヶ月になる新参者です。 便利過ぎて今までの時間を返して欲しいくらいなのですが過ぎたものは仕方ないので前に進みましょう。

ec2-ssh

EC2 への SSH 接続

Amazon EC2 上のインスタンスにSSH接続するベーシックな方法は

ssh -i /path/to/pk.pem ec2-user@ec2-xxx-xxx-xxx-xxx.compute-1.amazonaws.com

ですが、これでは何のサーバに接続しているのかさっぱり分からないのでこのまま運用している人はまずいないでしょう。 (AWS Management Console から毎回コピペでがんばっている人はいそう)

~/.ssh/config

おそらく多くの人は ~/.ssh/config の設定にそれぞれ工夫を凝らしているのかと思われますが、 インスタンス数が増えてくると ~/.ssh/config の更新も煩わしくなります。 また Auto Scaling 等のダイナミックな運用になるととても追いつきません。

既存サポートツール

ec2ssh

その煩わしさを解消するツールとして ec2ssh という ~/.ssh/config の更新を半自動化してくれるものがあります。 (see. Amazon EC2インスタンスに簡単にSSHできるようになるツールec2sshを公開しました)

ただこれもコマンド一発とはいえ更新作業が必要になり、私にはこれも煩わしく感じました。 更新を忘れると期待と異なるサーバにアクセスしてしまう可能性もあります。

ec2-ssh

そこで登場するのが ec2-ssh です。(が、まだ本題ではありません!)

これは Instagram エンジニアが作ったツールで ~/.ssh/config の編集無しにダイナミックに解決するタイプになります。 (see. Simplifying EC2 SSH Connections)

私の趣味的にはこちらの方がマッチしていたので2,3日使ってみたのですが、以下の点で不満がありました。

不満点

  • ssh のオプションと互換性がない
  • ユーザ名を省略した時に ~/.ssh/configUser 設定が有効にならない
  • Python が必要

別に Python が嫌なわけではなくてシェルスクリプトで十分に書けるものなのにわざわざ 依存関係を増やしたくないというだけです。

(やっと本題) 作ってみた

というわけで、仕様・実装ともにもっとシンプルにした yet another ec2-ssh を作ってみました。

特徴

  • ~/.ssh/config の更新不要
  • ssh の単なるラッパーなので ssh と全く同じように利用可能
    • ホスト名の部分を解決して置換しているだけ
  • Pure シェルスクリプト No Requirements
    • ただしWindowsは考慮してません。Cygwin とかなら多分動く。
  • 同じ名前が付いたインスタンスへの接続にも対応

インストール

ec2-api-tools

まず前提として ec2-api-tools が動く 環境になっていることが求められますが AWS 使っている人であれば設定済みでしょう。

利用するコマンドは ec2-describe-instances のみです。

Mac なら、

brew install ec2-api-tools

で OK。

環境変数で以下を適切に設定すれば動くはずです。

  • AWS_ACCESS_KEY
  • AWS_SECRET_KEY
  • EC2_HOME
  • EC2_URL
  • EC2_REGION

ec2-ssh

gist に置きました。ec2-ssh

まだパッケージングしてないけどシェルスクリプト1つなので以下のような手順で。

wget https://gist.github.com/migrs/5157665/raw/736e5940279ba92040400d21071b0cf6a392ce5d/ec2-ssh -P /path/to/bin/
chmod +x /path/to/bin/ec2-ssh

利用方法

web1 という名前がついたサーバにSSH接続

ec2-ssh web1

ユーザ名を指定

ec2-ssh jonny@web1

同名インスタンスへの接続。上から3番目(作成順)。

ec2-ssh web#3

ポートフォワーディング

ec2-ssh -L 8080:127.0.0.1:80 web1

コマンド直接実行

ec2-ssh web1 ls -la
ec2-ssh web1 tail -f /var/log/nginx/access.log
ec2-ssh web1 vmstat 1
ec2-ssh web1 -t top
ec2-ssh web1 -t sudo service nginx restart

いい感じですね。

続き

新参なので知らないだけなのかもしれません。 もっと良い何かがあったら是非教えてください。

この記事には続きがあります。もっと便利な何かを紹介します。