Vercelにデプロイする
このガイドでは、Prisma を使用するサーバーレスアプリケーションをVercelにセットアップし、デプロイする手順を説明します。
Vercelは、静的サイト、サーバーレス機能、およびエッジ機能をホストするクラウドプラットフォームです。VercelプロジェクトをGitHubリポジトリと統合することで、新しいコミットを行うたびに自動的にデプロイできるようになります。
Next.jsを使用したサンプルアプリケーションを作成しました。Prismaを使用するアプリケーションをVercelにデプロイする際の参考にしてください。
弊社の例では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を回避する別の方法は、カスタム出力パスを使用し、クライアントをバージョン管理下に置くことです。こうすることで、各デプロイメントには常に正しい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エンジンファイルが最終バンドルに正しく含まれるようにする@prisma/nextjs-monorepo-workaround-pluginプラグインを使用してください。PrismaがWebpackやParcelなどの異なるバンドラーとどのように連携するかについての詳細は、弊社の「モジュールバンドラー」ページを参照してください。
このプラグインの使用は、以下の場合に廃止されます:
- RustエンジンなしのPrisma ORMを使用している場合(
queryCompiler
機能フラグ経由) - 新しい
prisma-client
ジェネレーターを使用している場合
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 Serverless FunctionsのようなFunction-as-a-Serviceプロバイダーを使用する場合、呼び出しごとにデータベースへの新しい接続が発生する可能性があります。これにより、データベースのオープン接続がすぐに枯渇し、アプリケーションが停止する原因となることがあります。このため、データベースへの接続プーリングは不可欠です。
コネクションプーリングにはAccelerateを使用するか、組み込みのコネクションプーリングを備えたPrisma Postgresを使用すると、Prisma Clientのバンドルサイズを削減し、コールドスタートを回避できます。
サーバーレス環境での接続管理の詳細については、弊社の接続管理ガイドを参照してください。