🧊

Cloudflare Workersで、Workerから別のWorkerを呼びたい

結論から書いておくと、

  • できることはできる
  • ただし、異なる`account_id`でデプロイされたWorker同士なら
    • より正確には、`zone`が違えばいいらしいけど

という。

Get error code 1042 when fetching within worker - Workers - Cloudflare Community
Issue With Worker-To-Worker HTTPS request - Workers - Cloudflare Community

やってみた

  • root
  • child

という2つのWorkerを、実際にデプロイして試した。

`wrangler.toml`の`account_id`はどっちも同じ。だって普通は同じであろうから・・。

root

子Workerを叩いて返すだけ。

addEventListener("fetch", event => {
  event.respondWith(handleEvent(event));
});

async function handleEvent() {
  const res = await fetch(CHILD_WORKER_URL);
  return res;
}

child

addEventListener("fetch", event => {
  event.respondWith(handleEvent(event));
});

async function handleEvent() {
  return new Response("Hello from child!");
}

返事するだけ。

ダメだった

error code: 1042

という感じでダメ。

罠なのが、Workersの管理画面にくっついてるエディタからだとこれが普通に通るってところ。
最小構成で試そうと思って管理画面からやってたら通るのに、ブラウザやらcURLやらだとダメで一瞬「???」ってなった。

片方の`account_id`を変えてから試すとちゃんと通ったので、どうしてもやりたいなら複アカでやればできんことはない・・って感じ。

それにしても1042とは一体なんて意味なのかしら?って思ったら、ドキュメントに書いてあった。

Worker tried to fetch from another Worker on the same zone, which is unsupported.
https://developers.cloudflare.com/workers/learning/logging-workers#error-pages-generated-by-workers

なんてドンピシャな。

It is not currently possible to send fetch requests to other Workers (Worker to Worker) within the same zone. The origin server, if any, will receive the request instead. However, sending requests to Workers within other zones is possible and will work as normal.
https://developers.cloudflare.com/workers/runtime-apis/fetch

だそうな。

うーむ、残念。