くずきのblog

技術とか色々

tmux + ssh + peco + direnvで複数のAWSのサーバーへログインするやり方

どうも、くずきです。
今回は自分がいつも使っているスクリプトについて紹介したいと思います。
(色々な方のスクリプトをパクってくっつけてるだけですw)

tmuxの導入

github.com

tmuxとは端末を多重化するツール(ソフト)。
これだけでも色々かけるんだけど、色々な人がやってくれてるからグーグルで最上位にきてた記事だけ貼っとく。

qiita.com

tmux + sshで複数ホストへの同時接続

tmuxではサーバーの複数のホストへ同時に接続できる。
完成形録画したかったのだが、、ちょっとうまく撮れなかったので参考サイトでイメージつかんで欲しい。

blog.yuuk.io

また、この記事にあるtsshというtmuxで簡単に同時接続できるスクリプトがあるのでそちらを使う。記事からスクリプトのリンクが切れてるため一応貼っとく。
(ブログ兼スクリプトの作者様ありがとうございます・・・)

github.com

tsshコマンドとして使いたいため、/usr/local/bin/tsshに中身をコピーしておく。
ただ、今回の使いかだと少し改造する必要があるため、一部変更させてもらう。

# cmd="ssh $SSH_OPTION $host" 
cmd="ssh $SSH_OPTION $USER@$host" # $USERを追加

pecoの導入

github.com

pecoとはコンソールから標準入力を検索し、その検索結果を標準出力として返すことができる検索ツールみたいなもんである。
ここらへんもたくさん導入方法あるから頑張って入れよう。

AWS CLIの導入

AWS コマンドラインインターフェイス(CLI - AWS サービスの制御・管理)|AWS

コンソールからAWSにログインするためには、公式が用意しているCLIを入れる。
また、AWSからのJSONレスポンスを扱いやすくするために、jqと言われるJSONの扱いに長けたツールもいれとく。

https://stedolan.github.io/jq/

tssh + peco + aws cli(+jq)を使ったログイン

/usr/local/bin/floginに以下のコードをコピペしよう。
ちなみになんでfloginかというと、ファイナルログインの略だ。

iplist=$(aws ec2 describe-instances --filters "Name=instance-state-name,Values=running" "Name=tag:Name,Values=*" | jq -r '.Reservations[].Instances[] | {InstanceName: (.Tags[] | select(.Key=="Name").Value), PublicIpAddress} | "\(.InstanceName) \(.PublicIpAddress)"' | sort | peco | cut -d " " -f 2)
tssh $iplist

何をしているかというと、AWS CLIrunning中のEC2情報をとってきて、jqでホスト名 + IP に整形している。
その後pecoに渡すことで検索(複数選択)を可能とし、そこから標準出力でIPのリストをスペース区切りで出力し、tsshに渡している。

これだけでも同時ログインができて便利だが

# aws cliで使う
export AWS_ACCESS_KEY_ID=access_id
export AWS_SECRET_ACCESS_KEY=secret_key

# tsshでのsshログイン時に使う
export SSH_OPTION="-i ~/.ssh/xxx.pem"
export USER=ec2-user

環境ごとにこれらを設定しなくてはいけない。

direnvで環境ごとにexport

github.com

direnvディレクト単位で変数を設定できる。マジ便利。
ディレクトリの中で

direnv edit .

で環境ごとにexport設定をしてあげればよい。
自分の使い方は/会社/サービス名/環境(本番など)で区切っている。
設定が終わったら、あとは入りたい環境にcdして、floginを実行すればいい。

終わりに

だいぶインストールはしょったけど、個人や自分の会社、他社さんのサービスを同時に管理している時はほんと助かってる。
改善点としては、AWSのログイン時に指定したサービスしかそもそもでないようにしたいなぁと。そしたらpecoもいらなくなるか・・・。(それはそれで使いづらいかもだけど・・)