March 12, 2024

Prisma ORM の Edge Functions サポートがプレビューで利用可能になりました

Edge Functions のサポートがプレビューで利用可能になったことをお知らせします!Vercel Edge Functions、Vercel Edge Middleware、Cloudflare Workers、Cloudflare Pages から Prisma ORM でデータベースにアクセスできるようになりました。「Try it out!」をお試しください!

Prisma ORM Support for Edge Functions (Preview)

エッジ関数とは?

エッジ関数は、グローバルに分散された軽量なサーバーレスコンピューティングの一形態です。これにより、エンドユーザーにできるだけ近い場所でアプリケーションをデプロイおよび実行できます。

エッジ関数でアプリケーションを高速化

地理的に分散されたエッジ関数の性質のおかげで、ユーザーとデータセンター間の距離が短縮されます。これにより、リクエストのレイテンシが減少し、応答時間が向上し、エッジ関数はパフォーマンスを向上させ、アプリケーションのユーザーエクスペリエンスを大幅に改善するための優れたアプローチとなります。

エッジ関数における技術的な制約

Vercel Edge Functions と Cloudflare Workers は、標準の Node.js ランタイムを使用していません。代わりに、 V8 isolates でコードを実行しています。その結果、これらのエッジ関数は、標準の Node.js API の小さなサブセットにのみアクセスでき、コンピューティングリソース(CPU とメモリ)も制約されています。

特に、TCP 接続を自由に開けないという制約により、エッジ関数から従来のデータベースと通信することが困難になっています。Cloudflare は、限定的な TCP 接続を可能にする connect() API を導入しましたが、これは依然として、その API と互換性のある特定のデータベースドライバーを使用したデータベースアクセスのみを可能にします。

注:Node.js エコシステムでは、Cloudflare Workers と互換性のある最も一般的な従来のデータベースドライバーは、Cloudflare Workers と互換性のある node-postgres for PostgreSQL です。ただし、node-mysql2 ドライバーで MySQL を Cloudflare Workers と互換性を持たせるための作業も進行中です

Neon や Neon や PlanetScale などの最新のデータベースプロバイダーは、HTTP 経由でデータベースと通信する serverless drivers をリリースすることで、この制限を回避しました。

Prisma ORM を使用したエッジ関数でのデータベースアクセス 🎉

以前のバージョンでもエッジ関数で Prisma ORM を使用することは可能でしたが、常にエッジ関数とデータベース間のプロキシとして Prisma Accelerate を使用する必要がありました。

上記の技術的な制約により、Prisma ORM を使用したアプリケーションをエッジに「そのまま」デプロイすることはできませんでした。

  • データベースアクセスは、特定のドライバー(serverless driver、または Cloudflare の connect() と互換性のあるドライバー)でのみ機能します。ここでの問題は、Prisma ORM がクエリエンジンに組み込みのドライバーしか持っておらず、互換性のある Node.js ドライバーを使用できなかったことでした。
  • エッジ関数にアップロードされるアプリケーションバンドルのサイズ制限により、Prisma ORM のクエリエンジンが大きすぎてサイズ制限を超えてしまうため、Prisma ORM を使用することは不可能でした。
  • エッジ関数は、Node.js API の限られたセットへのアクセスのみを許可します。これらの API の一部は Prisma Client が動作するために必要ですが、これらにアクセスできないため、Prisma Client はいくつかの制限を回避する必要があります。

v5.11.0 リリースでこれらの制限が解除され、プレビューでエッジ関数で Prisma ORM を実行できるようになったことを嬉しく思います🎉

最近導入された driver adapters プレビュー機能のおかげで、開発者は Node.js エコシステムの好きなデータベースドライバーで Prisma ORM を使用できるようになりました!

さらに、Prisma ORM のクエリエンジンのサイズを大幅に縮小することができたため、エッジ関数の限られたランタイム環境に収まるようになりました。

エッジ関数で Prisma ORM を使用する方法

🔬 実際の例をご覧になりたい場合は、Prisma ORM を Vercel Edge Functions で使用してデータベースにアクセスする方法を示す小さな GitHub リポジトリ をまとめました。

PlanetScale データベースを使用した Cloudflare Worker で Prisma ORM を起動して実行する方法を学ぶために読み進めてください(または、ドキュメントを確認して 、別のエッジデプロイメントとデータベースプロバイダーの組み合わせを使用してください)。

0. 前提条件

以下の手順を実行する前に、以下があることを確認してください。

  • Node.js がマシンにインストールされていること
  • Cloudflare アカウント
  • PlanetScale インスタンスが起動および実行されており、その接続文字列が利用可能であること

1. アプリケーションのセットアップ

create-cloudflare-cli を使用してプロジェクトを初期化し、CLI ウィザードの手順に従い、プロンプトに対してデフォルトオプションを選択します。

2. Prisma のセットアップ

新しいディレクトリに移動し、Prisma CLI をインストールします。

次に、次のコマンドでプロジェクトに Prisma を初期化します。

上記のコマンドは、

  • prisma/schema.prisma に Prisma スキーマファイルを作成しました。
  • 環境変数を格納する .env ファイルを作成しました。

.env ファイルには、プレースホルダー DATABASE_URL 環境変数が含まれています。

値を、PlanetScale データベースに接続する実際の接続文字列で更新します。これは次のようになります。

注:上記の接続文字列は、データベースの username、 password、 name のプレースホルダーを使用しています。これらを自分のデータベースの値に置き換えてください。

Prisma スキーマを次のように更新します。

上記の Prisma スキーマは、

  • driverAdapters プレビュー機能フラグを有効にします。
  • Log モデルと Level 列挙型を定義します。

データモデルをデータベースにマッピングするには、prisma db push CLI コマンドを使用する必要があります。

これにより、PlanetScale ダッシュボードで表示できる新しい Log テーブルがデータベースに作成されました。

3. Cloudflare Worker 関数の記述

wrangler.toml ファイルで、[vars] キーとデータベース接続文字列を追加します(以前と同様に、USERNAMEPASSWORDDATABASE のプレースホルダーを自分の PlanetScale インスタンスの値に置き換えます)。

注:これはデモアプリであるため、プレーンな接続文字列を wrangler.toml に追加しています。ただし、このファイルは通常バージョン管理にコミットされるため、データベース接続を公開することになるため、本番環境では絶対に行わないでください。代わりに、Cloudflare のシークレット構成 を使用してください。

次に、PlanetScale serverless database driver とその driver adapter をインストールします。

src/index.ts ファイルの Cloudflare Worker スニペットの例を次のコードで更新します。

アプリケーションを起動します。

ターミナル出力から、localhost を指す URL を開くか、b キーを押してブラウザを開き、Worker 関数を呼び出すことができます。

すべてがうまくいけば、次のような出力が表示されます。

4. Cloudflare Workers への公開

次のコマンドを実行して、アプリケーションをデプロイできます。

このコマンドは、エッジ関数を Cloudflare にデプロイし、アクセスできる URL を出力します。

試してフィードバックをお寄せください

皆様のご意見をお待ちしております!Vercel または Vercel または Cloudflare を使用したエッジデプロイメントの新しいサポートを試し、Twitter または Discord 🚀 でフィードバックをお寄せください。

問題が発生した場合は、こちら でバグレポートを作成できます。

次の投稿をお見逃しなく!

Prisma ニュースレターに登録する