16
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

AWS セッションマネージャでSSH接続する際、認識しやすい名称で接続したい

Last updated at Posted at 2020-02-19

※環境は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の記事にあるポートフォワードを試してみてください。

16
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?