Session Managerを使用してec2インスタンス(Ubuntu)を介してプライベートサブネットのAWS RDSインスタンスにアクセスできない。
AWS Session Managerを使用したポート転送 -
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 PORT)の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は次のシナリオを処理するように設計されています。手動でインストールしてインストールしたMySQLデータベースなど、EC2で実行されているものがあります。たとえば、ワークステーションからSSMを介してEC2で実行されているMySQLインスタンスにトラフィックを転送したいとします。これが 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 システム管理者 - ユーザーガイド - セッションマネージャ - セッションの開始 (リモートホストへのポート転送)。
関連AWSブログ投稿:
- AWS Systems Manager Session Manager でポートフォワーディングを使用してリモートホストに接続する
- 優先GUIを使用してAmazon RDSまたはAmazon EC2 DBインスタンスにリモートで安全に接続する
関連するGitHubの問題とプールリクエスト:
- aws/amazon-ssm-agent - 問題#208 - 機能要求:リモートポートに転送
- aws/amazon-ssm-agent - 問題 #240 - 機能リクエスト: AWS-StartSSHSession #240 の IP 指定を許可する
- aws/amazon-ssm-agent - プール要求 #389 - ポート転送のためのホスト指定サポート
関連StackOverflow質問: