こんにちは。サーバーワークス呉屋です。
今回は、AWS Systems Manager Session Manager(以下、SSM Session Manager)のポートファーディング機能を使用し、「Private SubnetにあるRDSへの接続した方法」について、まとめます。
背景
AWS環境にあるWebサーバー(EC2)とDBサーバー(RDS)に対して、ベンダーが開発を行っております。
その際、パブリックサブネットに踏み台サーバー(EC2)を用意して、RDSに接続しておりました。
よくある構成ですね。
今回は課題として、下記の2つがありました。
- 踏み台サーバーを廃止し、運用コストを減らしたい
- ローカル環境から直接DBへ接続したい
ググってみると、ピッタリな対応方法が見つかりました!
早速気になったので、検証してみます。
検証内容と構成図
踏み台サーバを廃止し、Protected SubnetにあるEC2にポートファーディングを行い、RDSへ接続する。
事前準備
SSM Session Managerのポートファーディング機能を使うための設定を行います。
- AWS CLI をセットアップする - AWS Command Line Interface
- AWS CLI 用の Session Manager プラグインをインストールする - AWS Systems Manager
- DB(Postgresql)のコマンドが利用できるための設定
検証
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」と呼ばれる機能もあるので、試してみたいと思います。
以上です!