第29章: Workers for Platforms による動的コード実行
ShopifyのFunctionsやZapierのように、「ユーザーが書いたカスタムスクリプトを安全に自社サービス内で動かしたい」という要件を解決するのが Workers for Platforms です。
本チュートリアルのゴール
wrangler dispatch-namespace createによるディスパッチ名前空間の作成- 動的ディスパッチ(Dynamic Dispatch)によるテナント別Workerの実行
- セキュアなサンドボックス実行とCPU時間・リクエスト制限
Step 1: ディスパッチ名前空間の作成(CLI)
npx wrangler dispatch-namespace create customer-scriptsStep 2: wrangler.jsonc へのバインディング
{ "name": "saas-gateway", "main": "src/index.ts", "compatibility_date": "2024-09-01", "dispatch_namespaces": [ { "binding": "DISPATCHER", "namespace": "customer-scripts" } ]}Step 3: 動的実行ルーターの実装
リクエストのURLやヘッダーから「どの顧客(テナント)か」を特定し、その顧客がアップロードした専用Workerを呼び出します。
export default { async fetch(req: Request, env: Env): Promise<Response> { const url = new URL(req.url); const tenantId = url.searchParams.get('tenantId'); // 例: customer_123
if (!tenantId) { return new Response("Tenant ID is required", { status: 400 }); }
try { // 顧客専用のWorkerインスタンスを取得して実行 const customerWorker = env.DISPATCHER.get(tenantId); return await customerWorker.fetch(req); } catch (e) { return new Response("顧客スクリプトが見つからないか実行エラーです", { status: 404 }); } }};自前でDockerコンテナを立ち上げることなく、ミリ秒単位で数万ユーザーのカスタムコードを安全に実行できます。
💡 用語解説コラム
[!NOTE] マルチテナント (Multi-tenancy)
単一のソフトウェア基盤上で、複数の企業や顧客(テナント)が互いのデータを覗き見ることなく安全に同居・利用できる設計。
[!NOTE] サンドボックス (Sandbox)
悪意のあるコードや無限ループが実行されても、ホストシステムや他ユーザーに影響を与えないよう隔離された安全な実行環境。