Skip to content

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

Outbound Workers

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

Outbound Workers は、顧客の Worker とパブリックインターネットの間に置きます。ユーザー Worker からのすべての送信 fetch() リクエストを把握できます。

Outbound Workers の構成図

一般的な用途

Outbound Workers では、次のことができます。

  • すべてのサブリクエストを記録し、悪意のあるドメインや利用パターンを特定する。
  • ユーザー Worker がリクエストしたホスト名の許可リストまたはブロックリストを作成する。
  • エンド開発者が資格情報を設定しなくても、裏側で自社 API への認証を設定する。

Outbound Workers を使う

Outbound Workers の使い方は次のとおりです。

  1. Outbound Worker として使う Worker を作成します。
  2. Outbound Worker は、プロジェクトの Wrangler 設定ファイル にある dispatch namespaces バインディングの任意パラメーターとして指定できます。動的ディスパッチ Worker から Outbound Worker へデータを渡す場合は、parameters の下に変数名を指定します。

wrangler@3.3.0 以降が インストール されていることを確認してください。

{
	"dispatch_namespaces": [
		{
			"binding": "dispatcher",
			"namespace": "<NAMESPACE_NAME>",
			"outbound": {
				"service": "<SERVICE_NAME>",
				"parameters": [
					"params_object"
				]
			}
		}
	]
}
[[dispatch_namespaces]]
binding = "dispatcher"
namespace = "<NAMESPACE_NAME>"

  [dispatch_namespaces.outbound]
  service = "<SERVICE_NAME>"
  parameters = [ "params_object" ]
  1. 動的ディスパッチ Worker を編集し、Outbound Worker を呼び出すとともに、dispatcher.get() で渡す変数を宣言します。
export default {
	async fetch(request, env) {
		try {
			// parse the URL, read the subdomain
			let workerName = new URL(request.url).host.split(".")[0];

			let context_from_dispatcher = {
				customer_name: workerName,
				url: request.url,
			};

			let userWorker = env.dispatcher.get(
				workerName,
				{},
				{
					// outbound arguments. object name must match parameters in the binding
					outbound: {
						params_object: context_from_dispatcher,
					},
				},
			);
			return await userWorker.fetch(request);
		} catch (e) {
			if (e.message.startsWith("Worker not found")) {
				// we tried to get a worker that doesn't exist in our dispatch namespace
				return new Response("", { status: 404 });
			}
			return new Response(e.message, { status: 500 });
		}
	},
};
  1. これで、ユーザー Worker からの fetch() リクエストのたびに Outbound Worker が呼び出されます。ユーザー Worker は Outbound Worker 上で FetchEvent を発生させます。バインディングで宣言した変数は、Outbound Worker 内で env.<VAR_NAME> から参照できます。

次の例は、ユーザー Worker からの fetch リクエストを記録し、fetch リクエストが api.example.com に一致する場合に JWT を作成する Outbound Worker です。

export default {
	// this event is fired when the dispatched Workers make a subrequest
	async fetch(request, env, ctx) {
		// env contains the values we set in `dispatcher.get()`
		const customer_name = env.customer_name;
		const original_url = env.url;

		// log the request
		ctx.waitUntil(
			fetch("https://logs.example.com", {
				method: "POST",
				body: JSON.stringify({
					customer_name,
					original_url,
				}),
			}),
		);

		const url = new URL(original_url);
		if (url.host === "api.example.com") {
			// pre-auth requests to our API
			const jwt = make_jwt_for_customer(customer_name);

			let headers = new Headers(request.headers);
			headers.set("Authorization", `Bearer ${jwt}`);

			// clone the request to set new headers using existing body
			let new_request = new Request(request, { headers });

			return fetch(new_request);
		}

		return fetch(request);
	},
};

役に立ちましたか?