はじめに
AWS で EC2 を複数立ち上げて、それらに踏み台サーバ (bastion サーバ) 経由でSSHログインすることはよくあることかと思います。その際、管理コンソールでプライベートIP調べてログインとか面倒ですよね。できれば名前でログインできたら便利ですが、そのための .ssh/config を管理コンソールから読み取って作るのも、それなりに面倒です。本記事では aws CLI を使って .ssh/config を生成する bash スクリプトをご紹介します。
前提
- Linux 環境 (WSL2 とか) が利用可能であること
- AWS CLI がインストールされていること
- ec2:DescribeInstances の許可を受けた IAM を所有していること
- EC2 に名前が設定されていること (タグのキーが Name、値にホスト名が設定されていること)
- 踏み台サーバにログインユーザーの秘密鍵が、踏み台経由でログインしたいサーバにその公開鍵が配置されていること (そのような設定をした AMI からインスタンスを作成する必要がありますね)
- jq コマンドがインストールされていること
生成スクリプト
以下が .ssh/config を自動生成する bash スクリプトです。
#!/bin/bash
aws ec2 describe-instances | \
jq -r '.Reservations[].Instances[] | [(.Tags[] | select(.Key=="Name").Value), .PrivateIpAddress] | @csv' | \
sort | \
sed -e 's/"//g' | \
awk -F, '{
if (NF == 1) { next; }
if ($2 == "") { next; }
printf("Host %s\n", $1)
printf(" HostName %s\n", $2)
printf(" Port 22\n\n")
}'
上記スクリプトではログインユーザーを指定していませんが、踏み台サーバにログインしているユーザと異なるユーザでログインする必要がある場合には HostName を設定している行の後に以下を追記するといいでしょう。
printf(" User ユーザ名\n")
ユーザ名 の部分を適宜置き換えて下さい。