Loading
BLOG 開発者ブログ

2023年9月28日

プライベートなRDSのつなぎ方


AWSのRDSを利用されている方の多くはRDSをプライベートサブネットに配置していると思いますが、開発やメンテナンスで手元の端末から直接データを参照・更新したいケースがあると思います。
そういった場合には踏台サーバを配置してポートフォワードで接続されていると思います。
AWSでは踏台サーバがプライベートサブネットに配置されていても、RDSまで接続できる機能が提供されていますのでご紹介したいと思います。

目次

  1. はじめに
  2. プライベートなRDSのつなぎ方
  3. おわりに

はじめに

こんにちは。
クラウドソリューショングループのakahane.tです。

今回は下の図のようにプライベートサブネットにある踏台サーバを経由してプライベートサブネットにあるRDSに接続してみます。

プライベートサブネットにある踏台サーバを経由してプライベートサブネットにあるRDSに接続するにあたってAWSのSystems Manager Session Manager(SSM)を使用しますが、SSMを用いた接続や踏台サーバからRDSに接続するために下記の条件も必要になります。

  • 踏台サーバにバージョン3.1.1374.0以降のSSMエージェントがインストールされていること
  • 踏台サーバにセッションマネージャを利用する権限を割り当て済みであること
  • 踏台サーバからRDSに接続できるルーティングとセキュリティグループ設定がされていること
  • 踏台サーバからエンドポイントやNATゲートウェイなどを通じてセッションマネージャを利用できること
  • ユーザにSSM接続を利用する権限が割り当て済みであること
  • 接続元のローカルPCにSession Managerプラグインがインストールされていること

ローカルPCからプライベートサブネットにあるRDSに接続する場合、従来の接続方法としてSSHのポートフォワードを使用する方法やSSMとSSHのポートフォワードを併用する方法がありました。
これらに対して今回ご紹介する方法は下記のメリットがありますので、こちらを使用することをおすすめします。

従来の接続方法に対するメリット
  • 1コマンドで接続できる
  • 踏台サーバをプライベートサブネットに配置できる
  • 踏台サーバのインバウンド通信に対するポート開放が不要
  • SSHの公開鍵・秘密鍵の管理が不要
  • ユーザのアクセス権限をAWS上で一括管理できる
  • ユーザの利用状況をAWS上で監視できる

プライベートなRDSのつなぎ方

今回はSSM接続で指定するドキュメントの中でリモートホストへのポートフォワード用ドキュメントである「AWS-StartPortForwardingSessionToRemoteHost」を使用します。
このドキュメントを使用するためには前述の「踏台サーバにバージョン3.1.1374.0以降のSSMエージェントがインストールされていること」が必要になりますので、踏台サーバを建ててから時間が経っているという方はSystems Managerからバージョンの確認やアップデートできますので必要に応じてSSMエージェントを更新してください。

SSM接続を用いたリモートホストへのポートフォワードはLinux&macOSとWindowsでオプションの指定が異なりますのでローカルPCの環境に合わせて実行してください。

# Linux&macOS
aws ssm start-session \
    --target {踏台サーバのインスタンスID} \
    --document-name AWS-StartPortForwardingSessionToRemoteHost \
    --parameters '{"host":["{RDSのエンドポイント}"],"portNumber":["{RDSのポート}"], "localPortNumber":["{ローカルPCにフォワードするポート}"]}'
@rem Windows
aws ssm start-session ^
    --target {踏台サーバのインスタンスID} ^
    --document-name AWS-StartPortForwardingSessionToRemoteHost ^
    --parameters host="{RDSのエンドポイント}",portNumber="{RDSのポート}",localPortNumber="{ローカルPCにフォワードするポート}"

それでは実際に接続してみます。

aws ssm start-session ^
    --target i-08ab266939f79ab79 ^
    --document-name AWS-StartPortForwardingSessionToRemoteHost ^
    --parameters host="test-db.XXXXXXXXXX.ap-northeast-1.rds.amazonaws.com",portNumber="3306",localPortNumber="3306"

RDSのエンドポイントにはアカウント固有の文字列が含まれていますので一部伏字にしていますが、ご自身のエンドポイント名をそのままコピーして実行していただければ問題ありません。
コマンドを実行すると下の図のように「Waiting for connections…」と表示されればRDSまで接続できていますので、DBに接続したいクライアントツールで接続できます。

今回はA5:SQL-Mk-2を使用して接続してみます。
下の図のようにホスト名に「localhost」、ポート番号にlocalPortNumberで設定したポート番号を指定してDBのユーザID/パスワードを入力して「テスト接続」ボタンをクリックします。

下の図のように「接続に成功しました。」と表示されれば問題なくRDSに接続できていますのでDBの接続情報を登録します。

登録した後はサイドメニューのデータベースから先ほど登録したDBを選択すればローカルPCからプライベートにあるRDSに接続できます。

おわりに

1コマンド実行するだけでローカルPCからプライベートサブネットにあるRDSまで簡単に接続できました。
今回使用したSSM接続のドキュメント「AWS-StartPortForwardingSessionToRemoteHost」が提供される前はSSM接続とSSHを併用する必要があり、コマンドを分けて実行したりプロキシコマンドを構築して接続していた方も多かったと思います。
このドキュメントが提供されたおかげで利便性とセキュリティを両立することができるようになりました。
AWSは利用者に便利な機能がどんどん提供されているので今後のリリース情報にも期待が高まります。

akahane.tのブログ