メインコンテンツにスキップ

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スキーマのdatasourceurlDATABASE_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内で次のように設定できます。

.dev.vars
DATABASE_URL="your-database-connection-string"

上記の抜粋で、your-database-connection-stringはプレースホルダーであり、これを自身の接続文字列の値に置き換える必要があります。例えば、

.dev.vars
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.tomlnode_compat = trueを設定する(Cloudflareドキュメントを参照)

1. Prismaスキーマとデータベース接続の設定

デプロイするプロジェクトがない場合は、前提条件の指示に従って、Prisma ORMを組み込んだ基本的なCloudflare Workerをブートストラップしてください。

まず、データベース接続が適切に設定されていることを確認してください。Prismaスキーマで、datasourceブロックのurlDATABASE_URL環境変数に設定します。また、driverAdapters機能フラグも有効にする必要があります。

schema.prisma
generator client {
provider = "prisma-client-js"
previewFeatures = ["driverAdapters"]
}

datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}

次に、DATABASE_URL環境変数をデータベース接続文字列の値に設定する必要があります。これは、Cloudflareで使用される.dev.varsというファイルで行います。

.dev.vars
DATABASE_URL="postgresql://admin:mypassword42@somehost.aws.com:5432/mydb"

Prisma CLIはデフォルトで.envファイルとのみ互換性があるため、.dev.varsから環境変数を読み込む以下のスクリプトでpackage.jsonを調整できます。このスクリプトを使用して、prismaコマンドを実行する前に環境変数を読み込むことができます。

このスクリプトをpackage.jsonに追加します

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.tomlnode_compat = trueを設定する

wrangler.tomlファイルに、以下の行を追加します。

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ブロックのurlDATABASE_URL環境変数に設定します。また、driverAdapters機能フラグも有効にする必要があります。

schema.prisma
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というファイルで行います。

.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に追加します

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ブロックのurlDATABASE_URL環境変数に設定します。また、driverAdapters機能フラグも有効にする必要があります。

schema.prisma
generator client {
provider = "prisma-client-js"
previewFeatures = ["driverAdapters"]
}

datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}

次に、DATABASE_URL環境変数をデータベース接続文字列の値に設定する必要があります。これは、Cloudflareで使用される.dev.varsというファイルで行います。

.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に追加します

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を出力します。

© . All rights reserved.