ec2 インスタンス (Ubuntu) を介してセッション マネージャーを使用してプライベート サブネット内の AWS RDS インスタンスにアクセスする際に問題が発生しています。
AWS セッションマネージャーを使用したポート転送 -
aws ssm start-session --target $INSTANCE_ID \
--document-name AWS-StartPortForwardingSession \
--parameters '{"portNumber":[3307],"localPortNumber":["8000"]}' \
--profile=production \
--region=us-east-1`
これで、ローカル ポート 8000 が EC2 のポート 3307 に正常に転送されました。
lsof -nP +c 15 | grep LISTEN
session-manager 59744 xrage 12u IPv4 0xa6c821d0a800e9a1 0t0 TCP 127.0.0.1:8000 (LISTEN)
EC2 インスタンスには、ポート 3307 のすべてのトラフィックをポート 3306 (MYSQL ポート) の rds ホストに転送する iptable ルールがあります。
sudo iptables -t nat -A OUTPUT -o lo -d 127.0.0.1 -p tcp --dport 3307 -j DNAT --to-destination <rds_private_ip>:3306
これにより、ec2 から目的のポートでリモート ホストにアクセスできるようになりましたが、それでもリモート ホストはポート 8000 でローカルにアクセスできません。
ローカルマシンのネットワーク詳細 -
- プロキシを使用しない
- Macでファイアウォールが無効になっています
したがって、SSM セットアップは機能しているものの、他の何かがこのトラフィックをブロックしていることは明らかです。ここでは助けが必要です。
答え1
リモート ホストが MySQL インスタンスにアクセスできると言ったとき、確認のためにそのポート (telnet) または mysql コマンド ライン クライアントを試しましたか?
上記の質問に「はい」と答えた場合、次のステップに進みます。AWS-StartPortForwardingSession は、次のようなシナリオに対応するものであると理解しています。EC2 で何かが実行されています。たとえば、手動でロールアウトしてインストールした MySQL データベースです。ワークステーション (例) から EC2 で実行されている MySQL インスタンスに SSM 経由でトラフィックを転送します。これが AWS-StartPortForwardingSession が設計された目的です。
あなたの場合、EC2 は要塞ホストのようなもので、MySQL インスタンスは RDS タイプです。したがって、EC2 は何もホストせず、単に RDS に接続するためのゲートウェイです。
上記の仮定が正しいと仮定すると、代わりにAWS-StartSSHSessionを使用します(https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-getting-started-enable-ssh-connections.html)。
完全な答えは冗長になりますが、数か月前にそれを実行しました。https://medium.com/@clearwaterstream/recipe-connect-to-an-rds-database-in-a-private-subnet-from-your-workstation-over-https-c66db6ead9f0
答え2
2022年5月27日、AWS発表されたサポートのためにセッション マネージャーを使用したリモート ホストへのポート転送:
開始するには、ポート転送セッションを確立する管理対象インスタンスに SSM エージェント バージョン 3.1.1374.0 以降をインストールします。
AWS-StartPortForwardingSessionToRemoteHost
セッション マネージャー ドキュメントを使用して、コマンド ラインからポート転送セッションを開始できます。
ポート転送セッションを開始するには、CLI から次のコマンドを実行します。、、、の値を<EC2_INSTANCE_ID>
実際<RDS_DB>
の<RDS_PORT>
情報<LOCAL_PORT>
に置き換えます。
aws ssm start-session \
--target <EC2_INSTANCE_ID> \
--document-name AWS-StartPortForwardingSessionToRemoteHost \
--parameters '{"host":["<RDS_DB>"], "portNumber":["<RDS_PORT>"], "localPortNumber":["<LOCAL_PORT>"]}'
詳細については、AWS ドキュメントをご覧ください。AWS Systems Manager - ユーザーガイド - セッションマネージャー - セッションの開始 (リモートホストへのポート転送)。
関連する AWS ブログ投稿:
- AWS Systems Manager Session Manager のポート転送を使用してリモートホストに接続する
- 好みの GUI を使用して Amazon RDS または Amazon EC2 データベースインスタンスにリモートで安全に接続します。
関連する GitHub の問題とプルリクエスト:
- aws/amazon-ssm-agent - 問題 #208 - 機能リクエスト: リモート ポートへの転送
- aws/amazon-ssm-agent - 問題 #240 - 機能リクエスト: AWS-StartSSHSession の IP 指定を許可する #240
- aws/amazon-ssm-agent - プルリクエスト #389 - ポート転送のホスト指定のサポート
関連する StackOverflow の質問: