◉GEMINI LABEN
●ARGON — gemini-4-argon が 10/13 に GA。複雑なコーディング・エージェント・数学・科学向けです●DEEP RES — deep-research-pro-preview-12-2025 は 10/23 に停止、残り6日。移行先は deep-research-preview-04-2026●NANO — gemini-nano-banana-2.1 が GA(10/06)。gemini-3.1-flash-image は非推奨で停止日は未発表です●MCP — ツール結果が 8.5万トークンに膨らんだ事例を、ADK で 310 トークンに包んで抑えた報告が出ています●FLASH — gemini-3.7-flash と 3.5-flash は新しい Flash モデルに自動で回されます(10/08)●NEW — クラッシュ報告を毎回ゼロから読ませない — 既知バグ早見表を先に grep し…●ARGON — gemini-4-argon が 10/13 に GA。複雑なコーディング・エージェント・数学・科学向けです●DEEP RES — deep-research-pro-preview-12-2025 は 10/23 に停止、残り6日。移行先は deep-research-preview-04-2026●NANO — gemini-nano-banana-2.1 が GA(10/06)。gemini-3.1-flash-image は非推奨で停止日は未発表です●MCP — ツール結果が 8.5万トークンに膨らんだ事例を、ADK で 310 トークンに包んで抑えた報告が出ています●FLASH — gemini-3.7-flash と 3.5-flash は新しい Flash モデルに自動で回されます(10/08)●NEW — クラッシュ報告を毎回ゼロから読ませない — 既知バグ早見表を先に grep し…
記事一覧/API / SDK
◈ API / SDK/2026-05-10中級

Gemini API で User location is not supported が出たときに、本番環境で試した解決の順番

Cloudflare Workers や Vercel から Gemini API を呼んだときに突然出る『User location is not supported』エラー。個人開発のサーバー移行中に遭遇した実例をもとに、原因切り分けから本番復旧までの順番をまとめました。

gemini-api288gemini119troubleshooting59cloudflare-workers7vertex-ai8

ある夜、運用中のアプリのバックエンドを Cloudflare Workers に移したあと、Gemini API への問い合わせがすべて 400 INVALID_ARGUMENT: User location is not supported for the API use で落ち始めました。ローカルの Mac では同じコードが普通に動きます。デプロイした Worker からだけ全滅です。

ローカルとサーバーで同じコードが動かないとき、開発者の心が一番すり減る瞬間だと感じています。私自身、2014年から個人でアプリを出し続けてきて累計5,000万ダウンロードほどになりますが、こうした「環境差の沼」は何度経験してもしんどいものです。今回はその夜に試した順番を、実用的な切り分け表として残します。

このエラーが出る本当の理由

User location is not supported for the API use は、Gemini API が リクエスト元の IP アドレスを地理的にサポート対象外と判定したとき に返ります。api.generativelanguage.googleapis.com(いわゆる Gemini Developer API)は、利用可能な国・地域が公式ドキュメントで明記されており、対象外のリージョンから接続すると 400 で弾かれます。

ここで詰まるのは「日本からのアクセスはサポートされているはずなのに、なぜ落ちるのか?」という点です。原因はほぼ次のどれかに集約されます。

  • Cloudflare Workers の出口 IP が、Google から見たときに非対応リージョンに見えている
  • Vercel Edge Functions / Netlify Edge Functions が、リクエスト処理を別リージョンの PoP に振った
  • VPN / プロキシ経由でアクセスしていて、出口 IP が想定外
  • Google Cloud のサービスアカウント請求先プロジェクトのリージョン設定(Vertex AI 経由の場合)

切り分けに必要なのは「自分のリクエストが Google から見てどの国から来ているか」を確認する作業です。

順番1: 出口 IP を可視化する(最初の30秒)

最初にやるべきは、サーバーから外向きの IP がどこのリージョンと判定されているかを確認することです。私はだいたい次のような小さなエンドポイントを Worker に仕込んで確かめます。

// Cloudflare Worker で出口IPの判定リージョンを確認
export default {
  async fetch(req: Request): Promise<Response> {
    // 第三者サービスを使って、自分のWorkerが「どこから来た」と見られるかを取得
    const res = await fetch("https://ipinfo.io/json");
    const data = await res.json();
    return new Response(JSON.stringify(data, null, 2), {
      headers: { "content-type": "application/json" },
    });
  },
};
 
// 期待する出力例:
// {
//   "ip": "104.16.xxx.xxx",
//   "city": "...",
//   "country": "...",
//   "org": "AS13335 Cloudflare, Inc."
// }

ここで country が「JP」以外、たとえば US や SG になっていたら、それが直接の原因です。Cloudflare Workers は世界各地の Edge から実行されるため、ユーザーが日本から叩いても、Worker 自身が出ていく IP は別の国のデータセンターになることがよくあります。

順番2: Vertex AI 経由に切り替える(最も確実)

公式が推奨するもっとも確実な解決策は、Gemini Developer API(generativelanguage.googleapis.com)から Vertex AI(aiplatform.googleapis.com)への切り替え です。Vertex AI は Google Cloud のリージョンを明示的に指定でき、asia-northeast1(東京)や asia-northeast2(大阪)を選べます。エッジから呼んでも、宛先側のリージョンが固定されるので「出口 IP がどこか」に左右されにくくなります。

# Vertex AI クライアントで東京リージョンを明示
from google import genai
 
