🙆

Cloudflare Workersから別のWorkerのメソッドをRPCで呼び出す

に公開

Cloudflare Workersを複数使ってRPCで実行する方法

やりたいこと: それぞれ役割が特化したCloudflare Workersを複数作って、別のCloudflare Workersからそれらを呼び出して使えるようにすること。

今回は上記ができるように、練習がてらまずはCloudflare Workers から別の Cloudflare Workersの関数をRPCを使って呼び出すのをやってみる。しかもTypeScriptのタイプチェックちゃんと通したい。

今回は呼び出す方を rpc-caller 、呼び出される方を rpc-receiver と名付ける。

呼び出す方を作成

pnpm create cloudflare@latest rpc-caller

呼び出される方を作成

pnpm create cloudflare@latest rpc-receiver

呼び出す側の設定

説明では行ったり来たりするのが分かりづらいので、結論上手く行ったコードを貼り付ける。まずは先に呼び出す側である rpc-caller を設定しちゃう。

rpc-callerの wrangler.jsonc に rpc-receiver の情報を追加。

{
	"$schema": "node_modules/wrangler/config-schema.json",
	"name": "rpc-caller",
	"main": "src/index.ts",
	"compatibility_date": "2025-04-30",
	"observability": {
		"enabled": true
	},
	"services": [{ "binding": "RPC_RECEIVER", "service": "rpc-receiver" }]
}

次に、 rcp-caller/src/index.ts で呼び出される方のRPC関数を呼ぶ。下記では env.RPC_RECEIVER.add()env.RPC_RECEIVER.subtract() をすでに定義したかのように書くが、この後定義する。

// rcp-caller/src/index.ts
import RPCReceiver from '../../rpc-receiver/src';

interface Env {
	RPC_RECEIVER: Service<InstanceType<typeof RPCReceiver>>;
}

export default {
	async fetch(request, env, ctx): Promise<Response> {
		const searchParams = new URL(request.url).searchParams;
		const a = searchParams.get('a') || 0;
		const b = searchParams.get('b') || 0;

		const result = await env.RPC_RECEIVER.add(Number(a), Number(b));
		const result2 = await env.RPC_RECEIVER.subtract(Number(a), Number(b));

		return new Response(`The result is ${result}, but if you subtract it it is ${result2}`);
	},
} satisfies ExportedHandler<Env>;

ドキュメント読んでもよくわからなかったのがTypeScript通すところ。下記のType定義で通せた。

import RPCReceiver from '../../rpc-receiver/src';

interface Env {
	RPC_RECEIVER: Service<InstanceType<typeof RPCReceiver>>;
}

呼び出される側の実装

次に、呼び出される側である RPC_Receiver を定義する。

// rpc-receiver/src/index.ts
import { WorkerEntrypoint } from 'cloudflare:workers';

export default class RPCReceiver extends WorkerEntrypoint {
	async fetch() {
		return new Response('Hello from Worker B');
	}

	async add(a: number, b: number) {
		return a + b;
	}

	async subtract(a: number, b: number) {
		return a - b;
	}
}

呼び出される側はService Bindingなどが必要ないので、 wrangler.jsonc を編集する必要なし。

両方それぞれフォルダに入って、 npx wrangler types を実行してみた。これで worker-configuration.d.ts がアップデートされる認識。

ローカルテスト

両方のWorkerをローカルで走らせる。

cd rpc-caller
npx wrangler dev
cd rpc-receiver
npx wrangler dev

両方同時に走らせると、 [connected] って出る!

ちなみに両方同時に走らせるには、

cd rpc-caller
npx wrangler dev -c ./wrangler.jsonc -c ../rpc-receiver/wrangler.jsonc

でつながった状態で走らせられる。

キーボードで b と打つとブラウザが立ち上がるので、無事RPCで rpc-receiver のほうで定義された関数が実行できていることを確認できたら成功。

デプロイ

それぞれを、デプロイ。

cd rpc-caller
npx wrangler deploy
cd rpc-receiver
npx wrangler deploy

rpc-caller の方のデプロイをしたときに出るURLをアクセスすると、無事RPCで関数が呼び出せているはず。 https://rpc-caller.<<hogehogehoge>>.workers.dev/ 的なやつ。
今回searchParamsから数字変えられるようにしたから https://rpc-caller.<<hogehogehoge>>.workers.dev/?a=13&b=8 等でちゃんと足し算引き算できてるはず。

大成功!

こんな感じ: https://github.com/alexweberk/cloudflare-workers-rpc-example

参考

オフィシャルのドキュメントを参考にしました。

Discussion