この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
サーバのログインを楽にするために「~/.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