マルチテナント SaaS を Cloudflare でつくる
SaaS プロバイダーが、自社のインフラ上で顧客独自のドメインを受け入れる機能
Fallback Origin = 顧客ドメインのリクエストを受け止めるデフォルトの宛先
shop.example.com CNAME fallback.saas.comwrangler deploy --dispatch-namespace でも可能Workers for Platforms は 2 種類の Worker で構成される。「門番」と「住人」の関係
例: cffs-dispatcher が Hono でルーティングし、R2 配信やキャッシュ制御も行う
例: cffs-tenant-norimiso が /api/info を返し、Static Assets (index.html) を配信
Workers for Platforms は「プラットフォーム事業者がテナントのコードを本番運用する」ための仕組み
Static Assets は通常の Workers でも使える。Workers for Platforms 限定ではない
wrangler deploy でコードと一緒にアップロードenv.ASSETS.fetch() で Worker から読み取りデモ: Tenant Worker の index.html は Static Assets で配信
get/put/delete)デモ: レストランページ (Astro ビルド) は R2 に格納
SaaS プロバイダー側
顧客ドメイン側 (Cloudflare for SaaS 経由)
両サイトとも同じ Dispatcher Worker (Hono) を経由。ホスト名で切り替え。画像は Images binding で WebP/AVIF に自動変換
Dispatcher Worker (Hono) が caches.default を使い、R2/D1 レスポンスをエッジ PoP にキャッシュ
caches.default でゾーンキャッシュを操作cache.match() でヒット確認、cache.put() で書き込みCache-Control: max-age で TTL 制御Cache-Tag ヘッダーでテナント単位のタグを付与tenant:norimiso,type:r2caches.default 無効 → Dispatcher で管理X-Cache: HIT/MISS ヘッダーでキャッシュ状態を可視化
顧客ドメインのキャッシュは SaaS プロバイダーのゾーンで一元管理
POST /api/purge エンドポイント (Bearer 認証)コンテンツ更新 (R2 アップロード / D1 UPDATE) の後にパージ API を呼ぶだけで即時反映
顧客数が増えてもインフラ変更不要。API で Custom Hostname と Tenant Worker を追加するだけでスケール
Cloudflare for SaaS + Workers for Platforms