GEMINI LABEN
API — Interactions APIが一般提供となり、GeminiモデルとエージェントのためのAI Studio・APIの既定APIになりましたAGENT — Managed Agentsがパブリックプレビューとなり、Googleホストの隔離Linuxサンドボックスで自律エージェントを動かせますSECURITY — 6月19日以降、制限なしのAPIキーからのリクエストが拒否され、キーへの制限付与が前提になりましたCLI — Gemini CLIが6月18日にEOLとなり、Agentic 2.0(Antigravity CLI)へ置き換わりましたMODEL — Gemini 3.5 FlashがGAとなり、エージェント処理やコーディングで持続的な高性能を発揮しますUPDATE — 旧画像プレビューモデル(gemini-3.1-flash-image-preview等)が6月25日に廃止されましたAPI — Interactions APIが一般提供となり、GeminiモデルとエージェントのためのAI Studio・APIの既定APIになりましたAGENT — Managed Agentsがパブリックプレビューとなり、Googleホストの隔離Linuxサンドボックスで自律エージェントを動かせますSECURITY — 6月19日以降、制限なしのAPIキーからのリクエストが拒否され、キーへの制限付与が前提になりましたCLI — Gemini CLIが6月18日にEOLとなり、Agentic 2.0(Antigravity CLI)へ置き換わりましたMODEL — Gemini 3.5 FlashがGAとなり、エージェント処理やコーディングで持続的な高性能を発揮しますUPDATE — 旧画像プレビューモデル(gemini-3.1-flash-image-preview等)が6月25日に廃止されました
記事一覧/API / SDK
API / SDK/2026-07-01上級

IP が変わるサーバーで Gemini API キーの制限を効かせる — headless 自動処理の逃がし方

未制限キーの遮断後、IP が毎回変わる headless なサーバー自動処理では、HTTP リファラーもアプリ制限も IP 許可リストも素直には効きません。API 制限だけで凌ぐか、egress を固定 IP に集約するか、いっそ Vertex のサービスアカウント認証へ移すか。稼働を止めずに選ぶための判断軸と、動くコードを整理します。

Gemini API159APIキー3セキュリティ6自動運用3Vertex AI11

プレミアム記事

未制限キーが遮断されるようになって最初に困ったのは、ブラウザ向けのキーではなく、誰も見ていないところで動いているサーバー側の定期処理でした。個人開発で複数のサイトの更新処理を回していると、その大半は headless な環境で走ります。手元の PC ではなく、使い捨てに近い実行環境の上で起動して、終わったら消える。そういう作りにしていると、リクエスト元の IP アドレスが実行のたびに変わります。

ここに、今回のキー制限の面倒さが凝縮されています。ブラウザなら HTTP リファラー、モバイルアプリなら Android/iOS のアプリ制限が使えます。ところが「毎回 IP が変わる headless なサーバー処理」には、その手のアプリケーション制限がどれも素直に当てはまりません。IP 許可リストを設定した途端、次の実行では別の IP から来て自分で自分を弾く、という間の抜けた事故が起きます。

ここでは、その headless 自動処理に絞って、キーの制限をどう効かせるかを整理します。結論を先に言うと、当座は「API 制限」で最低ラインを満たしつつ、腰を据えるなら「サーバー処理は API キーを捨ててサービスアカウント認証へ移す」のが私自身の到達点です。順を追って、なぜそうなるかと、止めずに移す手順を書きます。

なぜサーバー自動処理では「アプリケーション制限」が効きにくいのか

Gemini API キーに設定できる制限は、大きく二層に分かれます。ひとつは、そのキーで叩ける API を絞る API 制限。もうひとつは、リクエスト元を絞る アプリケーション制限で、HTTP リファラー・IP アドレス・Android アプリ・iOS アプリの4種類があります。

問題は、アプリケーション制限の4種類がいずれも「呼び出し元が安定して識別できる」ことを前提にしている点です。ブラウザにはリファラーがあり、モバイルアプリにはパッケージ名と署名があります。ところが headless なサーバー処理には、そのどれもありません。残るのは IP アドレス制限だけですが、これが厄介です。

  • CI・サーバーレス・使い捨ての実行環境は、起動のたびに別のノードに割り当てられ、egress IP が変わります。
  • 固定 IP を持たない構成では、そもそも許可リストに書く値が確定しません。
  • 無理に広い CIDR を許可すると、制限をかけている意味が薄れます。

