SSHトンネルで Prisma からプライベートサブネットにある RDSにアクセスする
はじめに
はじめまして。しんりうです。
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
に設定を定義しておけば予約名で接続できるようになります。
Host <任意の予約名>
HostName <EC2パブリックIP>
IdentityFile <秘密鍵パス>
User <EC2ユーザー名>
LocalForward 3306 <RDSエンドポイント>:3306 # MySQLの場合
$ ssh <任意の予約名>
schema.prisma
の設定
MySQL のため、schema.prisma
の database
ブロックを以下のように設定しておきます。
ここで、ポートフォワーディングのため、
datasource db {
provider = "mysql"
url = env("DATABASE_URL")
}
環境変数の設定
DATABASE_URL
を宣言しておきます。
ここでポートフォワーディングのためホスト IP が 127.0.0.1
になることに気をつけてください。
DATABASE_URL="mysql://${DB_USERNAME}:${DB_PASSWORD}@127.0.0.1:3306/${DB_NAME}
動作確認
以上の設定により、マイグレーション状態を取得できることができます。
$ npx prisma migrate status
おわりに
今回は、SSH トンネルで Prisma からプライベートサブネットにある RDS にアクセスする方法を共有しました。
もしどなたかのお役に立てば幸いです。
ここまで読んでいただきありがとうございました。
Discussion