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を使用するために必要なClient拡張機能をインストールする必要があります
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 データベースにアクセスするために使用されます
node-mysql2
ドライバーでも作業が進められており、将来的には Cloudflare Workers および Pages から従来の MySQL データベースへのアクセスも可能になる予定です。
アプリケーションで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ファイルを介してデータベース接続を設定できます。.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 ORMが必要なときに環境変数にアクセスできるようにする必要があることを意味します。例:prisma migrate devのようなPrisma CLIコマンドを実行する場合。
これを実現するためのいくつかのオプションがあります
- dotenvを使用してPrisma CLIコマンドを実行し、CLIが環境変数を読み取る場所を指定します。例:
dotenv
dotenv -e .dev.vars -- npx prisma migrate dev
- dotenvを介して.dev.varsを読み取るスクリプトをpackage.jsonに作成します。その後、次のようにprismaコマンドを実行できます:
npm run env -- npx prisma migrate dev
。スクリプトの参照を次に示しますdotenv
。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の無料プランのWorkerには3MBのサイズ制限があります。Prisma ORMを含むアプリケーションバンドルがそのサイズを超える場合は、有料のWorkerプランにアップグレードするか、Prisma Accelerateを使用してアプリケーションをデプロイすることをお勧めします。
pgと@prisma/adapter-pgパッケージでこの問題が発生している場合は、pgをカスタムの@prisma/pg-worker
パッケージに置き換え、それに属する@prisma/adapter-pg-worker
アダプターを使用できます。
@prisma/pg-worker
は、Workerで使用するように設計されたpgの最適化された軽量バージョンです。pgのドロップイン代替品であり、Prisma ORMと完全に互換性があります。
@cloudflare/next-on-pagesを使用してNext.jsアプリをCloudflare Pagesにデプロイする
Cloudflareは、@cloudflare/next-on-pages
を使用してCloudflare PagesでNext.jsアプリを実行するオプションを提供しています。手順についてはドキュメントを参照してください。
いくつかのテストに基づき、次のことがわかりました
- PlanetScaleまたはNeon Serverless Driverを使用してデプロイできます。
- pgを使用する従来のPostgreSQLデプロイメントは、pg自体が現在@cloudflare/next-on-pagesで動作しないため、機能しません(こちらを参照)。
これについて何か変更があった場合は、Discordでお気軽にお問い合わせください。
nodeでローカルで実行する場合はPRISMA_CLIENT_FORCE_WASM=1を設定します
一部のフレームワーク(例:hono)は、Workerをローカルで実行するためにwranglerの代わりにnodeを使用します。そのようなフレームワークを使用している場合、または別の理由でnodeを使用してWorkerをローカルで実行している場合は、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
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 Preview機能経由)。
- wrangler.tomlでnode_compat = trueを設定します(Cloudflareドキュメントを参照)。Cloudflareドキュメント
サイズの問題が発生し、そのためアプリケーションをデプロイできない場合は、pgドライバーパッケージのよりスリムなバリアントである@prisma/pg-worker
と、それに属する@prisma/adapter-pg-worker
アダプターを使用できます。
@prisma/pg-worker
は、Workerで使用するように設計されたpgの最適化された軽量バージョンです。pgのドロップイン代替品であり、Prisma ORMと完全に互換性があります。
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
npm install pg
npm install @types/pg --save-dev # if you're using TypeScript
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'
import { Pool } from 'pg'
export default {
async fetch(request, env, ctx) {
const pool = new Pool({ connectionString: env.DATABASE_URL })
const adapter = new PrismaPg(pool)
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 Preview機能経由)。
-
手動で競合するキャッシュフィールドを削除します(詳細はこちら)。
export default {
async fetch(request, env, ctx) {
const client = new Client({
url: env.DATABASE_URL,
// see https://github.com/cloudflare/workerd/issues/698
fetch(url, init) {
delete init['cache']
return fetch(url, init)
},
})
const adapter = new PrismaPlanetScale(client)
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
npm install @planetscale/database
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'
import { Client } from '@planetscale/database'
export default {
async fetch(request, env, ctx) {
const client = new Client({
url: env.DATABASE_URL,
// see https://github.com/cloudflare/workerd/issues/698
fetch(url, init) {
delete init['cache']
return fetch(url, init)
},
})
const adapter = new PrismaPlanetScale(client)
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 Preview機能経由)。
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
npm install @neondatabase/serverless
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'
import { Pool } from '@neondatabase/serverless'
export default {
async fetch(request, env, ctx) {
const neon = new Pool({ connectionString: env.DATABASE_URL })
const adapter = new PrismaNeon(neon)
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を出力します。