AWS
SSH
EC2
jq
aws-cli

awsのec2に踏み台経由でssh接続するためのconfigの作成


はじめに

aws上のec2が複数存在する場合には踏み台となるサーバのみにグローバルIPを設定して、他は踏み台経由でログインするようにしているところが多いかと思います。

その際に、サーバがたくさんあるとローカルIPを調べたりするのが大変です。

なので、aws-cliを使って一気に config ファイルを作成することができたので共有します。


環境


  • OS ubuntu 18.04(Windows10 WSL上)

  • SSHのバージョン OpenSSH_7.6p1 Ubuntu-4ubuntu0.3, OpenSSL 1.0.2n 7 Dec 2017


前提


  • aws-cliインストールと設定済み

  • 踏み台サーバ用の秘密鍵ファイルとその他のサーバ用の秘密鍵ファイルを作成済み。(ログインできるところまで確認済みのほうがよい)

  • jqをインストールしてあること。


ファイルの作成

(注意)作成するファイルのモードはすべて600です。(ディレクトリは700)

この後作成するファイルも同様です。


.ssh/config作成

configファイルでIncludeが利用できるようになったので、まずはデフォルトのみのconfigファイルを作成します。

configファイルの設定は後勝ちなので大事なことは最後に記述しましょう。


.ssh/config

Include conf.d/*

Host *
ServerAliveInterval 300
AddKeysToAgent yes
StrictHostKeyChecking no


同時に.ssh/conf.dのディレクトリも作成します。


踏み台用のconfigファイル作成

以下のように作成します。一行目以外は自分の環境に合わせて変更してください。


.ssh/conf.d/bastion.conf

Host bastion

HostName bastion.hogehoge.com
User bastion
IdentityFile ~/.ssh/bastion.pem

できたら接続確認をしましょう。

$ sh bastion

Last login: xxx from xxx.xxx.xxx.xxx

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

https://aws.amazon.com/amazon-linux-ami/xxxx.xx-release-notes/
$

無事にログインできたら、各サーバの設定を行います。


いったんひとつのサーバへの接続確認

awsのコンソールでインスタンス名とプライベートIPを確認して以下のようなファイルを作成します。


.ssh/conf.d/test1.conf

Host aws_test1

HostName xxx.xxx.xxx.xxx
User ec2-user
IdentityFile ~/.ssh/ec2-user.pem
ProxyCommand ssh -W %h:%p bastion

ポイントはProxyCommandですね。

ファイルを作成したら、ログインできるか確認してみましょう。


共通部分の切り出し

先ほどの設定でうまく接続できたら、共通部分を切り出します。


.ssh/conf.d/aws_common.conf

Host aws_*

User ec2-user
IdentityFile ~/.ssh/ec2-user.pem
ProxyCommand ssh -W %h:%p bastion

Hostの指定は共通の接頭辞(今回はaws_)を付けてください。


各インスタンスごとの設定ファイル作成

ここが今回のポイントです。

以下のコマンドですべてのインスタンスに対する設定ファイルができます。

aws ec2 describe-instances | jq -r '.Reservations[].Instances[] | "Host aws_" + .Tags[].Value + "\n HostName " + .PrivateIpAddress + "\n"' > ~.ssh/conf.d/aws_common.conf

ファイルを作成したら、ログインできるか試してみましょう。


Windows10の場合

Windows10にも標準でOpenSSHが入っています。(最近知りました。もう*termとかいらないですね。)

C:\Users\ユーザ名.ssh にファイルを作成すれば同様のことが可能です。

ただし、以下の2点に注意する必要があります。


  • jqをインストールしたりが面倒 → なので、WSLを利用するほうが楽かと思います。

  • ProxyCommand sshがエラーになるため、ProxyCommand C:\Windows\System32\OpenSSH\ssh.exeと書きましょう。


終わりに

いい感じのconfigファイルができたら社内で共有しておくとありがたがられるかと思います。

aws-cliとjqの組み合わせはかなり強力なので、どんどん活用しましょう!!


参考