ローカルで実行してた以下みたいなコマンドってRDSでDB構築した場合どうすれば良いのか
npx prisma migrate dev
手順
- 踏み台用EC2を起動
- ローカルPCから踏み台経由でRDSにsshトンネル
- migrate実行
RDSは作成されている前提で進めます。今回はPostgreSQLで進めます。
RDSのセキュリティグループには踏み台サーバーのセキュリティグループを設定しておいてください。
EC2の作成
RDSがプライベートサブネットにある限り外から接続するには踏み台かVPNを使用した接続を確立するしかないので今回は簡単に踏み台サーバー立てます
開発者がRDSに接続するためだけのサーバーなので基本デフォルトで余計な設定はしなくてOKです。
キーペアを作成したらダウンロードフォルダからデスクトップとかに持ってきて.sshフォルダに移動しておきましょう。
# デスクトップで
mv キーペア名.pem ~/.ssh
唯一気をつける箇所はデフォルトだとパブリックIPが付与されないので編集で有効化にしておく。
セキュリティグループは自分のIPのみを許可。
自宅や会社のwi-fiの関係でこの自分のIP変わることがあります。昨日接続できたのに何故か今日接続できない!みたいな時はセキュリティグループのインバウンドルールをまた設定し直してください
接続確認
無事にインスタンスが起動できれば「接続」タブから接続の方法が見られるのでその通りにssh接続できるか試してみる。
# sshフォルダへ移動
cd ~/.ssh
# 読み取り権限のみ与える
chmod 400 "キーペア名.pem"
# 接続タブでは@以降はパブリック IPv4 DNSだがどっちでもOK
ssh -i "キーペア名.pem" ec2-user@パブリックIP
# 以下のように接続できればOK
newer release of "Amazon Linux" is available.
Version 2023.5.20241001:
Run "/usr/bin/dnf check-release-update" for full release and version update info
, #_
~\_ ####_ Amazon Linux 2023
~~ \_#####\
~~ \###|
~~ \#/ ___ https://aws.amazon.com/linux/amazon-linux-2023
~~ V~' '->
~~~ /
~~._. _/
_/ _/
_/m/'
Last login: Sat Oct 5 02:23:08 2024 from 60.115.146.89
ローカルのPCから踏み台経由でSSHトンネル
SSHトンネルを作成すると、ローカルPCのポートがRDSにリダイレクトされ、あたかもローカルPC上でRDSが動作しているように接続できます。
cd ~/.ssh
ssh -L 5432:RDSのエンドポイント:5432 ec2-user@踏み台のパブリックIP -i キーペア名.pem
# 接続できればOK。接続したままにしておいてください。
A newer release of "Amazon Linux" is available.
Version 2023.5.20241001:
Run "/usr/bin/dnf check-release-update" for full release and version update info
, #_
~\_ ####_ Amazon Linux 2023
~~ \_#####\
~~ \###|
~~ \#/ ___ https://aws.amazon.com/linux/amazon-linux-2023
~~ V~' '->
~~~ /
~~._. _/
_/ _/
_/m/'
Last login: Sun Oct 6 03:30:16 2024 from 60.115.159.102
5432ポートがすでに他の開発のdockerとかで使われてると以下のエラーで接続できない時がある。すでに使われてるよ〜って。
bind [127.0.0.1]:5432: Address already in use
channel_setup_fwd_listener_tcpip: cannot listen to port: 5432
Could not request local forwarding.
そしたら5432を5433とか5434とかに変えてみてください
ssh -L 5433(ここ変える):RDSのエンドポイント:5432 ec2-user@踏み台のパブリックIP -i キーペア名.pem
マイグレーション実行
たぶんprisma.schemaファイルに以下の記述があると思います。
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
なので.envの環境変数を以下のようにします
DATABASE_URL="postgresql://DBユーザー名:DBパスワード@127.0.0.1:5432/DB名(識別子じゃないよ)"
SSHトンネル接続した状態で以下コマンド
# 本番環境では以下のコマンドが推奨されています
npx prisma migrate deploy
無事migrateが実行されて、テーブルが作成されているはずです。
ついでに
ECSにデプロイしたい時は.envを以下に変更してSSHトンネルした状態でbuild
じゃないとbuild中に以下のエラーでコケる
#11 18.32 Environment variables loaded from .env
#11 18.32 Prisma schema loaded from prisma/schema.prisma
#11 18.34 Datasource "db": PostgreSQL database "maji_database", schema "public" at "127.0.0.1:5432"
#11 18.80
#11 18.80 Error: P1001: Can't reach database server at `127.0.0.1:5432`
#11 18.80
#11 18.80 Please make sure your database server is running at `127.0.0.1:5432`.
# DATABASE_URL="postgresql://DBユーザー名:DBパスワード@127.0.0.1:5433/DB名"
# 127.0.0.1はあくまでローカルPCのIPです。buil時は以下のようにすることでDockerの中のIPを指定できる
DATABASE_URL="postgresql://DBユーザー名:DBパスワード@host.docker.internal:5432/DB名"
prisma使ったらsupabase使ってVercelデプロイとかが一般なのかな?と思いつつもお役に立てれば幸いです。