🛫

Cloudflare WorkersからOpenAI APIを呼び出す時のロケーション制約

に公開
1

起こったこと

  • Cloudflare Workersで動かしているアプリからLangChain.jsを使いOpenAIのモデルを呼び出している
  • 常にではないのだが,「403 Country, region, or territory not supported」というエラーが出て呼び出しに失敗することがある.
  • 発生頻度は「たまに起こる」くらい.

ログの確認

エラーメッセージからWorkerが動くエッジロケーションがどこかに依存してるんだろうな……という見当はついているものの,ログを確認してみる.

成功するとき

colo: NRT

失敗するとき

colo: HKG

colo is 何

workerがCloudflareのどのエッジロケーションで動いているかを示しているもののよう.

https://www.cloudflarestatus.com/

こちらのページを見ると分かる通り,空港の3レターコードを表記に使っているらしい.
東京は成田空港のコード"NRT"を使っており,"HKG"は文字から察しがつくと思われるが香港である.

なお他に国内に存在するのは

  • FUK(福岡)
  • OKA(那覇)
  • KIX(大阪)
    の3つ.

OKAはいわゆる「マイル修行」する人にとっては馴染深いコードだと思う(OKA-SINタッチというのがあり……)

OpenAIがサポートする国

OpenAIのドキュメントにアクセスをサポートする国や地域の一覧が明記されている.
https://platform.openai.com/docs/supported-countries

"China","Hong Kong","Macau"は記載無し."Taiwan"は記載あり.つまり,OpenAIは香港からのアクセスを認めていない模様.

つまりこの事象は,何らかの理由で処理を行うロケーションとして香港が選定された時,「香港からOpenAIへのアクセス」となるためOpenAIにブロックされているため発生している,ということになる.

Anthropicも同様.
https://www.anthropic.com/supported-countries

どうするか(選択肢)

Cloudflare WorkersのSmart Placement機能を使う(仮説)

https://blog.cloudflare.com/ja-jp/announcing-workers-smart-placement/

エッジロケーションは通常いかにユーザの近くで処理するかに重きが置かれるが,この機能は

アプリがエンドユーザーの近くにないAPI、データベース、その他のリソースに接続する必要がある場合、ユーザーではなくリソースの近くでアプリを実行した方がパフォーマンスが向上する可能性があります。

ということで,ユーザではなくリソースの近くで動かすことも選択肢に入れて稼働地域を最適化してくれる.
理論的には,中国・香港で利用不可のOpenAPIへのアクセスをするのであれば,それ以外のリージョンでworkerを動かしてくれそう……だが,100%うまくいく保証はない.
また,そもそもまだプレビュー機能の模様.

Cloudflare workersのRegional Servicesを使う

https://developers.cloudflare.com/data-localization/how-to/workers/

こちらは

ensure that processing of a Workers project occurs only in-region

ということでworkerの稼働リージョンを制限できそう.

制約としては,これはカスタムドメインを設定しないと使えない(*.workers.devでは使えない).
そこで,まずはカスタムドメインを設定した後にAPIを叩く必要がある模様.
https://developers.cloudflare.com/data-localization/regional-services/get-started/#configure-regional-services-via-api

試してみた,と言いたいところだがこの機能はEnterpriseオンリーのようなので,無料プランの自分は使えない.

またそもそも,海外旅行先で使うことがあるので,ロケーションを必ず日本にしたいというわけではないというのも難点.イギリスに行ったらイギリスのエッジロケーションで動いてくれる方がありがたいのだ.

DeepSeekを使う

中国で呼び出せるモデル使えばいいじゃんの精神.
逆転の発想.

何もしない

頻繁に起きるわけではないので様子見する.

どうするか

一旦様子見.発生頻度が気になるレベルで高くなったらSmart Placement機能を使うことにする.
それでもダメならモデルを切り替えることを検討したい(DeepSeekはちょっと……だが,AWS Bedrockを使っても良いかもしれない.LangChain.jsを使っているのでモデルの切り替えがしやすいのが助かる).

Discussion

つぶらつぶら

直接openai叩かずにopenrouter挟むことで解決できました!