2024年3月12日

Prisma ORM のエッジ関数サポートがプレビュー版で利用可能に

エッジ関数のサポートがプレビュー版で利用可能になったことをお知らせします!Vercel Edge Functions、Vercel Edge Middleware、Cloudflare Workers、Cloudflare Pages から Prisma ORM を使ってデータベースにアクセスできるようになりました。ぜひお試しください

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 と互換性のある最も人気のある従来のデータベースドライバーは、PostgreSQL 用の node-postgres です。しかし、node-mysql2 ドライバーで MySQL を Cloudflare Workers と互換性を持たせるための 作業も行われています

NeonPlanetScale などの最新のデータベースプロバイダーは、HTTP 経由でデータベースと通信する サーバーレスドライバー をリリースすることで、この制限を回避しました。

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

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

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

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

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

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

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

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

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

Cloudflare WorkerPlanetScale データベース を使用して 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 データベースに接続するための実際の接続文字列で更新します。以下のようになるかもしれません。

注: 上記の接続文字列は、データベースのユーザー名パスワード、および名前にプレースホルダーを使用しています。これらを自身のデータベースの値に置き換えてください。

Prisma スキーマを以下のように更新します

上記の Prisma スキーマは

  • driverAdapters プレビュー機能を有効にします
  • Log モデルと Level enum を定義します

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

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

3. Cloudflare Worker 関数を記述する

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

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

次に、PlanetScale サーバーレスデータベースドライバーとその ドライバーアダプター をインストールします。

src/index.ts ファイル内の Cloudflare Worker の例のコードを以下のコードで更新します

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

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

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

4. Cloudflare Workers に公開する

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

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

ぜひお試しいただき、ご意見をお聞かせください。

ご意見をぜひお聞かせください!Vercel または Cloudflare を使用したエッジデプロイの新しいサポートをお試しいただき、Twitter または Discord を通じてフィードバックをお寄せください 🚀

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

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

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

© . All rights reserved.