サーバーレスコンピューティングは、アプリケーションコードについては「管理するサーバーがない」という問題を解決しましたが、データベースは取り残された厄介な存在でした。Workerをエッジでミリ秒単位で実行できても、その後、遠く離れた単一リージョンにあるデータベースを待つのを見守ることになっていたのです。Cloudflare D1はそのギャップを埋めます。これはSQLite上に構築された本物のSQLデータベースで、Cloudflareのネットワーク上に存在し、あなたのWorkerに直接バインドします。ふつうのSQLを書き、実際に実行したクエリの分だけ課金されます。
このガイドでは、D1とは何か、いくらかかるか、Workerからどのようにクエリするか、そしてKVや従来のPostgresデータベースより選ぶべき場面を解説します。
要点
- D1はSQLite上に構築されたサーバーレスSQLデータベースで、Cloudflare Workersに直接バインドされます
- 無料枠は寛大です。1日あたり500万行の読み取りと100,000行の書き込み、さらに5 GBのストレージ
- 課金は読み取り・書き込み行に対してであり、稼働時間に対してではありません。アイドル状態のデータベースは無料です
- 準備済みステートメントを使った馴染みのSQLなので、学習曲線はほとんどありません
- プラットフォームの他の部分、Workers AI 、R2、KVと組み合わせて、完全なアプリを構築できます
- 無料のデスクトップアプリEasy Cloudflare D1 でデータベースを視覚的に管理できます
Cloudflare D1とは何か
Cloudflare D1 は、マネージドでサーバーレスなデータベースです。世界で最も実戦で鍛えられたデータベースエンジンの一つであるSQLite上に構築された、リレーショナルなSQLストアです。ここでの「サーバーレス」とは、インスタンスをプロビジョニングしたり、サイズを選んだり、何かを稼働させ続けたりすることが一切ないという意味です。データベースを作成し、Workerにバインドして、SQLを実行します。ストレージ、耐久性、スケーリングはCloudflareが処理します。
標準SQLを話すため、D1はリレーショナルデータベースを使ったことのある人なら誰でもすぐに馴染めます。テーブルを定義し、SELECT、INSERT、UPDATE、DELETE文を書き、インデックスを作成し、トランザクションを使います。違いは運用面にあります。チューニングすべき接続プールも、パッチを当てるべきサーバーも、アイドルコストもありません。
Cloudflare D1の料金と無料枠
D1の課金モデルは、最良の意味で珍しいものです。時間ではなく、読み取り・書き込み行で測られるクエリに対して支払います。アイドル状態のデータベースは、稼働するインスタンスがないため無料です。2026年のD1公式料金 より:
Workers無料プラン
| リソース | 1日の上限 |
|---|---|
| 読み取り行 | 1日あたり500万 |
| 書き込み行 | 1日あたり100,000 |
| ストレージ | 合計5 GB |
Workers有料プラン
| リソース | 含まれる分、その後 |
|---|---|
| 読み取り行 | 月250億まで、その後100万あたり0.001ドル |
| 書き込み行 | 月5,000万まで、その後100万あたり1.00ドル |
| ストレージ | 最初の5 GB、その後GB月あたり0.75ドル |
データ転送料やエグレス料金はありません。役立つ最適化の詳細として、インデックスは、クエリがスキャンする行を減らすことで、課金対象の行読み取りを大幅に削減できます。代償は書き込み量のわずかな増加です。読み取りの多いワークロードでは、適切なインデックスがレイテンシと請求額の両方を低く保ちます。
Workerからのクエリ
D1データベースをwrangler.tomlでバインドし、env.DBを通じてアクセスします。D1は準備済みステートメントを使い、クエリテキストを値から分離することで、SQLインジェクションからクエリを守ります。
1export default {
2 async fetch(request, env) {
3 // Read with a parameterised query
4 const { results } = await env.DB
5 .prepare("SELECT id, title FROM posts WHERE published = ? ORDER BY created_at DESC LIMIT 10")
6 .bind(1)
7 .all();
8
9 return Response.json(results);
10 },
11};
データの挿入も同じパターンに従います。
1await env.DB
2 .prepare("INSERT INTO posts (title, body, published) VALUES (?, ?, ?)")
3 .bind("Hello D1", "My first edge database post", 1)
4 .run();
複数のステートメントをバッチ化して、1回の往復で効率的に実行することもできます。これは、関連する書き込みが複数ある場合の推奨アプローチです。
Cloudflare D1対KV対Postgres
適切なストレージプリミティブを選ぶことは重要です。D1が、最もよく比較される2つとどう比べられるかを示します。
| ニーズ | 最適な選択 | 理由 |
|---|---|---|
| リレーショナルデータ、クエリ、結合 | D1 | テーブル、インデックス、トランザクションを備えた本物のSQL |
| 単純なキー・バリュー検索、設定、キャッシュ | KV | エッジでの単一キーの高速読み取りに最適化 |
| 大規模な既存のリレーショナルワークロード、複雑な拡張 | Postgres(例:Hyperdrive経由) | 重く機能豊富なワークロード向けの成熟したエンジン |
要するに、できるだけ速くキーで値を取得したいだけならKVを使います。データがリレーショナルで、SQLでクエリしたいならD1を使います。大規模で確立されたリレーショナルワークロードがある場合や、SQLiteが提供しないPostgres固有の機能が必要な場合は、完全なPostgresデータベース(WorkersはHyperdriveで高速化されて接続できます)を選びます。
Cloudflare D1が正しい選択となるとき
D1は次のような場合に最適です。
- データがリレーショナルで、SQLクエリ、結合、インデックスから恩恵を受ける
- Workers上で構築していて、データベースを同じプラットフォームに置きたい
- ワークロードが急峻、または低〜中程度で、従量課金が常時稼働インスタンスに勝る
- 運用上のオーバーヘッドをゼロにしたい。プロビジョニング、パッチ適用、接続プールが不要
- アプリケーションのニーズの大半をカバーするSQLiteの機能セットで満足できる
その限界を超える非常に大きなデータセットや、Postgres固有の拡張に依存するワークロードには、あまり向きません。それらには、代わりにWorkerから専用データベースを接続してください。
現実的なユースケース
典型的なD1アプリケーション:Workerがリクエストを処理し、D1から投稿やユーザーレコードをクエリし、アップロードされたファイルや画像をR2 に保存し、ホットな値をKVにキャッシュし、要約などの機能のために任意でWorkers AI を呼び出す、ブログや小規模なSaaSバックエンドです。すべてが1つのプラットフォーム上、エッジで、サーバーなしに動き、請求額は実際の使用量に応じてスケールします。これは、私が構築したCloudflare Pagesのユーザーシステム の背後にあるのと同じアーキテクチャパターンです。
D1を視覚的に管理する
マイグレーションの実行やデータの確認をコマンドラインで行うのも問題ありませんが、グラフィカルなクライアントは日々の作業を速くします。無料のデスクトップアプリEasy Cloudflare D1 では、データベースやテーブルを閲覧し、クエリを実行し、Windows・macOS・Linuxの整ったインターフェースからD1データを管理できます。認証情報はご自身のマシン上でローカルに暗号化されます。さらに、スタックがキャッシュのためにD1とKVを組み合わせているなら、無料のEasy Cloudflare KV アプリがキー・バリューの名前空間に同じことを提供します。
重要なポイント
- D1はSQLite上に構築されたサーバーレスSQLデータベースで、Cloudflare Workersに直接バインドされます
- 無料枠は1日あたり500万の読み取りと100,000の書き込みを5 GBのストレージでカバーします
- 課金は読み取り・書き込み行ごとであり、時間ごとではありません。アイドル状態のデータベースは無料です
- 安全な準備済みステートメントを使った標準SQLなので、学習曲線は最小限です
- キー・バリュー検索にはKV、リレーショナルSQLにはD1、重いまたは拡張固有のワークロードには専用Postgresを使います
- D1はR2、KV、Workers AIと組み合わせて、完全なエッジアプリケーションを構築します
よくある質問
Cloudflare D1とは何ですか? D1はSQLite上に構築されたサーバーレスSQLデータベースで、Cloudflareのネットワーク上で動作し、Workersに直接バインドします。標準SQLを書き、サーバーをプロビジョニングしたり管理したりすることは一切ありません。ストレージ、耐久性、スケーリングはCloudflareが処理します。
Cloudflare D1は無料ですか? Workers無料プランに無料枠があります。1日あたり500万行の読み取りと100,000行の書き込み、5 GBのストレージです。多くの小規模アプリケーションはこれらの制限内で完全に動作します。Workers有料プランは含まれる量を大幅に引き上げます。
D1の料金はどう決まりますか? 稼働時間ではなく、読み取り・書き込み行に対して支払います。有料プランでは月に最初の250億行の読み取りと5,000万行の書き込みが含まれ、その後は100万読み取りあたり0.001ドル、100万書き込みあたり1.00ドル、ストレージは最初の5 GBを超えてGB月あたり0.75ドルです。エグレス料金はありません。
D1とKVの違いは何ですか? KVは単一キーの高速読み取りに最適化されたキー・バリューストアで、キャッシュや設定に理想的です。D1は、結合、インデックス、トランザクションでクエリしたい構造化データ向けのリレーショナルSQLデータベースです。キーによる検索にはKV、リレーショナルクエリにはD1を使います。
D1はPostgresを置き換えられますか? 多くの小〜中規模アプリケーションでは、SQLiteが一般的なリレーショナルニーズをカバーするため、置き換えられます。非常に大きなデータセット、重い同時書き込みワークロード、Postgres固有の拡張には、Workerから接続する専用Postgresデータベース(Hyperdriveで高速化)の方が適しています。
WorkerからD1をクエリするには? wrangler設定でデータベースをバインドし、env.DBを通じてアクセスします。バインドしたパラメータで準備済みステートメントを使います。例えばenv.DB.prepare(“SELECT … WHERE id = ?”).bind(id).all()のように書くと、クエリがSQLインジェクションから守られます。
コメント