コンテンツにスキップ

第29章: Workers for Platforms による動的コード実行

ShopifyのFunctionsやZapierのように、「ユーザーが書いたカスタムスクリプトを安全に自社サービス内で動かしたい」という要件を解決するのが Workers for Platforms です。


本チュートリアルのゴール

  • wrangler dispatch-namespace create によるディスパッチ名前空間の作成
  • 動的ディスパッチ(Dynamic Dispatch)によるテナント別Workerの実行
  • セキュアなサンドボックス実行とCPU時間・リクエスト制限

Step 1: ディスパッチ名前空間の作成(CLI)

Terminal window
npx wrangler dispatch-namespace create customer-scripts

Step 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)
悪意のあるコードや無限ループが実行されても、ホストシステムや他ユーザーに影響を与えないよう隔離された安全な実行環境。