Skip to content

非公式本サイトは非公式の日本語ドキュメントであり、Cloudflare 公式サイトではありません。最新情報はdevelopers.cloudflare.comをご確認ください。

Workers for Platforms の仕組み

最終更新 Markdown で表示Agent セットアップ

アーキテクチャ

Workers を知っている場合、Workers for Platforms では次の 4 つの構成要素が加わります。dispatch 名前空間、動的ディスパッチ Worker、ユーザー Worker、任意の outbound Worker です。

Workers for Platforms のアーキテクチャ

dispatch 名前空間

dispatch 名前空間は、顧客の Worker をすべて入れるコンテナです。プラットフォームは顧客が書いたコードを受け取り、API リクエストでそのコードをユーザー Worker として名前空間へデプロイします。名前空間の例は stagingproduction です。Workers と比べて、次の点が異なります。

  • Worker 数に上限なし — 名前空間内の Worker には、アカウントあたりのスクリプト制限がありません
  • 既定で分離 — 名前空間内の各ユーザー Worker は untrusted モード で動きます。同じ Cloudflare ゾーン上でもユーザー Worker 同士はキャッシュを共有せず、request.cf オブジェクトにもアクセスできません
  • 動的な呼び出し — 動的ディスパッチ Worker は、env.DISPATCHER.get("worker-name") で名前空間内の任意の Worker を呼び出せます

動的ディスパッチ Worker

動的ディスパッチ Worker は、プラットフォームへのすべてのリクエストの入口です。動的ディスパッチ Worker は次を行います。

  • リクエストのルーティング — ホスト名、パス、ヘッダー、その他の条件に基づき、どの顧客 Worker が各リクエストを処理するかを決めます
  • プラットフォームロジックの実行 — 顧客コードの前に、認証、レート制限、リクエスト検証を実行します
  • 顧客ごとの制限 — プラン種別に応じて、CPU 時間とサブリクエストに カスタム制限 を適用します
  • レスポンスのサニタイズ — 顧客 Worker のレスポンスを変更またはフィルタします

動的ディスパッチ Worker は、dispatch 名前空間バインディング を使ってユーザー Worker を呼び出します。

export default {
	async fetch(request, env) {
		// Determine which customer Worker to call
		const customerName = new URL(request.url).hostname.split(".")[0];

		// Get and invoke the customer's Worker
		const userWorker = env.DISPATCHER.get(customerName);
		return userWorker.fetch(request);
	},
};

ユーザー Worker

ユーザー Worker には、顧客が書いたコードが入っています。顧客がコードをプラットフォームへ送り、あなたが API リクエストでそのユーザー Worker をデプロイします。ユーザー Worker は dispatch 名前空間にデプロイされ、動的ディスパッチ Worker から呼び出されます。ユーザー Worker に バインディング を渡し、KV、D1、R2、その他の Cloudflare リソースへアクセスさせることもできます。

デプロイと管理の流れ

outbound Worker(任意)

outbound Worker は、ユーザー Worker が行う fetch() リクエストを傍受します。次の用途で使います。

  • egress の制御 — 顧客コードからの外部 API 呼び出しを許可またはブロックします
  • リクエストの記録 — 顧客が呼び出している外部サービスを追跡します
  • リクエストの変更 — 認証ヘッダーを追加したり、プラットフォーム外へ出る前にリクエストを変換したりします
outbound Worker による egress 制御のパターン

リクエストのライフサイクル

  1. リクエストが動的ディスパッチ Worker に届きます(例: customer-a.example.com/api
  2. 動的ディスパッチ Worker は、どのユーザー Worker がリクエストを処理するかを決めます
  3. 動的ディスパッチ Worker は env.DISPATCHER.get("customer-a") を呼び出し、ユーザー Worker を取得します
  4. ユーザー Worker が実行されます。外部への fetch() があり、outbound Worker が設定されている場合、それらのリクエストは先に outbound Worker を通ります。
  5. ユーザー Worker がレスポンスを返します
  6. 動的ディスパッチ Worker は、返す前にレスポンスを任意で変更できます

Workers for Platforms と Service bindings

Workers for Platforms と Service bindings は、どちらも Worker 間通信を可能にします。呼び出す Worker が事前に決まっている場合は Service bindings を使います。顧客がユーザー Worker を動的にアップロードする場合は Workers for Platforms を使います。

両方を同時に使うこともできます。動的ディスパッチ Worker は、Service bindings で内部サービスを呼びつつ、名前空間内のユーザー Worker へディスパッチできます。

役に立ちましたか?