※環境はMac前提
AWS環境のサーバ(EC2インスタンス)に接続する際
セキュリティを考慮して セッションマネージャーでトンネルしてSSHしているケースあるかと思います。
Cf: AWS Systems Manager セッションマネージャーでSSH・SCPできるようになりました | Developers.IO
ただ、 ssh <インスタンスID>
って、historyみたときに、あれ?このサーバなんだっけってなりますよね?
いつもどおり ssh production-server
とかしたいわけで。その方法。
~/.ssh/config
を以下のように設定。
Host awesome.production
HostName i-0xxxxxxxxxxxxxxxx # <- ここにインスタンスID入れる
# 以下、必要な数だけ 同じプリフィックスつけて HostNameを定義する
Host awesome.*
ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"
これで ssh awesome.production
で接続できます。
ホスト名を動的に解決したい
ただ、上の方法だと、EC2インスタンスが増減したときに ~/.ssh/config
を
手動でメンテしなければならず、すこぶる面倒ですよね。
EC2のNameタグを利用してアクセスできるようにするには、以下のように ProxyCommand で少し頑張ってみる。
※ EC2のNameタグに設定する名前には、ピリオド「.」が入っていない前提。そうでない場合は $(echo %h | cut -d. -f2)
の箇所をよしなに修正してください
※ Mac Catalina バージョン10.15.3, シェルはzshで確認
ProxyCommand $(EC2HOST=$(echo %h | cut -d. -f2);INSTANCEID=$(aws ec2 describe-instances --filters "Name=tag:Name,Values=$EC2HOST" --query "Reservations[*].Instances[*].[InstanceId]" --output text);echo aws ssm start-session --target $INSTANCEID --document-name AWS-StartSSHSession --parameters 'portNumber=%p')
DBクライアントソフトの対応
MySQLWorkbenchや DataGrip など、DBクライアントソフトでSSHトンネルする場合
~/.ssh/config
を考慮してくれるようなのですが(ProxyCommandも考慮してくれる)
ProxyCommand 内のコマンド展開 $(echo %h | cut -d. -f2)
などは考慮してくれないようです。
また、~/.ssh/config
は Includeキーワードで別ファイルを読めるのですが、これも考慮してくれないようです。
なので、DBクライアントのトンネリングには、踏み台となる特定インスタンスを ~/.ssh/config
に定義しておくしかなさそうです。
Host bastion
HostName i-01xxxxxxxxxxxxxxx # <- bastionのインスタンスID
ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"
で、DBクライアントソフトのSSHホスト名を上で定義した「bastion」にすればOK。
※ DBクライアントによっては、session-manager-plugin をデフォルトでインストールしたときのパス /usr/local/bin
が 環境変数 PATH に入って無くて読めないことがあるもよう。
その場合は、ProxyCommand にて PATHを設定するとうまくいく。
ProxyCommand sh -c "env PATH=/usr/local/bin:$PATH aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"
※ すべてのDBクライアントソフトを動作検証したわけではないので、これで繋がらない場合は
先に記述したDeveloper.IOの記事にあるポートフォワードを試してみてください。