client = genai.Client(
    vertexai=True,
    project="your-gcp-project-id",
    location="asia-northeast1",  # ← 重要: 日本リージョンを明示
)
 
response = client.models.generate_content(
    model="gemini-2.5-flash",
    contents="個人開発者向けに、Vertex AI 移行の手順を3行で要約してください。",
)
print(response.text)
# 期待出力(要約例):
#  1. GCPプロジェクトを作成しサービスアカウントを発行する
#  2. Vertex AI APIを有効化し ADC を設定する
#  3. genai.Client(vertexai=True, location="asia-northeast1") に切り替える

ここで一段ハードルになるのが認証です。Vertex AI は API キーではなく Application Default Credentials(ADC)を要求します。サービスアカウントの権限設定で詰まる方はVertex AI + Gemini 認証エラーの解決方法が補助線になります。

順番3: エッジではなく特定リージョンの Origin から呼ぶ

Vertex AI への移行が時間的に難しい場合、Gemini API を叩く処理だけを、確実に日本からアクセスできる Origin(リージョン固定のサーバー)に逃がす のが現実的です。私が小規模アプリで実際にやったパターンは次の3つです。

  • Cloud Run(asia-northeast1)にプロキシを立てる: Worker は受け付け役、実際の API 呼び出しは Cloud Run に委譲
  • Vercel の Functions を Node.js Runtime に変える: Edge Runtime ではなくサーバーレス関数として日本ノードで動かす
  • Fly.io の nrt(東京)リージョンに小さな Node サーバーを立てる: 1ヶ月数百円〜で運用可能

判断基準は「リクエスト頻度 × レイテンシ要件」です。秒間で叩くリアルタイム用途でないなら、Cloud Run / Fly.io の組み合わせで十分回ります。

順番4: 同一エラーでも別の原因のケース

ときどき、IP リージョンが日本になっているのに同じエラーが返るケースに遭遇します。これは見落としやすいのですが、Gemini API のキーを発行した Google アカウント自体の地域設定 が古いまま、対象外リージョンの請求アドレスに紐付いているパターンです。

確認する場所は次の通りです。

  • Google AI Studio のアカウント設定で表示される国
  • Google Cloud 請求アカウントの請求先住所(Vertex AI を使う場合)
  • 既に作成済みの API キーが、サポート外リージョンで発行されたもの

該当する場合は 新しい API キーを再発行する のが一番早く済みます。私の経験では、古いアカウントの請求情報が引きずられているケースで、3時間かけて切り分けるより、新キー発行のほうが明確に早く解決しました。

順番5: それでも消えないときの最終手段

ここまでで解決しなければ、SDK バージョンと利用モデルの組み合わせ を疑います。Gemini 3 系の一部プレビューモデルは、特定リージョンからの呼び出しが制限されることがあります。

# SDKのバージョンを確認し、最新化
pip show google-generativeai
pip install --upgrade google-generativeai
 
# モデルを安定版(gemini-2.5-flash / gemini-2.5-pro)に一旦下げて確認
# 期待: 安定版で通るなら、プレビューモデルのリージョン制限が原因

私はこの順番で再現性のある復旧手順をたどっています。直す目的は「アプリを動かし続けること」であって「最先端モデルを使い続けること」ではないと割り切ると、判断が速くなります。

まずやるべき次のアクション

もし今このエラーで詰まっているなら、まず順番1の「出口 IP の可視化」を5分だけ試してみてください。country が日本以外になっていれば、迷わず Vertex AI への移行を選んだほうが、長期的に安定した本番環境が手に入ります。関連して認証で詰まったらGemini API vs Vertex AI 比較ガイドも移行判断の助けになります。

私自身、長年アプリを個人で動かし続けてきた経験のなかで、この種の「環境差で落ちるエラー」は何度も繰り返してきました。同じ夜に同じ画面と向き合っている方が、少しでも早く眠れる手助けになれば嬉しいです。お読みいただきありがとうございました。

シェア

お読みいただきありがとうございます

Gemini Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • ✦コピー&ペーストで使える実装コード付き
  • ✦毎日新しい上級ガイドを追加
  • ✦¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

もしこの記事がお役に立ちましたら、チップ(¥150)で応援いただけると大変励みになります。広告なしでの運営を続けるため、皆さまのご支援が大きな力になっています。

関連記事

◈ API / SDK2026-10-16
models は 200 なのに generateContent だけ 403 になる日 — 切り分けの順番を先に決めておく
モデル一覧の取得は 200 で通るのに、生成リクエストだけが 403 permission_denied で止まるときの切り分け手順です。キー・プロジェクト・請求の順に確かめる小さな診断スクリプトと、リトライしてはいけない理由、サポートへ渡す材料の揃え方をまとめました。
◈ API / SDK2026-09-04
ループ音源のプチノイズは、Gemini に聴かせる前に波形の端で切り分けられます
環境音のループ再生で折り返しだけがプチッと鳴る。音声理解に丸ごと投げる前に、波形の端の段差を内部の変化量で正規化してふるい分ける手順と、配布形式への変換で継ぎ目が作り直される落とし穴をまとめました。
◈ API / SDK2026-08-23
アプリに載せる AI 機能を、実行時呼び出しから配布前の一括処理に寄せました
アプリに Gemini を組み込むとき、実行時に呼ぶか配布前に呼び終えるかで呼び出し回数の増え方が変わります。素材数に比例させる設計へ切り替えた判断基準と、冪等な一括処理の実装をまとめました。