Web開発 2026年5月10日

Cloudflare Workers KV

Cloudflareのグローバル分散KVストア。世界中のエッジから低レイテンシで読み込めるため、読み込み比率が圧倒的に高く結果整合性で許容できるユースケース(設定値・認証情報・キャッシュ・フィーチャーフラグ等)に最適化されている。

Workers KV

一行サマリ

Cloudflareのグローバル分散KVストア。世界中のエッジから低レイテンシで読み込めるため、読み込み比率が圧倒的に高く結果整合性で許容できるユースケース(設定値・認証情報・キャッシュ・フィーチャーフラグ等)に最適化されている。

解決する課題(Why)

従来のリージョン型KVS(DynamoDBやElastiCache)はリージョン外からのアクセスでレイテンシが跳ね上がる。グローバルにユーザーを抱えるアプリケーションでは、リージョン選定・レプリケーション設計・接続プール管理がアーキテクトの負担になる。Workers KVはCloudflareの300超データセンターに自動レプリケートし、Workersのバインディング経由でゼロ設定の低レイテンシ読み込みを提供する。「読み込みが多く、わずかな伝搬遅延を許容できる」ワークロードを最小コードで実装できる。

主要機能(What)

  • Workersバインディングによるget / put / delete / list API
  • REST API経由での外部アプリからの操作
  • キーごとのメタデータ(最大1024バイト)保存
  • TTL指定による自動削除(expirationTtl
  • リード時のエッジキャッシュ(cacheTtl、最小30秒)
  • ネームスペース単位での論理分離(1アカウントあたり1,000ネームスペース)

アーキテクト視点:いつ選ぶか

適しているシーン(読込多い・結果整合性OK)

  • グローバル配信の設定値・フィーチャーフラグ
  • APIレスポンスキャッシュ
  • ユーザープリファレンス・認証セッションのキャッシュ層
  • A/Bテストのバリアント割り当て
  • 静的アセットのメタデータ・ルーティングテーブル
  • 読込:書込比が概ね100:1以上のワークロード

適していないシーン(強整合・高頻度書込み)

  • 在庫数・残高・カウンタなど強整合が必須の処理 → Durable Objectsを使う
  • 同一キーへの秒間1回超の書込み(書込みレート制限)
  • リレーショナルクエリやJOIN・トランザクション → D1
  • 大容量バイナリ(25 MiB超) → R2
  • 書込み即時に全リージョンへ反映が必要なケース(最大60秒の伝搬遅延あり)

結果整合性の仕組み(必須セクション)

Workers KVはEventually Consistent(結果整合)モデルを採用する。書込みは中央データセンターに集約された後、世界中のエッジへ非同期にレプリケートされる。各エッジには直近のリードキャッシュが保持され、デフォルトで最大60秒間は古い値が返却される可能性がある。

挙動の要点:

  • 書込み直後の同一キー読み込みでも、別リージョンでは旧値が返ることがある
  • cacheTtlを短くすればフレッシュさは増すが、オリジン読み込みが増えコストとレイテンシが上がる
  • 同一キーへの書込みは1秒1回までに制限される
  • 強整合が必要な値はWorkers KVに置かず、Durable Objectsへ寄せる(KVはあくまで読込最適化レイヤ)

リード戦略の指針:

  • 全エッジで完全一致が必要 → Workers KV不適合
  • 「数十秒以内に伝搬すれば良い」 → Workers KVが最適
  • 書込み元と読み込み元が同じWorker実行内 → ローカル変数やwaitUntilでカバー

競合・代替(DynamoDB / Redis / Memcached / Durable Objects / D1)

観点Workers KVDynamoDBRedis (ElastiCache)Durable ObjectsD1
配置グローバル分散(自動)リージョン(Global Tables有)リージョングローバル単一インスタンスリージョン分散
整合性結果整合(最大60秒)強整合オプション有強整合強整合強整合
クエリKey-Value + プレフィックスリストKV + GSI/LSI多様なデータ構造任意ロジックSQL
書込みレート同一キー1/秒高スループット非常に高いシングルライタ
値サイズ上限25 MiB400 KBメモリ依存128 KiB(KV API)カラム制限内
料金読込 $0.50/M、書込 $5/M読込/書込ユニット課金インスタンス時間課金リクエスト+期間課金行スキャン課金
主用途グローバル設定・キャッシュOLTPセッション・キャッシュ強整合カウンタ・状態リレーショナル

選定の指針: 「グローバル読込重視・結果整合OK」ならKV、「強整合の状態管理」ならDurable Objects、「リレーショナル」ならD1、「大容量オブジェクト」ならR2。

料金モデルの要点

Free / Paidプランで無料枠と従量課金が異なる。

  • 読込: 100,000/日(Free)/ 1000万/月、超過分$0.50/100万(Paid)
  • 書込: 1,000/日(Free)/ 100万/月、超過分$5.00/100万(Paid)
  • 削除: 1,000/日(Free)/ 100万/月、超過分$5.00/100万(Paid)
  • リスト: 1,000/日(Free)/ 100万/月、超過分$5.00/100万(Paid)
  • ストレージ: 1 GB / 1 GB+ $0.50/GB-月

ポイント:

  • データ転送(egress)課金なし
  • 存在しないキーへのGETも課金対象(404でも操作回数にカウント)
  • バルク読込は読み込んだキー数で課金
  • ダッシュボード・wrangler経由の操作も課金対象
  • 書込みコストが読込の10倍。書込み頻度が高いワークロードは設計を見直す

CLI / IaC 操作例

# ネームスペース作成
wrangler kv namespace create "MY_KV"

# プレビュー用ネームスペース作成
wrangler kv namespace create "MY_KV" --preview

# キー書込み
wrangler kv key put --binding=MY_KV "user:123" '{"plan":"pro"}'

# TTL付き書込み(60秒で失効)
wrangler kv key put --binding=MY_KV "session:abc" "token" --ttl 60

# キー読込
wrangler kv key get --binding=MY_KV "user:123"

# キー削除
wrangler kv key delete --binding=MY_KV "user:123"

# プレフィックス指定リスト
wrangler kv key list --binding=MY_KV --prefix "user:"

# バルク書込み(JSONファイル)
wrangler kv bulk put --binding=MY_KV ./data.json

wrangler.jsoncでのバインディング定義:

{
  "kv_namespaces": [
    {
      "binding": "MY_KV",
      "id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
      "preview_id": "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"
    }
  ]
}

Workers内での利用:

export default {
  async fetch(request, env): Promise<Response> {
    await env.MY_KV.put("KEY", "VALUE", { expirationTtl: 3600 });
    const value = await env.MY_KV.get("KEY", { cacheTtl: 60 });
    const list = await env.MY_KV.list({ prefix: "user:" });
    await env.MY_KV.delete("KEY");
    return new Response(value);
  },
} satisfies ExportedHandler<{ MY_KV: KVNamespace }>;

制限・注意点

項目制限値
キーサイズ512バイト
値サイズ25 MiB
キーメタデータ1024バイト
同一キーへの書込み1秒に1回
異なるキーへの書込み(Free)1,000/日
1Worker起動あたりのオペレーション1,000
アカウントあたりネームスペース数1,000
ストレージ(Free)1 GB
cacheTtl最小値30秒

注意点:

  • 同一キーの高頻度書込みは構造的に不可能。カウンタや在庫管理には使わない
  • Free planでは1日1,000書込み制限があり、本番運用前提ならPaid必須
  • 書込み伝搬は最大60秒、強整合を期待するコードは書かない
  • 1 Worker呼び出しで1,000オペレーションを超える設計はバルクAPIに切り替える
  • REST APIはCloudflare REST APIのレートリミットが別途適用される

参考リンク


参照日: 2026-05-03