bashだけで簡単ec2 ssh接続(踏み台対応)


元々はプログラマでしたが、3年くらい前にインフラ(サーバー)エンジニアに転向。
そして半年前くらいからAWSデビューしました。

10月にAWS利用したサービスが無事リリースできたので、
そのときに作った、あったら便利かなツールを晒してみようと思います。
NGワード:車輪の再発明

ダウンロード

ssh-ec2.sh

特徴

  • ec2サーバーへのssh接続を、一覧から選んで接続ができる
    • ec2サーバー一覧を hostsや~/.ssh/configファイルに記載する必要なし
  • 踏み台サーバーを経由したssh接続にも対応
  • シェルスクリプト1ファイルのみで、他に必要なものはbashとsshとAWS CLI(python)のみ(ruby不要)
  • pecoにも対応
  • ついでに稼働状態やインスタンスタイプなども見れて便利

※EC2のHost名はTagのName項目で定義してある前提です

利用準備

  1. aws cliコマンドを利用できるようにしておく
  2. ssh-ec2.shを任意のディレクトリに配置
  3. shファイルの SSH_COMMAND と DESCRIBE_COMMAND(のfilter条件)を適宜変更

実行

実行すると、describe-instancesで取得したEC2一覧を番号をつけて整形して出力します。その後入力待ちになるので、ssh接続する番号を入力すると、そこにssh接続ができます。
pecoがインストールされてる場合、pecoを利用してカーソルキーで選択することでssh接続ができます。

FAQ

  • sshの接続portを22以外にしてるんだけど…
    • ~/.ssh/configに設定を書くことで対応可能です
~/.ssh/config
Host 52.1.1.1
  Port 2222

踏み台対応

踏み台サーバーを経由してsshするとき、通常であれば ~/.ssh/configファイルに EC2のサーバーの数だけ設定を書いていかないといけませんが、最強のSSH踏み台設定 を参考にすれば、個別設定を書かなくても接続できるようになります。

~/.ssh/config
Host */*
  ProxyCommand ssh -W "$(H="%h"; echo ${H##*/})":%p "$(H="%h"; echo ${H%%%%/*})"

Host 踏み台サーバーhost名
  HostName 52.1.1.1
  Port 2222

そして、ssh-ec2.shの設定ファイルで

SSH_COMMAND="ssh "SSH_COMMAND="ssh 踏み台サーバーhost名"
'sort_by(Reservations[].Instances[].{InstanceId:InstanceId,Tags:Tags[?Key==\`Name\`].Value|[0],InstanceType:InstanceType,State:State.Name,Ip:PublicIpAddress},&Tags)'
の
PublicIpAddress
を
PrivateIpAddress

と変更することで、PrivateIPしか持ってない 踏み台経由でログインするEC2へも、選択式で接続することができます。

スクリプト解説

  • 20行目
    • describe-instancesでEC2一覧をtext形式で取得して変数に代入
  • 22-28行目
    • そのままだと列項目の順番がばらばらで見にくいので、一旦取得して整形しています
  • 22行目
    • 18行目でシェルのデリミタを改行コードだけにしてあるので、行単位でforループがまわる
  • 23行目
    • 列の区切りはTABなので、デリミタにTABを指定
  • 24行目
    • set -- をすることで、TABで区切られた値が\$1, \$2, .. という変数に代入
  • 25行目
    • IPアドレスは後でsshするときに使用するので、配列に代入
  • 26行目
    • 表示用に整形
  • 29行目
    • 整形後のデータをそのまま出力すると、テキスト文字数がバラバラなため 列がきれいに並ばないため、columnコマンドを利用してきれいにしている
  • 31-40行目
    • pecoがある場合、pecoを利用して選択する
    • pecoがなければ、番号をキー入力する
  • 41-42行目
    • 選択項目が数値で、サーバーリストに含まれてるかチェック
  • 45行目
    • 選択した番号に該当するIPアドレスを配列から取得してSSH接続

簡単にssh接続できるように ~/.ssh/config を動的に書き換えたり、接続先をpecoで指定する、といったやり方は見かけましたが、その辺のやり方を参考にしつつ、EC2での接続しやすさに特化したマッシュアップ的なスクリプトになりました。
AWS始めて半年なので、もしかしたらこれとほぼ同じようなものもすでにあるかもしれませんが、そのときは勉強になったということで・・