SSMポートファーディングでPrivate Subnet内のRDSに接続する

記事タイトルとURLをコピーする

こんにちは。サーバーワークス呉屋です。

今回は、AWS Systems Manager Session Manager(以下、SSM Session Manager)のポートファーディング機能を使用し、「Private SubnetにあるRDSへの接続した方法」について、まとめます。

背景

AWS環境にあるWebサーバー(EC2)とDBサーバー(RDS)に対して、ベンダーが開発を行っております。

その際、パブリックサブネットに踏み台サーバー(EC2)を用意して、RDSに接続しておりました。

よくある構成ですね。

今回は課題として、下記の2つがありました。

  1. 踏み台サーバーを廃止し、運用コストを減らしたい
  2. ローカル環境から直接DBへ接続したい

ググってみると、ピッタリな対応方法が見つかりました!

aws.amazon.com

早速気になったので、検証してみます。

検証内容と構成図

踏み台サーバを廃止し、Protected SubnetにあるEC2にポートファーディングを行い、RDSへ接続する。

事前準備

SSM Session Managerのポートファーディング機能を使うための設定を行います。

検証

Protected SubnetにあるEC2へポートファーディングで接続

RDSへ接続する前にEC2にポートファーディング接続できるか確認します。

接続コマンドの例

aws ssm start-session \
--target [EC2のインスタンスID] \
--document-name AWS-StartPortForwardingSession \
--parameters portNumber=22,localPortNumber=[任意のポート] \
--profile iamuser-xxxxx

実行結果

aws ssm start-session \
--target i-xxxxxx \
--document-name AWS-StartPortForwardingSession \
--parameters portNumber=22,localPortNumber=10022 \
--profile iamuser-xxxxx

Starting session with SessionId: iamuser-xxxxx
Port 10022 opened for sessionId iamuser-xxxxx
Waiting for connections...

接続待機中の状態になりました。

別画面でlocalhostで接続してみます。

ssh -i swx-test-goya.pem ec2-user@localhost -p 10022

   ,     #_
   ~\_  ####_        Amazon Linux 2023
  ~~  \_#####\
  ~~     \###|
  ~~       \#/ ___   https://aws.amazon.com/linux/amazon-linux-2023
   ~~       V~' '->
    ~~~         /
      ~~._.   _/
         _/ _/
       _/m/'
[ec2-user@ip-172-30-204-77 ~]$

無事に接続ができました!

Private SubnetにあるRDSにポートファーディングで接続

いよいよ、大詰め。 EC2を経由して、ポートファーディングでRDSに接続できるか確認します。

接続コマンドの例

aws ssm start-session \
--target [EC2のインスタンスID] \
--document-name AWS-StartPortForwardingSessionToRemoteHost \
--parameters '{"portNumber":["5432"],"localPortNumber":["任意のポート"],"host":["RDSエンドポイント"]}' \
--profile iamuser-xxxxx

実行結果

aws ssm start-session \
--target i-xxxxx \
--document-name AWS-StartPortForwardingSessionToRemoteHost \
--parameters '{"portNumber":["5432"],"localPortNumber":["15432"],"host":["rds-dev.xxxxx.ap-northeast-1.rds.amazonaws.com"]}' \
--profile iamuser-xxxxx

Starting session with SessionId: iamuser-xxxxx
Port 15432 opened for sessionId iamuser-xxxxx.
Waiting for connections...

接続待機中の状態になりました。

別画面でlocalhostで接続してみます。

psql \
   --host=localhost \
   --port=15432 \
   --username=postgres \
   --password
Password:
psql (14.10 (Homebrew), server 15.4)
WARNING: psql major version 14, server major version 15.
         Some psql features might not work.
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.

postgres=>

無事に接続できました!

Protected SubnetにあるEC2にポートファーディングし、Private SubnetにあるRDSへ接続できていることがわかります。

まとめ

今回は、踏み台サーバーを廃止すべく、SSMのポートファーディング機能を使った検証を行いました。

他にも「EC2 Instance Connect Endpoint」と呼ばれる機能もあるので、試してみたいと思います。

blog.serverworks.co.jp

以上です!

呉屋 桂基(記事一覧)

EC部 CR課

生まれも育ちも沖縄。中途入社後、憧れの東京へ。今は北海道に住んでて、次どこ行くか迷い中のエンジニア。