ec2sshとpecoでsshログインを楽しもう

2015.03.04

はじめに

サーバのログインを楽にするために「~/.ssh/config」を編集しているかと思いますが
ec2sshというツールで自動的に「~/.ssh/config」を編集してくれるツールがあります。

また「peco」というツールを組み合わせることで少しカッコよくサーバへログインできるので紹介したいと思います。

・ec2ssh
https://github.com/mirakui/ec2ssh

・peco
https://github.com/peco/peco

pecoをインストールする

$ brew install peco 

ec2sshをインストールする

$ gem install ec2ssh 

ec2sshを使ってみる

環境変数をセットする

$ export AMAZON_ACCESS_KEY_ID=“XXXXX" 
$ export AMAZON_SECRET_ACCESS_KEY=“XXXXXX" 
$ export AWS_DEFAULT_REGION="ap-northeast-1" 

後ほど出てくる設定ファイルに直接書いてもいいのですが、
クレデンシャルキーは~/.aws/credentials以外書き込まないほうがいいので
環境変数でセットしました。

ec2ssh initを実行する

$ ec2ssh init
Generated /Users/***/.ec2ssh
Please check and edit /Users/***/.ec2ssh before run `ec2ssh update`
Added mark to /Users/***/.ssh/config 

実行すると.ec2sshができます。

$ cat .ec2ssh
path '/Users/***/.ssh/config'
aws_keys(
  default: {
    access_key_id: ENV['AWS_ACCESS_KEY_ID'],
    secret_access_key: ENV['AWS_SECRET_ACCESS_KEY']
  },
  # my_key1: { access_key_id: '...', secret_access_key: '...' }, ...
)
regions ENV['AWS_REGION'] || ENV['AMAZON_REGION'] || ENV['AWS_DEFAULT_REGION'] || 'us-east-1'
# Enable regions as you like
# regions *%w(ap-northeast-1 ap-southeast-1 ap-southeast-2 eu-west-1 sa-east-1 us-east-1 us-west-1 us-west-2)

# You can use methods of AWS::EC2::Instance.
# See http://docs.aws.amazon.com/AWSRubySDK/latest/AWS/EC2/Instance.html
host_line <<END
Host <%= tags['Name'] %>.<%= availability_zone %>
  HostName <%= dns_name || private_ip_address %>
END

ec2ssh updateを実行する

$ ec2ssh update
### EC2SSH BEGIN ###
# Generated by ec2ssh http://github.com/mirakui/ec2ssh
# DO NOT edit this block!
# Updated 2015-03-04T21:31:26+09:00
# section: default
Host app-server.ap-northeast-1c
  HostName ec2-5X-XX-XX-XX.ap-northeast-1.compute.amazonaws.com
Host web1-server.ap-northeast-1a
  HostName ec2-6X-XX-XX-XX.ap-northeast-1.compute.amazonaws.com
Host web2-server.ap-northeast-1c
  HostName ec2-7X-XX-XX-XX.ap-northeast-1.compute.amazonaws.com
### EC2SSH END ###

Updated /Users/***/.ssh/config

これで、~/.ssh/configに上記内容が記載されます。

ログインする

$ ssh web1-server.ap-northeast-1a -l ec2-user -i .ssh/***.pem 

これだとまだ、鍵とユーザ名を指定する必要がありますね。
先ほどの、「.ec2ssh」を修正することでもっとうまくいきそうだったので修正してみました。

.ec2sshを修正してみる

ユーザが同じ、鍵も同じ前提です。

$ vi .ec2ssh
path '/Users/***/.ssh/config'
aws_keys(
  default: {
    access_key_id: ENV['AWS_ACCESS_KEY_ID'],
    secret_access_key: ENV['AWS_SECRET_ACCESS_KEY']
  },
  # my_key1: { access_key_id: '...', secret_access_key: '...' }, ...
)
regions ENV['AWS_REGION'] || ENV['AMAZON_REGION'] || ENV['AWS_DEFAULT_REGION'] || 'us-east-1'
# Enable regions as you like
# regions *%w(ap-northeast-1 ap-southeast-1 ap-southeast-2 eu-west-1 sa-east-1 us-east-1 us-west-1 us-west-2)

# You can use methods of AWS::EC2::Instance.
# See http://docs.aws.amazon.com/AWSRubySDK/latest/AWS/EC2/Instance.html
host_line <<END
Host <%= tags['Name'] %>.<%= availability_zone %>
  HostName <%= dns_name || private_ip_address %>
  IdentityFile    ~/.ssh/***.pem   ★追加
  User            ec2-user         ★追加
END

更新してみる

更新方法は

ec2ssh update --aws-key keyname

keynameは.ec2sshの下記部分見てわかるようにec2sshは複数のアカウントの管理ができます。

aws_keys(
  default: {
    access_key_id: ENV['AWS_ACCESS_KEY_ID'],
    secret_access_key: ENV['AWS_SECRET_ACCESS_KEY']
  },
  # my_key1: { access_key_id: '...', secret_access_key: '...' }, ...
)
$ ec2ssh update --aws-key default
### EC2SSH BEGIN ###
# Generated by ec2ssh http://github.com/mirakui/ec2ssh
# DO NOT edit this block!
# Updated 2015-03-04T21:44:18+09:00
# section: default
Host app-server.ap-northeast-1c
  HostName ec2-5X-XX-XX-XX.ap-northeast-1.compute.amazonaws.com
  IdentityFile    ~/.ssh/cm-takahashiyusuke.pem
  User            ec2-user
Host web1-server.ap-northeast-1a
  HostName ec2-6X-XX-XX-XX.ap-northeast-1.compute.amazonaws.com
  IdentityFile    ~/.ssh/***.pem
  User            ec2-user
Host web2-server.ap-northeast-1c
  HostName ec2-7X-XX-XX-XX.ap-northeast-1.compute.amazonaws.com
  IdentityFile    ~/.ssh/***.pem
  User            ec2-user
### EC2SSH END ###

Updated /Users/***/.ssh/config

更新されました。
これでユーザ名、鍵を指定しないでログインできるようになりました。

pecoを使ってログインしてみる

「ec2ssh」や自分で「~/.ssh/config」を更新していくとものすごい数になってくると思います。
ホスト名をうる覚えだったりしてきますがpecoを使用することでホスト名を探すのが楽になります。

そこでログインする際に使用するコマンドは下記

$ grep -w Host .ssh/config | peco | awk '{print $2}' | xargs -o -n 1 ssh 

エイリアスでコマンド作ってもいいですね。

$ alias ssh-peco="grep -w Host ~/.ssh/config | peco | awk '{print $2}' | xargs -o -n 1 ssh"

上記コマンドを実行すると下記のようになります。

QUERY>
IgnoreCase [6 (1/1)]
Host ec2-5X-XX-XX-XX.ap-northeast-1.compute.amazonaws.com
Host ec2-6X-XX-XX-X.ap-northeast-1.compute.amazonaws.com
Host ec2-7X-XX-XX-X.ap-northeast-1.compute.amazonaws.com
Host app-server.ap-northeast-1c
Host web1-server.ap-northeast-1a
Host web2-server.ap-northeast-1c

QUERYに文字を入れていくと

QUERY> web
IgnoreCase [2 (1/1)]
Host web1-server.ap-northeast-1a
Host web2-server.ap-northeast-1c

webの文字列があるものだけになりました
さらに絞り込んでみます。

QUERY> web1
IgnoreCase [1 (1/1)]
Host web1-server.ap-northeast-1a

ここでEnterをクリックすると対象のHost名がxargsコマンドに渡されてログインができます。

$ ssh-peco
Last login: Wed Mar  4 12:54:46 2015 from p1182-ipbf1209souka.saitama.ocn.ne.jp

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2014.09-release-notes/
9 package(s) needed for security, out of 12 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-172-31-10-228 ~]$

まとめ

いかがですか?
ec2sshとpecoを組み合わせることで対象サーバを探すのが楽になりサーバへのログインするのが楽しく感じませんか?
ec2listというツールもあったのですが僕の環境だとエラーがたくさん出て今回はec2listとpecoの組み合わせは諦めました。
いつか挑戦したいです。

ec2list
https://github.com/a2ikm/ec2list