Cloudflare Workers & Pagesへのデプロイ
このページでは、Prisma ORMを使ったアプリケーションをCloudflare WorkerまたはCloudflare Pagesにデプロイするために知っておくべきことすべてをカバーします。
Cloudflare Workersにデプロイする際の一般的な考慮事項
このセクションでは、使用するデータベースプロバイダーに関係なく、Cloudflare WorkersまたはPagesにデプロイしてPrisma ORMを使用する際に注意すべき一般的な事項について説明します。
Prisma Postgresの使用
Prisma Postgresを使用してCloudflare Workersにデプロイできます。
Workerを作成したら、以下を実行します。
npx prisma@latest init --db
プロジェクト名を入力し、データベースリージョンを選択してください。
このコマンドは
- CLIをアカウントに接続します。ログインしていない場合、またはアカウントをお持ちでない場合は、新しいアカウントの作成または既存のアカウントへのサインインをガイドするためにブラウザが開きます。
- データベースモデル用の
schema.prisma
ファイルを含むprisma
ディレクトリを作成します。 DATABASE_URL
を含む.env
ファイルを作成します(例:Prisma Postgresの場合、DATABASE_URL="prisma+postgres://accelerate.prisma-data.net/?api_key=eyJhbGciOiJIUzI..."
のようなものになるはずです)。
Prisma Postgresを使用するために必要なクライアント拡張機能をインストールする必要があります。
npm i @prisma/extension-accelerate
そして、アプリケーションコードでPrismaClientを拡張機能で拡張します。
import { PrismaClient } from "@prisma/client/edge";
import { withAccelerate } from "@prisma/extension-accelerate";
export interface Env {
DATABASE_URL: string;
}
export default {
async fetch(request, env, ctx) {
const prisma = new PrismaClient({
datasourceUrl: env.DATABASE_URL,
}).$extends(withAccelerate());
const users = await prisma.user.findMany();
const result = JSON.stringify(users);
return new Response(result);
},
} satisfies ExportedHandler<Env>;
次に、このセクションに示されているように、マイグレーションを実行し、PrismaClient
を生成するためのヘルパースクリプトを設定します。
Cloudflare Workersは.env
ファイルをサポートしていないため、dotenv-cli
パッケージをインストールする必要があります。プロジェクトにローカルでパッケージをインストールするには、以下のコマンドを実行します: npm install -D dotenv-cli
。
エッジ互換ドライバーの使用
Prisma ORMを使用するCloudflare Workerをデプロイする場合、エッジ互換ドライバーと、Prisma ORM用のそれぞれのドライバーアダプターを使用する必要があります。
Cloudflare WorkersとPages用のエッジ互換ドライバーは以下の通りです。
- Neon ServerlessはHTTPを使用してデータベースにアクセスします。
- PlanetScale ServerlessはHTTPを使用してデータベースにアクセスします。
node-postgres
(pg
) はCloudflareのconnect()
(TCP) を使用してデータベースにアクセスします。@libsql/client
はHTTP経由でTursoデータベースにアクセスするために使用されます。- Cloudflare D1はD1データベースにアクセスするために使用されます。
また、将来的にはCloudflare WorkersおよびPagesから従来のMySQLデータベースにアクセスできるようにするため、node-mysql2
ドライバーに関する作業も進められています。
アプリケーションがPostgreSQLを使用している場合、Prisma Postgresの使用をお勧めします。これはエッジランタイムで完全にサポートされており、特殊なエッジ互換ドライバーを必要としません。他のデータベースの場合、Prisma Accelerateはエッジ互換性を拡張し、任意のエッジファンクションプロバイダーから任意のデータベースに接続できます。
データベース接続URLを環境変数として設定する
まず、Prismaスキーマのdatasource
のurl
にDATABASE_URL
が設定されていることを確認してください。
datasource db {
provider = "postgresql" // this might also be `mysql` or another value depending on your database
url = env("DATABASE_URL")
}
開発
開発環境でWorkerを使用する場合、データベース接続はローカルの.dev.vars
ファイルを介して設定できます。
上記のDATABASE_URL
環境変数を使用すると仮定して、.dev.vars
内で次のように設定できます。
DATABASE_URL="your-database-connection-string"
上記の抜粋で、your-database-connection-string
はプレースホルダーであり、これを自身の接続文字列の値に置き換える必要があります。例えば、
DATABASE_URL="postgresql://admin:mypassword42@somehost.aws.com:5432/mydb"
.dev.vars
ファイルは、通常Prisma ORMで使用される.env
ファイルと互換性がないことに注意してください。
これは、Prisma CLIコマンド(例:prisma migrate dev
)を実行するときなど、必要に応じてPrisma ORMが環境変数にアクセスできるようにする必要があることを意味します。
これを実現するにはいくつかの選択肢があります。
- Prisma CLIコマンドを
dotenv
を使用して実行し、CLIが環境変数を読み込む場所を指定します。例:dotenv -e .dev.vars -- npx prisma migrate dev
package.json
に、dotenv
経由で.dev.vars
を読み込むスクリプトを作成します。これにより、npm run env -- npx prisma migrate dev
のようにprisma
コマンドを実行できます。以下にスクリプトのリファレンスを示します。package.json"scripts": { "env": "dotenv -e .dev.vars" }
DATABASE_URL
およびその他の関連する環境変数を、Prisma ORMで使用できる新しいファイル.env
に複製します。
dotenv
を必要とするアプローチを使用している場合は、dotenv-cli
パッケージがインストールされている必要があります。これは、プロジェクトにローカルでパッケージをインストールするこのコマンド(例: npm install -D dotenv-cli
)を使用することで実行できます。
本番環境
Workerを本番環境にデプロイする際には、wrangler
CLIを使用してデータベース接続を設定する必要があります。
npx wrangler secret put DATABASE_URL
このコマンドは対話式で、次のステップとしてターミナルでDATABASE_URL
環境変数の値を入力するように求められます。
このコマンドは認証が必要であり、ログインしていない場合はCloudflareアカウントへのログインを求めます。
無料アカウントのサイズ制限
Cloudflareには、無料プランのWorkersに3 MBのサイズ制限があります。Prisma ORMを含むアプリケーションバンドルがそのサイズを超える場合は、有料のWorkerプランにアップグレードするか、Prisma Accelerateを使用してアプリケーションをデプロイすることをお勧めします。
@cloudflare/next-on-pages
を使ってNext.jsアプリをCloudflare Pagesにデプロイする
Cloudflareは、@cloudflare/next-on-pages
を使ってCloudflare PagesでNext.jsアプリを実行するオプションを提供しています。手順はドキュメントを参照してください。
いくつかのテストに基づいて、以下のことがわかりました。
- PlanetScaleまたはNeon Serverless Driverを使用してデプロイできます。
- 従来のPostgreSQLデプロイは
pg
を使用しているため機能しません。これは、pg
自体が現在@cloudflare/next-on-pages
で機能しないためです(こちらを参照)。
何か変更点があれば、お気軽にDiscordでご連絡ください。
node
でローカル実行時にPRISMA_CLIENT_FORCE_WASM=1
を設定する
一部のフレームワーク(例:hono)は、Workersをローカルで実行するためにwrangler
の代わりにnode
を使用します。そのようなフレームワークを使用している場合、または何らかの理由でWorkerをローカルでnode
で実行している場合は、PRISMA_CLIENT_FORCE_WASM
環境変数を設定する必要があります。
export PRISMA_CLIENT_FORCE_WASM=1
データベース固有の考慮事項と例
このセクションでは、Prisma ORMでCloudflare Workerをデプロイするためのデータベース固有の手順を提供します。
前提条件
以下のセクションの前提条件として、ローカルで実行されているCloudflare WorkerとPrisma CLIがインストールされている必要があります。
まだこれらがない場合は、これらのコマンドを実行できます。
npm create cloudflare@latest prisma-cloudflare-worker-example -- --type hello-world
cd prisma-cloudflare-worker-example
npm install prisma --save-dev && npm install @prisma/client
npx prisma init --output ../generated/prisma
さらに、選択したデータベースプロバイダーのデータベースインスタンスが必要です。そのインスタンスのセットアップについては、各プロバイダーのドキュメントを参照してください。
以下の例では、デフォルトのUser
モデルを使用します。
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
}
PostgreSQL(従来型)
TCPとpg
ドライバーを介してアクセスされる従来のPostgreSQLデータベースを使用している場合は、以下が必要です。
@prisma/adapter-pg
データベースアダプターを使用する(driverAdapters
プレビュー機能経由)wrangler.toml
でnode_compat = true
を設定する(Cloudflareドキュメントを参照)
1. Prismaスキーマとデータベース接続の設定
デプロイするプロジェクトがない場合は、前提条件の指示に従って、Prisma ORMを組み込んだ基本的なCloudflare Workerをブートストラップしてください。
まず、データベース接続が適切に設定されていることを確認してください。Prismaスキーマで、datasource
ブロックのurl
をDATABASE_URL
環境変数に設定します。また、driverAdapters
機能フラグも有効にする必要があります。
generator client {
provider = "prisma-client-js"
previewFeatures = ["driverAdapters"]
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
次に、DATABASE_URL
環境変数をデータベース接続文字列の値に設定する必要があります。これは、Cloudflareで使用される.dev.vars
というファイルで行います。
DATABASE_URL="postgresql://admin:mypassword42@somehost.aws.com:5432/mydb"
Prisma CLIはデフォルトで.env
ファイルとのみ互換性があるため、.dev.vars
から環境変数を読み込む以下のスクリプトでpackage.json
を調整できます。このスクリプトを使用して、prisma
コマンドを実行する前に環境変数を読み込むことができます。
このスクリプトをpackage.json
に追加します
{
// ...
"scripts": {
// ....
"env": "dotenv -e .dev.vars"
},
// ...
}
これで、.dev.vars
内の環境変数にコマンドがアクセスできることを確認しながら、以下のようにPrisma CLIコマンドを実行できます。
npm run env -- npx prisma
2. 依存関係のインストール
次に、必要なパッケージをインストールします。
npm install @prisma/adapter-pg
3. wrangler.toml
でnode_compat = true
を設定する
wrangler.toml
ファイルに、以下の行を追加します。
node_compat = true
Cloudflare Pagesでは、node_compat
の使用は公式にはサポートされていません。Cloudflare Pagesでpg
を使用したい場合は、こちらで回避策を見つけることができます。
4. データベーススキーマの移行(該当する場合)
上記でnpx prisma init
を実行した場合、Prismaスキーマで定義されているUser
テーブルを作成するためにデータベーススキーマを移行する必要があります(データベースに必要なテーブルがすべて揃っている場合は、このステップをスキップできます)。
npm run env -- npx prisma migrate dev --name init
5. WorkerでPrisma Clientを使用してデータベースにクエリを送信する
以下は、PrismaClient
をインスタンス化してデータベースにクエリを送信するために使用できるサンプルコードスニペットです。
import { PrismaClient } from '@prisma/client'
import { PrismaPg } from '@prisma/adapter-pg'
export default {
async fetch(request, env, ctx) {
const adapter = new PrismaPg({ connectionString: env.DATABASE_URL })
const prisma = new PrismaClient({ adapter })
const users = await prisma.user.findMany()
const result = JSON.stringify(users)
return new Response(result)
},
}
6. Workerをローカルで実行する
Workerをローカルで実行するには、wrangler dev
コマンドを実行します。
npx wrangler dev
7. DATABASE_URL
環境変数を設定し、Workerをデプロイする
Workerをデプロイするには、まずwrangler
CLIを介してDATABASE_URL
環境変数を設定する必要があります。
npx wrangler secret put DATABASE_URL
このコマンドは対話式で、次のステップとしてターミナルでDATABASE_URL
環境変数の値を入力するように求められます。
このコマンドは認証が必要であり、ログインしていない場合はCloudflareアカウントへのログインを求めます。
その後、Workerをデプロイできます。
npx wrangler deploy
コマンドは、デプロイされたWorkerにアクセスできるURLを出力します。
PlanetScale
PlanetScaleデータベースを使用している場合は、以下が必要です。
-
@prisma/adapter-planetscale
データベースアダプターを使用する(driverAdapters
プレビュー機能経由) -
競合する
cache
フィールドを手動で削除するexport default {
async fetch(request, env, ctx) {
const adapter = new PrismaPlanetScale({
url: env.DATABASE_URL,
// see https://github.com/cloudflare/workerd/issues/698
fetch(url, init) {
delete init['cache']
return fetch(url, init)
},
})
const prisma = new PrismaClient({ adapter })
// ...
},
}
1. Prismaスキーマとデータベース接続の設定
デプロイするプロジェクトがない場合は、前提条件の指示に従って、Prisma ORMを組み込んだ基本的なCloudflare Workerをブートストラップしてください。
まず、データベース接続が適切に設定されていることを確認してください。Prismaスキーマで、datasource
ブロックのurl
をDATABASE_URL
環境変数に設定します。また、driverAdapters
機能フラグも有効にする必要があります。
generator client {
provider = "prisma-client-js"
previewFeatures = ["driverAdapters"]
}
datasource db {
provider = "mysql"
url = env("DATABASE_URL")
relationMode = "prisma" // required for PlanetScale (as by default foreign keys are disabled)
}
次に、DATABASE_URL
環境変数をデータベース接続文字列の値に設定する必要があります。これは、Cloudflareで使用される.dev.vars
というファイルで行います。
DATABASE_URL="mysql://32qxa2r7hfl3102wrccj:password@us-east.connect.psdb.cloud/demo-cf-worker-ps?sslaccept=strict"
Prisma CLIはデフォルトで.env
ファイルとのみ互換性があるため、.dev.vars
から環境変数を読み込む以下のスクリプトでpackage.json
を調整できます。このスクリプトを使用して、prisma
コマンドを実行する前に環境変数を読み込むことができます。
このスクリプトをpackage.json
に追加します
{
// ...
"scripts": {
// ....
"env": "dotenv -e .dev.vars"
},
// ...
}
これで、.dev.vars
内の環境変数にコマンドがアクセスできることを確認しながら、以下のようにPrisma CLIコマンドを実行できます。
npm run env -- npx prisma
2. 依存関係のインストール
次に、必要なパッケージをインストールします。
npm install @prisma/adapter-planetscale
3. データベーススキーマの移行(該当する場合)
上記でnpx prisma init
を実行した場合、Prismaスキーマで定義されているUser
テーブルを作成するためにデータベーススキーマを移行する必要があります(データベースに必要なテーブルがすべて揃っている場合は、このステップをスキップできます)。
npm run env -- npx prisma db push
4. WorkerでPrisma Clientを使用してデータベースにクエリを送信する
以下は、PrismaClient
をインスタンス化してデータベースにクエリを送信するために使用できるサンプルコードスニペットです。
import { PrismaClient } from '@prisma/client'
import { PrismaPlanetScale } from '@prisma/adapter-planetscale'
export default {
async fetch(request, env, ctx) {
const adapter = new PrismaPlanetScale({
url: env.DATABASE_URL,
// see https://github.com/cloudflare/workerd/issues/698
fetch(url, init) {
delete init['cache']
return fetch(url, init)
},
})
const prisma = new PrismaClient({ adapter })
const users = await prisma.user.findMany()
const result = JSON.stringify(users)
return new Response(result)
},
}
6. Workerをローカルで実行する
Workerをローカルで実行するには、wrangler dev
コマンドを実行します。
npx wrangler dev
7. DATABASE_URL
環境変数を設定し、Workerをデプロイする
Workerをデプロイするには、まずwrangler
CLIを介してDATABASE_URL
環境変数を設定する必要があります。
npx wrangler secret put DATABASE_URL
このコマンドは対話式で、次のステップとしてターミナルでDATABASE_URL
環境変数の値を入力するように求められます。
このコマンドは認証が必要であり、ログインしていない場合はCloudflareアカウントへのログインを求めます。
その後、Workerをデプロイできます。
npx wrangler deploy
コマンドは、デプロイされたWorkerにアクセスできるURLを出力します。
Neon
Neonデータベースを使用している場合は、以下が必要です。
@prisma/adapter-neon
データベースアダプターを使用する(driverAdapters
プレビュー機能経由)
1. Prismaスキーマとデータベース接続の設定
デプロイするプロジェクトがない場合は、前提条件の指示に従って、Prisma ORMを組み込んだ基本的なCloudflare Workerをブートストラップしてください。
まず、データベース接続が適切に設定されていることを確認してください。Prismaスキーマで、datasource
ブロックのurl
をDATABASE_URL
環境変数に設定します。また、driverAdapters
機能フラグも有効にする必要があります。
generator client {
provider = "prisma-client-js"
previewFeatures = ["driverAdapters"]
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
次に、DATABASE_URL
環境変数をデータベース接続文字列の値に設定する必要があります。これは、Cloudflareで使用される.dev.vars
というファイルで行います。
DATABASE_URL="postgresql://janedoe:password@ep-nameless-pond-a23b1mdz.eu-central-1.aws.neon.tech/neondb?sslmode=require"
Prisma CLIはデフォルトで.env
ファイルとのみ互換性があるため、.dev.vars
から環境変数を読み込む以下のスクリプトでpackage.json
を調整できます。このスクリプトを使用して、prisma
コマンドを実行する前に環境変数を読み込むことができます。
このスクリプトをpackage.json
に追加します
{
// ...
"scripts": {
// ....
"env": "dotenv -e .dev.vars"
},
// ...
}
これで、.dev.vars
内の環境変数にコマンドがアクセスできることを確認しながら、以下のようにPrisma CLIコマンドを実行できます。
npm run env -- npx prisma
2. 依存関係のインストール
次に、必要なパッケージをインストールします。
npm install @prisma/adapter-neon
3. データベーススキーマの移行(該当する場合)
上記でnpx prisma init
を実行した場合、Prismaスキーマで定義されているUser
テーブルを作成するためにデータベーススキーマを移行する必要があります(データベースに必要なテーブルがすべて揃っている場合は、このステップをスキップできます)。
npm run env -- npx prisma migrate dev --name init
5. WorkerでPrisma Clientを使用してデータベースにクエリを送信する
以下は、PrismaClient
をインスタンス化してデータベースにクエリを送信するために使用できるサンプルコードスニペットです。
import { PrismaClient } from '@prisma/client'
import { PrismaNeon } from '@prisma/adapter-neon'
export default {
async fetch(request, env, ctx) {
const adapter = new PrismaNeon({ connectionString: env.DATABASE_URL })
const prisma = new PrismaClient({ adapter })
const users = await prisma.user.findMany()
const result = JSON.stringify(users)
return new Response(result)
},
}
6. Workerをローカルで実行する
Workerをローカルで実行するには、wrangler dev
コマンドを実行します。
npx wrangler dev
7. DATABASE_URL
環境変数を設定し、Workerをデプロイする
Workerをデプロイするには、まずwrangler
CLIを介してDATABASE_URL
環境変数を設定する必要があります。
npx wrangler secret put DATABASE_URL
このコマンドは対話式で、次のステップとしてターミナルでDATABASE_URL
環境変数の値を入力するように求められます。
このコマンドは認証が必要であり、ログインしていない場合はCloudflareアカウントへのログインを求めます。
その後、Workerをデプロイできます。
npx wrangler deploy
コマンドは、デプロイされたWorkerにアクセスできるURLを出力します。