Cloud Service
D1(サーバーレスSQLite)
Workersから直接呼び出せる、運用不要のサーバーレスSQLiteデータベース。小〜中規模のリレーショナルデータを低コストで扱え、AWSのAurora Serverlessに近い位置づけ。
- 1.SQLite互換のサーベーレスDBをWorkersにバインドしてSQLで扱える。
- 2.単一プライマリ+読み取りレプリカ構成で、書き込みは1か所に集約される。
- 3.小規模〜中規模のリレーショナル用途向けで、大規模分析やグローバル大量書き込みは不向き。
解決する課題
- Workers アプリでリレーショナルなデータ(注文、ユーザー、在庫など)を扱いたいが、DB サーバーの構築・パッチ・スケーリングを自分で運用したくない
- SQL の使い慣れた表現力(JOIN、トランザクション、インデックス)を、エッジに近い場所で低レイテンシに使いたい
- 小〜中規模のワークロードで、常時起動のインスタンス課金ではなく使った分だけの課金にしたい
- KV や Durable Objects だけでは表現しにくい、複数テーブルにまたがる関係データを扱いたい
主要概念と用語
- データベース(Database): D1 の管理単位。SQLite 互換のエンジンで動作する論理データベース
- バインディング(Binding): Worker のコードから
env経由でデータベースへ直接アクセスするための接続定義。ネットワーク越しの資格情報管理が不要 - プリペアドステートメント(Prepared Statement): パラメータ化された SQL 文を組み立てて実行する基本 API。SQL インジェクション対策にもなる
- バッチ(Batch): 複数のステートメントをまとめて送信し、まとめて実行する仕組み
- 読み取りレプリカ(Read Replication): 書き込みは単一のプライマリに集約されるが、読み取りは近傍のレプリカへ分散できる機能
- マイグレーション(Migrations): スキーマ変更を管理・適用するための仕組み。ローカルとリモートの両方に適用できる
- Time Travel: 過去の任意時点の状態へデータベースを巻き戻せる、D1 固有の復元機能
- wrangler: D1 のデータベース作成・マイグレーション適用・クエリ実行などを行う Cloudflare の CLI ツール
仕様・制限・クォータ
- 1 つのデータベースあたりの最大サイズには上限があり、上限を超える見込みの大規模データセットには不向き(正確な値は公式ドキュメントを参照)
- 1 クエリで返却できる行数や、1 リクエストあたりの実行時間にも上限がある
- 書き込みは単一のプライマリに集約される設計のため、地理的に分散した大量同時書き込みには向かない
- 読み取りはレプリカを介して分散できるが、直近の書き込みが反映されるまでにわずかな遅延が生じ得る(結果整合性寄りの読み取りも選択可能)
- アカウントごとのデータベース数や、同時実行数などにもサービス上限がある
内部の仕組み
D1 は SQLite のファイルベースのデータベースエンジンをベースに、Cloudflare のネットワーク上でホストされたマネージドサービスとして提供されます。書き込みは単一のプライマリが受け持ち、更新内容は非同期に読み取りレプリカへ伝播します。Worker からのクエリはバインディングを通じて、書き込みならプライマリへ、読み取りなら設定に応じて近傍のレプリカへルーティングされます。
- クエリはプリペアドステートメントとして送信され、Workers ランタイムから直接呼び出される(別途コネクションプールを管理する必要がない)
- 複数ステートメントをまとめるバッチ実行により、往復回数を減らしてレイテンシを抑えられる
- バックアップや任意時点への復元は Time Travel によってサービス側の仕組みとして提供される
D1 は読み取りを地理的に分散できますが、書き込みは単一のプライマリに集約されます。書き込みが多いグローバル分散ワークロードを設計する際は、この非対称性を前提にアクセスパターンを組み立てることが重要です。
設計パターン / ベストプラクティス
- 参照が多く更新が少ないデータ(マスタデータ、設定、カタログなど)は D1 の読み取りレプリカの恩恵を受けやすい
- 高頻度カウンタや単純なキーバリューは、D1 よりも KV や Durable Objects の方が適する場合がある。関係データ・SQL クエリが必要なところに D1 を使う
- 複数の更新をまとめて行う場合は個別クエリの連投ではなくバッチでまとめ、往復回数を削減する
- スキーマ変更はマイグレーションとして管理し、ローカルでの検証後にリモートへ適用する運用にする
- インデックスを適切に張り、フルスキャンになりがちな WHERE 句や JOIN を避ける
運用・監視
- クエリの実行状況やエラーは Workers 側のログ・メトリクスと合わせて確認する
- スキーマ変更はマイグレーションファイルとして履歴管理し、環境ごと(ローカル / 本番)に適用状況をそろえる
- 誤った書き込みや障害からの復旧には Time Travel による任意時点への巻き戻しを利用できる
- クエリのレイテンシが悪化した場合は、インデックス設計・バッチ化・読み取りレプリカの利用状況を見直す
コスト
課金は基本的にリクエスト数(読み取り/書き込み)とストレージ使用量に応じた従量制です。具体的な単価や無料枠は変動するため、最新情報は公式ドキュメントを参照してください。
| 課金要素 | 内容 | コスト最適化のヒント |
|---|---|---|
| 読み取り | 行の読み取り量に応じた従量課金 | インデックスで読み取り行数を絞る |
| 書き込み | 行の書き込み量に応じた従量課金 | バッチ化で無駄な書き込みを減らす |
| ストレージ | 保存データ量に応じた従量課金 | 不要な履歴データは整理する |
セキュリティ
- Worker からの接続はバインディング経由で行われ、資格情報をコードやネットワーク越しに扱う必要がない
- クエリはプリペアドステートメントでパラメータ化し、文字列連結による SQL インジェクションを避ける
- データベースへのアクセス権はアカウント・プロジェクト単位の権限管理に従う
ユーザー入力をそのまま SQL 文字列に連結するのは厳禁。必ずプリペアドステートメントのパラメータとして渡し、SQL インジェクションを防ぐこと。
関連サービス・比較
| 観点 | Cloudflare D1 | Cloudflare Durable Objects |
|---|---|---|
| 位置づけ | サーバーレスSQLite(リレーショナル) | 強一貫性のある状態コンテナ(オブジェクト単位) |
| データモデル | テーブル・SQL | 任意のコード内状態やストレージAPI |
| 得意な用途 | 関係データ、SQLクエリ、集計 | セッションやリアルタイム調整など単一オブジェクト単位の一貫性 |
| 書き込みの集約 | 単一プライマリ | オブジェクトごとに単一インスタンス |
| 読み取り分散 | 読み取りレプリカ対応 | オブジェクト単位のため分散は別設計 |
ハンズオン / CLI例
# D1 データベースを作成
wrangler d1 create my-app-db
# マイグレーション(スキーマ定義)をリモートに適用
wrangler d1 migrations apply my-app-db --remote
# ローカルでSQLを直接実行して動作確認
wrangler d1 execute my-app-db --local --command "SELECT * FROM users LIMIT 10"
# 本番データベースに対してSQLファイルを実行
wrangler d1 execute my-app-db --remote --file ./schema.sql
Cloudflare Service
D1(サーバーレスSQLite)を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
データベース
比較で見る軸
クラウド: Cloudflare / カテゴリ: データベース / 難易度: basic
導入後に効く点
単一プライマリ+読み取りレプリカ構成で、書き込みは1か所に集約される。
先に潰すリスク
サービス単体ではなく、権限、ネットワーク、監視、課金、バックアップを含めて設計する必要がある。
- クラウド
- Cloudflare
- カテゴリ
- データベース
- 難易度
- basic
- 関連資格
- —
- 設計柱
- cost / performance / operational / reliability
判断チェックリスト
- 自社の用途が「データベース / cost」に近いか確認する。
- 強みである「SQLite互換のサーベーレスDBをWorkersにバインドしてSQLで扱える。」が本当に評価軸になるか確認する。
- 注意点の「サービス単体ではなく、権限、ネットワーク、監視、課金、バックアップを含めて設計する必要がある。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。