🌟

SSHトンネルで Prisma からプライベートサブネットにある RDSにアクセスする

2024/11/03に公開

はじめに

はじめまして。しんりうです。

AWS VPC 内のプライベートサブネットに配置しているRDSは、外部ネットワークから直接アクセスすることができません。
ですが、Prisma ORM を利用している場合、ローカル開発環境から Prisma で DB に対してマイグレーション等の操作を行いたいことがあると思います。

そこで今回は、 SSH トンネル(SSH ポートフォワーディング)を用いて、Prisma から踏み台サーバー(EC2)経由 でプライベートサブネットにある RDS にアクセスする方法を共有します。

ただし、踏み台サーバーの構築方法は割愛させていただきます mm
そちらにも興味がある方は、ネットの海に多数の情報があるためそちらをご参照ください。

手順

以下の手順で実現できます。一度セットアップすれば非常に簡単です。

※ EC2 は RDS と同一 VPC 内のパブリックサブネットに配置し、適切なセキュリティグループ設定が済んでいるものとします。

SSH トンネル の作成

SSH トンネルとは

SSH トンネルとは、暗号化された SSH 接続を介して、別のネットワーク上のポートをローカルマシンにフォワード(転送)する仕組みです。
そのため、SSH ポートフォワーディングとも呼ばれています。

今回のケースでは、以下のような通信経路を作る形になります。

ローカルマシン:3306番ポート → SSH トンネル → 踏み台サーバー(EC2):3306番ポート → RDS:3306番ポート

これによりローカルマシンの 3306 番ポートは、SSH トンネル経由で踏み台サーバー(EC2)に転送され、最終的に RDS の 3306 番ポートに接続できるという形になります。

※ 今回は MySQL on RDS を利用しているためポート番号は 3306 番としています。

SSH トンネルの確立

SSH トンネルは以下のコマンドで確立できます。
ここで、-L オプションはローカルポートフォワーディングを設定するためのオプションです。

$ ssh -L 3306:<RDSエンドポイント>:3306 <EC2ユーザー名>@<EC2パブリックIP> -i <秘密鍵パス>

成功すると以下のようになります。
このセッションを切断せずに維持しておいてください。

※ ただし、ローカルマシンの 3306 番ポートが空きポートである必要があります。

予約名で接続

また、あらかじめ ~/.ssh/config に設定を定義しておけば予約名で接続できるようになります。

~/.ssh/config
Host <任意の予約名>
  HostName <EC2パブリックIP>
  IdentityFile <秘密鍵パス>
  User <EC2ユーザー名>
  LocalForward 3306 <RDSエンドポイント>:3306 # MySQLの場合
$ ssh <任意の予約名>

schema.prisma の設定

MySQL のため、schema.prismadatabase ブロックを以下のように設定しておきます。
ここで、ポートフォワーディングのため、

schema.prisma
datasource db {
  provider = "mysql"
  url      = env("DATABASE_URL")
}

環境変数の設定

DATABASE_URL を宣言しておきます。
ここでポートフォワーディングのためホスト IP が 127.0.0.1になることに気をつけてください。

env
DATABASE_URL="mysql://${DB_USERNAME}:${DB_PASSWORD}@127.0.0.1:3306/${DB_NAME}

動作確認

以上の設定により、マイグレーション状態を取得できることができます。

$ npx prisma migrate status

おわりに

今回は、SSH トンネルで Prisma からプライベートサブネットにある RDS にアクセスする方法を共有しました。

もしどなたかのお役に立てば幸いです。
ここまで読んでいただきありがとうございました。

Discussion