Vercelへのデプロイ
このガイドでは、Prismaを使用してVercelにサーバーレスアプリケーションをセットアップしてデプロイする手順を説明します。
Vercelは、静的サイト、サーバーレス関数、およびエッジ関数をホストするクラウドプラットフォームです。VercelプロジェクトをGitHubリポジトリと統合して、新しいコミットを行うときに自動的にデプロイできるようにすることができます。
Prismaを使用してVercelにアプリケーションをデプロイする際の参考として使用できる、Next.jsを使用したサンプルアプリケーションを作成しました。
私たちの例ではNext.jsを使用していますが、他のアプリケーションもVercelにデプロイできます。他のオプションの例として、VercelでExpressを使用するおよびVercelでのNuxtを参照してください。
ビルド構成
Vercelビルド中のPrisma Clientの更新
Vercelは、デプロイ時に依存関係を自動的にキャッシュします。ほとんどのアプリケーションでは、これにより問題が発生することはありません。ただし、Prisma ORMの場合、Prismaスキーマの変更時にPrisma Clientのバージョンが古くなる可能性があります。この問題を回避するには、アプリケーションのpostinstall
スクリプトにprisma generate
を追加してください。
{
...
"scripts" {
"postinstall": "prisma generate"
}
...
}
これにより、ビルド時にPrisma Clientが再生成され、デプロイメントには常に最新のクライアントが含まれるようになります。
Vercelへのデプロイ中にprisma: command not found
エラーが表示される場合は、依存関係にprisma
がありません。デフォルトでは、prisma
は開発依存関係であり、標準の依存関係に移動する必要がある場合があります。
古いPrisma Clientを回避するもう1つのオプションは、カスタム出力パスを使用し、クライアントをバージョン管理にチェックインすることです。これにより、各デプロイメントに正しいPrisma Clientが含まれることが保証されます。
generator client {
provider = "prisma-client-js"
output = "./generated/client"
}
VercelのモノレポにPrismaをデプロイする
モノレポ(例:TurboRepoを使用)内でPrismaを使用し、Vercelにデプロイする場合、libquery_engine-rhel-openssl-3.0.x.so.node
などの必要なファイルがデプロイされたバンドルから欠落している問題が発生する可能性があります。これは、Vercelがサーバーレスデプロイメントを積極的に最適化し、必要なPrismaファイルを削除してしまう場合があるためです。これを解決するには、@prisma/nextjs-monorepo-workaround-pluginプラグインを使用してください。これにより、Prismaエンジンファイルが最終バンドルに正しく含まれるようになります。PrismaがWebpackやParcelなどのさまざまなバンドラーとどのように相互作用するかについての詳細は、モジュールバンドラーのページを参照してください。
CI/CDワークフロー
より高度なCI/CD環境では、ローカル開発中に実行したマイグレーションでデータベーススキーマを更新することもできます。これを行うには、prisma migrate deploy
コマンドを使用できます。
その場合、package.json
にカスタムビルドコマンド(例:vercel-build
という名前)を作成できます。これは次のようになります。
{
...
"scripts" {
"vercel-build": "prisma generate && prisma migrate deploy && next build",
}
...
}
CI/CDパイプライン内でこのスクリプトを呼び出すには、次のコマンドを使用します。
npm run vercel-build
プレビューデプロイメント用に別のデータベースを追加する
デフォルトでは、アプリケーションには、リポジトリのmain
gitブランチに関連付けられた単一の本番環境があります。アプリケーションを変更するためにプルリクエストを開くと、Vercelは新しいプレビュー環境を作成します。
Vercelは、プロジェクトをインポートするときに定義するDATABASE_URL
環境変数を、本番環境とプレビュー環境の両方で使用します。プルリクエストにデータベーススキーマのマイグレーションが含まれている場合、プルリクエストは本番データベースのスキーマを変更するため、これは問題を引き起こします。
これを防ぐには、プレビューデプロイメントを処理するために2番目のホストされたデータベースを使用します。その接続文字列を入手したら、Vercelダッシュボードを使用してプレビュー環境のDATABASE_URL
を追加できます。
-
Vercelプロジェクトの設定タブをクリックします。
-
環境変数をクリックします。
-
キーが
DATABASE_URL
の環境変数を追加し、プレビュー環境オプションのみを選択します。 -
値を2番目のデータベースの接続文字列に設定します。
postgresql://dbUsername:dbPassword@myhost:5432/mydb
-
保存をクリックします。
接続プーリング
Vercelサーバーレス関数などのFunction-as-a-Serviceプロバイダーを使用する場合、すべての呼び出しでデータベースへの新しい接続が発生する可能性があります。これにより、データベースが開いている接続をすぐに使い果たし、アプリケーションが停止する可能性があります。このため、データベースへの接続をプーリングすることが不可欠です。
接続プーリングにはAccelerateを使用するか、組み込みの接続プーリングを備えたPrisma Postgresを使用して、Prisma Clientバンドルサイズを削減し、コールドスタートを回避できます。
サーバーレス環境での接続管理の詳細については、接続管理ガイドを参照してください。