tmux + ssh + peco + direnvで複数のAWSのサーバーへログインするやり方
どうも、くずきです。
今回は自分がいつも使っているスクリプトについて紹介したいと思います。
(色々な方のスクリプトをパクってくっつけてるだけですw)
tmuxの導入
tmux
とは端末を多重化するツール(ソフト)。
これだけでも色々かけるんだけど、色々な人がやってくれてるからグーグルで最上位にきてた記事だけ貼っとく。
tmux + sshで複数ホストへの同時接続
tmux
ではサーバーの複数のホストへ同時に接続できる。
完成形録画したかったのだが、、ちょっとうまく撮れなかったので参考サイトでイメージつかんで欲しい。
また、この記事にあるtssh
というtmux
で簡単に同時接続できるスクリプトがあるのでそちらを使う。記事からスクリプトのリンクが切れてるため一応貼っとく。
(ブログ兼スクリプトの作者様ありがとうございます・・・)
tssh
コマンドとして使いたいため、/usr/local/bin/tssh
に中身をコピーしておく。
ただ、今回の使いかだと少し改造する必要があるため、一部変更させてもらう。
# cmd="ssh $SSH_OPTION $host" cmd="ssh $SSH_OPTION $USER@$host" # $USERを追加
pecoの導入
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 CLI
でrunning
中の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
direnv
はディレクト単位で変数を設定できる。マジ便利。
ディレクトリの中で
direnv edit .
で環境ごとにexport
設定をしてあげればよい。
自分の使い方は/会社/サービス名/環境(本番など)
で区切っている。
設定が終わったら、あとは入りたい環境にcd
して、flogin
を実行すればいい。
終わりに
だいぶインストールはしょったけど、個人や自分の会社、他社さんのサービスを同時に管理している時はほんと助かってる。
改善点としては、AWS
のログイン時に指定したサービスしかそもそもでないようにしたいなぁと。そしたらpeco
もいらなくなるか・・・。(それはそれで使いづらいかもだけど・・)