見出し画像

【体験談】ある朝、Googleから「約21万円」の請求が来た。Gemini APIで冷や汗をかいた私がやったこと


「え、今月の請求が“約21万円”?何をやったんだっけ…?」
そんな通知で一気に目が覚めました。普段はほぼゼロに近い小額利用なのに、2025年8月だけ急に跳ね上がる。明細を見るとGemini API関連の項目が並び、身に覚えがないスパイクです。
結果として、誠意を持って状況を説明し、自分の落ち度(管理の甘さ)も認めたうえで、私が無闇に使っていないことを淡々と伝え、二段階の調整に応じてもらえました(約19万円)残り約2万円は新しいカードで一括清算、ケースはクローズです。
同じような状況の方の参考になればと思いを執筆します。



まず結論:止血→相談→再発防止

  • 請求:2025年8月に約21万円

  • 初動API無効化/キー削除・ローテーション請求の紐付け一時停止(Disable billing)2FA有効化

  • 相談と交渉:カード会社へ不正の可能性で連絡、Google Cloud Billingへは経緯を整理して誠意を持って説明

  • 結果二段階の調整に応じてもらえ約19万円がクレジット。残り約2万円は一括清算で合意。

  • 補足:9月上旬にもわずかな利用がありましたが、調整の中心は8月分でした。


何が起きた?短期スパイクの全体像(タイムライン)

  • 〜7月:毎月ほぼゼロに近い小額。

  • 8月Gemini APIの入出力トークンが短期間で爆増。検証用の特定プロジェクトに利用が集中。

  • 9/2:カード会社から不正の可能性の連絡→支払いを一時停止

  • 9月中旬:**第1回の調整(約10万円)**に応じてもらう。

  • その後:**第2回の調整(約8万円)**も決まり、合計約19万円に。

  • 最終残り約2万円を一括清算、ケースはクローズ(一定期間は返信で再オープン可との案内)。


気づいてからの30分でやったこと(初動)

  1. APIの止血:該当プロジェクトでGemini APIを無効化APIキーは全削除・ローテーション

  2. 課金の遮断:プロジェクトと請求先の紐付けを一時的に外す(Disable billing)。

  3. アカウントの防御パスワード変更+2FA、ログイン通知を確認。

  4. 証拠の確保請求レポート、明細CSV、スクショ、サポートとの往復を保存。

  5. 利用の偏り確認Credential(APIキー)別メトリクスで、どの鍵が跳ねたかを確認開始。


交渉の進め方:誠意と事実で伝えるコツ

ここがいちばん大事でした。私は強い言い回しや責任転嫁を避け誠意を持って説明することに徹しました。
自分の落ち度(キー管理や監視の甘さ)も率直に認めつつ、**無闇に使っていない(当該期間はほぼ未使用)**ことははっきり伝えます。

  • 伝えた順番

    1. 普段は小額、2) 特定月だけ異常、3) カード会社から不正の可能性で連絡

    2. API停止・請求停止など止血済み、5) 再発防止の施策を進行中

  • 出した資料
    明細のスクリーンショット、利用グラフ、ログ抜粋

  • 言い方の工夫(実際に伝えたニュアンス)

    • 「**私の管理に不十分な点がありました。**ただ、無目的に大量利用した事実はありません。

    • 直ちにAPIを無効化し、キーを削除・再発行、2FAまで含め対策を実施済みです。」

    • 「**以後の再発防止策(予算アラート、クォータ、参照元制限)**を設定します。」

結果として、状況を踏まえた調整に応じてもらえ約19万円のクレジットが適用されました。


そもそもの要因は?仮説ベスト3(※キー露出が最有力)

前提として、当該期間に私はGemini APIをほぼ使っていません
そのため、最も可能性が高いのは**APIキーの露出(漏えい/第三者利用)**です。

  1. APIキーの露出(最有力)
    リポジトリ直書き、公開環境で参照元制限なし、テスト用フロントでむき出しキーを読み込む——このあたりは狙われやすいです。
    クローラーやスキャナに拾われると短時間で大量コールされがち。

  2. 自動化(n8nなど)の誤作動
    ループ条件や例外時リトライの設定が甘いと、同じ処理が延々走ることがあります。
    「夜間に回しっぱなし→翌朝、請求だけ跳ね上がる」パターン。

  3. ロング入力+メディアの積み上げ
    long系やvideo1回あたりのトークンが重いため、少ない回数でも金額が伸びます。
    体感より請求が大きいときは、だいたいここが絡みます。


Geminiの課金はどこで増える?トークンの超ざっくり解説

  • Input token:APIに渡したテキストやメディアの量

  • Output token:モデルが返す文字数相当

  • SKUの例Pro/Flashshort/longvideocached(似た入力の割引)、non‑thinking(推論拡張なし)

要は、入出力トークン × SKUで積み上がります。
long+video+(キャッシュが効かない)の組み合わせは一撃が重いので注意です。


今日・今週・今後:再発防止チェックリスト

今日やること

  • Budgets & Alerts月上限は数千円〜1万円弱に設定し、メール通知。

  • Gemini APIを未使用プロジェクトで無効化(使わない所はOFF)。

  • APIキー整理未使用キーは削除必要なAPIだけ許可、**参照元制限(HTTPリファラ/固定IP/署名)**を必須に。

  • 自動化の一時停止:n8n等のフローを止め、トリガー条件とリトライ回数を棚卸し。

今週やること

  • クォータ(1日の上限)を低めに設定し、スパイクの物理的上限を作る。

  • Credential別メトリクスの週次レビューをルーチン化。

  • Secret Manager/環境変数で鍵を管理、リポジトリ直書き禁止をチームルールに。

今後やること

  • **鍵レス運用(例:Workload Identity)**の検討。

  • プロジェクト分離と最小権限:検証と本番を分け、ロールを絞る。

  • キーの定期ローテーション月1〜四半期1を目安に失効日付きで回す。


まとめ:もう同じ目に遭わないために

  • まずは止血(API無効化・請求停止・2FA)。

  • 次に、事実を整理して誠意を持って説明自分の落ち度も認めつつ、無闇に使っていないことを静かに具体的に伝える。

  • 仕上げに予算アラート・クォータ・参照元制限物理的な上限を置く。

私のケースは、約21万円の請求に対して約19万円の調整に応じてもらえ残り約2万円を一括清算して落ち着きました。
大ごとに見えても、順番に手を打てば着地はできます。同じ状況に陥った方の「最初の一歩」と「再発防止の型」として、少しでも役立てば幸いです。

いいなと思ったら応援しよう!

コメント

コメントするには、 ログイン または 会員登録 をお願いします。
【体験談】ある朝、Googleから「約21万円」の請求が来た。Gemini APIで冷や汗をかいた私がやったこと|JW
word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word

mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1