最近、Cloudflare を触り始めました。Workflows を使うと Human-in-the-loop (AI の処理の途中に人間の判断を挟む設計パターン、以降は HITL) を簡単に実装出来そうだったからです。
それについては別途記事を書くとして、今回の本題は、AI 関連の処理を動かす場合にはリージョンに気をつけよう、という話です。具体的には Hong Kong からだと Anthropic の API が呼べません。
今日の話は以上です。
だけだとあんまりなので、もう少し詳しく書きます。
やろうとしていた事
以前、GitHub Actions の定時実行機能を使い、Docker コンテナ内で Agent Skill を claude -p コマンドで呼び出すという方法を紹介しました。
Agent Skills を GitHub Actions 経由で定時実行し、野良化を防ぐ – もばらぶエンジニアブログ
今回はそれと似たような感じで Claudeflare 上に実装しました。定期実行には Cron Triggers を使います。
Cron Triggers · Cloudflare Workers docs
それが Worker を起動し、そこから Workflow を起動し、Workflow instance 内の claude -p コマンドを実行するという流れです。
具体的にプログラムでやっている事としては以下の通りです。
- Claude Code がネット上から、とあるトピックのニュースを収集
- Claude Code が MCP サーバー経由で、Slack の管理者専用チャンネルに「この内容を投稿して良いか」と投稿
- 人間が OK/NG を返信
- OK の場合は、Claude Code が Slack の一般ユーザー向けチャンネルにニュースを投稿
なお、Worker は Cron Triggers で起動するだけでなく、デバッグのために HTTP のエンドポイントも用意して、curl でも起動できるようにしました。
現象
- curl 経由だと処理が最後まで完了する
- Cron Triggers 経由だと、上のステップ2の Slack メッセージが届かない
- 調査の結果、そのそもステップ1すら起動していなかったわけですが
エラーメッセージは Failed to authenticate. API Error: 403 Request not allowed でした。調査の結果、このメッセージは Claude Code の起動時に Anthropic API に繋ぎに行く際に出たものという事が分かりました。
エラーの原因
私は現在マレーシアにいるのですが、curl で Worker の HTTP エンドポイントを呼び出した際に、コンテナは一番近いマレーシアのクアラルンプールで起動したようです。Cloudflare のマレーシア location で起動したコンテナから Anthropic の API を呼び出す形になるのですが、マレーシアでは Anthropic は普通にサービスを展開しているため問題無く実行出来ました。
一方、Cron Triggers 経由で起動した時は、香港でコンテナが起動しました。香港(や中国)では Anthropic API のサービス提供をしていないため、上述のエラーとなったようです。
対処方法
ここまでの話で分かるとおり、対処方法としてはリージョンを指定する事です。サービスによって指定方法は若干異なるのですが、Containers の場合は以下の通りです。
Placement · Cloudflare Containers docs
APAC だと香港が含まれてしまうので、 ENAM か WNAM (それぞれ北米東海岸、西海岸)を選びました。
物理的に離れているためネットワーク的に若干の遅延はありますが、今回はバッチ処理なので問題無いです。
細かい話
なぜ Cron Triggers 経由で香港に?
Cron Triggers がどこの location で実行されるかといった細かい仕様は公開されていないようですが、ネットの情報によれば負荷が少ない location が自動で選ばれるとの事でした。恐らく、Cron Triggers が香港で起動した後で Worker -> Workflow 経由でコンテナを起動する際に、同じ location である香港が選ばれた可能性があります。
サポートされている location, region
Cloudflare のデータセンターがある location は、以下のページで確認出来ます。現時点(2026/9/30)では全世界で348都市、アジアでは Hong Kong を含む71都市にデータセンターがあるようです。
Cloudflare Global Network | Data Center Locations | Cloudflare
Anthropic がサポートしている region は、以下のページに一覧があります。大半の国で使えますが、中国(香港含む)、北朝鮮などでは使えません。
Supported countries and regions \ Anthropic
今回は使っていませんが OpenAI も似たような感じです。
OpenAI API – Supported Countries and Territories | OpenAI Help Center
最初は MCP サーバー、Slack 周りを(Claude Code, Sonnet 5 が)疑った
Cloudflare に慣れていない事もあり、最初は Claude Code の Sonnet 5 も使いつつ調査しました。Slack の送信(上述のステップ2)でエラーとなっているから、Slack の bot token が正しいか、経由している Bloque の API キーが正しいか、等を疑われたのですが、curl 経由で動いているし違うんじゃないかなと思いました。
色々試行錯誤しているうちに Sonnet 5.5 がリリースされていて、Claude Code を立ち上げ直したら(※)それがデフォルトで使われるようになりました。Sonnet 5.5 になったせいなのか新しいセッションになったせいなのかは分かりませんが、403 は Slack 送信ではなくて Anthropic API への接続で起きているとすぐ診断してくれて、それで原因が判明しました。
※: トラブルシューティングで詰まった時は、同じセッションで引っ張るよりは、新しいセッションを立ち上げ直して違った観点で調査した方が良いので。
まとめ
Cloudflare は全世界にデータセンターがあります。サービス毎に細かい挙動は異なりますが、location を指定しないと近くにある、あるいは空いている location が選ばれます。大半の場合はそれで問題無いのですが、Anthropic や OpenAI の API を呼び出すなどの場合に香港が選ばれてしまうと、Anthropic や OpenAI 側で弾かれてしまいますので、そうした処理がある場合は Cloudflare の location を北米を指定しておくのが無難です。