SSMでリモートホストにPortForwardingする
はじめに
下記アップデートにて、SSMのドキュメントでPortForwardingができるようになりました。
リンク先のドキュメントは何も書いてないに等しかったので、調査がてら試してみることにしました。 (尚、コンソールのセッションマネージャーやRunCommandからできたら楽だったのですが、現状はできない模様です)
やりたいこと 今回はローカルPCからプライベートサブネット上のDocumentDBにログインしてみます。
【接続経路】 ローカルPC(WSL2)→EC2(AmazonLinux2)→DocumentDB(Port:27017)
※接続先がDocumentDBなのは今案件で使っていて試しやすかっただけで他意はないです(EC2やRDSでも可能です) ※そのせいでMongo-shellの実行環境を作る必要があって地味にめんどくさかったのは秘密
事前準備
PortForwarding用のEC2インスタンスを作成します。 基本デフォルト(キーペアもSGのインバウンドルールも不要)で問題ないですが、セッションマネージャーで接続ができることが前提なので「AmazonSSMManagedInstanceCore」権限のあるインスタンスプロファイル(IAMロール)をアタッチしてあれば良いです。
また、PortForwardingはSSMエージェントのバージョンが「3.1.1374.0以降」である必要があります。 尚、検証時点(※5/28)のAmazonLinux2のAMIにデフォルトで入っているエージェントは地味にバージョンが足りないので、利用する場合は手動アップデートが必要になります。 (昨日今日に追加された機能なので、そのうち更新されると思います)
※検証時点(※5/28)で起動したインスタンスのSSMエージェントバージョン
# rpm -qa | grep -i ssm amazon-ssm-agent-3.1.1188.0-1.amzn2.x86_64
※バージョンアップ手順はこちら
https://docs.aws.amazon.com/systems-manager/latest/userguide/agent-install-al2.html
※更新後のバージョン
# rpm -qa | grep -i ssm amazon-ssm-agent-3.1.1446.0-1.x86_64
接続コマンド
SSMドキュメント名は「AWS-StartPortForwardingSessionToRemoteHost」です。 詳細はドキュメントの説明(SSMのコンソールから見れます)に譲りますが、パラメータにローカル/リモートのポートと転送先のホスト(今回はDocumentDBのエンドポイント)を設定すれば接続できます。
$ aws ssm start-session --target i-xxxxxxxxxxxx --document-name AWS-StartPortForwardingSessionToRemoteHost --parameters 'portNumber=27017,localPortNumber=27017,host=docdb.cluster-abcdefghij.ap-northeast-1.docdb.amazonaws.com' Starting session with SessionId: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Port 27017 opened for sessionId xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Waiting for connections...
実行後、別画面でlocalhost宛てに接続すれば転送先にログインできます。
$ mongo --host localhost:27017 --username mongo MongoDB shell version v4.4.14 Enter password: connecting to: mongodb://localhost:27017/?compressors=disabled&gssapiServiceName=mongodb Implicit session: session { "id" : UUID("c5988ed1-5497-4e17-9138-16ae18b0b71e") } MongoDB server version: 4.0.0 (※中略) rs0:PRIMARY>
参考
WSL2でMongo-shellを使いたい場合、単にaptではインストールできないようです。 自分は下記サイトを参考にしました。 (DBが必要なわけではないのでmongodb-org-shellのみインストールしました)