つまり headless 処理では、アプリケーション制限を諦めて API 制限だけで最低ラインを満たすか、egress を固定 IP に寄せて IP 制限を成立させるか、API キーという仕組みそのものから降りるか、の三択に自然と絞られます。以下、順に見ていきます。

まず現状を測る:キーに何の制限がついているか確かめる

選ぶ前に、いま自分のキーに何がついているかを機械的に把握します。手作業でコンソールを眺めるより、API Keys API で一覧を取ってしまうほうが、複数プロジェクトを横断していると確実です。以下は Service Usage / API Keys の管理 API を使い、キーごとの制限有無を棚卸しするコードです。認証にはサービスアカウント(後述)か、gcloud auth application-default login の資格情報を使います。

# キーの制限状況を棚卸しする(google-cloud-api-keys を使用)
# pip install google-cloud-api-keys
from google.cloud import api_keys_v2
 
def audit_keys(project_id: str) -> None:
    client = api_keys_v2.ApiKeysClient()
    parent = f"projects/{project_id}/locations/global"
 
    for key in client.list_keys(parent=parent):
        restrictions = key.restrictions
        api_targets = list(restrictions.api_targets) if restrictions else []
 
        # アプリケーション制限の種別を判定
        app = "none"
        if restrictions:
            if restrictions.browser_key_restrictions.allowed_referrers:
                app = "referrer"
            elif restrictions.server_key_restrictions.allowed_ips:
                app = "ip"
            elif restrictions.android_key_restrictions.allowed_applications:
                app = "android"
            elif restrictions.ios_key_restrictions.allowed_bundle_ids:
                app = "ios"
 
        api_ok = "restricted" if api_targets else "ALL-APIs"
        flag = "  <-- 未制限(遮断対象の可能性)" if app == "none" and not api_targets else ""
        print(f"{key.display_name:<28} app={app:<9} api={api_ok}{flag}")
 
audit_keys("your-project-id")
# 出力例:
# cron-gemilab-pipeline        app=none      api=ALL-APIs  <-- 未制限(遮断対象の可能性)
# web-demo-key                 app=referrer  api=restricted

app=none かつ api=ALL-APIs のキーが、今回の遮断でいちばん危ないキーです。headless 処理で使っているキーがここに並んでいたら、次のいずれかで手当てします。

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

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
IP が毎回変わる headless 環境で 403 に詰まっていた人が、自分の構成に効く制限のかけ方を選べるようになる
API 制限だけ・固定 IP egress・Vertex サービスアカウント認証の3択を、コストと運用負荷で比較して判断できる
稼働中のサーバー処理を API キーから OAuth 認証へ、止めずに切り替える手順を手に入れる
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

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

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

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

関連記事

API / SDK2026-06-28
Gemini API の『未制限キー遮断』で自動運用が止まる前に、キーの制限を点検する
2026年6月19日以降、制限のない Gemini API キーからのリクエストが遮断されるようになりました。自分のキーが対象かを確かめ、本番を止めずに制限を足す手順を整理します。
API / SDK2026-07-01
静かに止まる自動処理を防ぐ — Gemini 基盤変更に備える事前検証ゲートの設計
制限なしAPIキーの拒否、CLIのEOL、Interactions APIへの一本化。2026年後半のGemini基盤変更は、動いていた自動処理を無言で止めます。バッチ実行の手前で失敗を検出する事前検証ゲートを、実行可能なコードとともに設計します。
API / SDK2026-06-30
投げて終了する定期実行で、結果を取りこぼさない — Gemini バックグラウンド実行を再取得台帳で回す設計
Interactions API のバックグラウンド実行を cron 駆動の定期実行で安全に回すための設計です。送信前に冪等キーで台帳へ予約し、次のティックで未取得ハンドルだけを再取得する二段コミットを、動くコードで示します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →