本文へスキップ
  1. TOP
  2. Web制作
  3. 実務知識
  4. 55万円請求を生んだ、公開ページと従量課金APIを直結する落とし穴

03 / BUILD

つくるフェーズの実務知識

55万円請求を生んだ、公開ページと従量課金APIを直結する落とし穴

1ページの表示が最大8回の有料処理へ増幅された費用事故から考える

急増したAPI利用料金の請求明細とグラフを確認する制作チーム

PRACTICAL KNOWLEDGE 実務知識

WRITTEN BY

FHW制作チーム

反省会と日々の制作記録をもとに、担当スタッフが実際に迷い、確認し、判断した過程を整理しています。

請求額を見たとき、私たちはまず、画面に表示している地図の利用が増えたのだと考えました。ところが、請求明細を分けて確認すると違いました。Google Maps Platformの利用料金は税込557,715円。その税抜費用の約96%を占めていたのは、公開ページの裏側で実行される従量課金APIでした。

約39,424件の公開詳細ページがあり、1ページの表示が最大8回の有料処理へ増幅される実装でした。機械的な大量アクセスが引き金になった可能性は極めて高い一方、当時のアクセスログからUser-AgentやIPを特定できていないため、特定のクローラーが原因だったとは断定していません。

請求の主因は、画面に見える地図ではなかった

税込557,715円のうち、従量課金APIの費用は税抜487,068円、実行回数は99,174回でした。一方、画面に表示する地図の費用は税抜16,707円でした。見た目から原因を推測せず、サービス別・SKU別の利用量と費用に分けたことで、止めるべき処理を特定できました。

費用の約93%は特定の6日間に集中していました。この偏りは、人による通常閲覧よりも、クローラーなどによる機械的な巡回と整合します。ただし、費用の集中だけをもってアクセス主体を決めつけないことも重要です。

1ページ表示が、裏側で8回の有料処理になっていた

利用者から見れば一つの詳細ページでも、サーバー側では複数の条件ごとに外部APIへ問い合わせていました。その結果、一度のページ表示が最大8回の有料処理へ増幅されていました。

99,174回を8回で割ると、約12,397回分の詳細ページ処理に相当します。数万件の公開URLを持つサイトでは、すべてのページを人が閲覧しなくても、機械的な巡回だけで短期間に大きな請求へ到達し得ます。

  • 公開URLは何件あるか
  • 1ページ表示で外部APIを何回呼ぶか
  • 同じページを再訪したとき再課金されるか
  • 全URLを一度巡回された場合の最大費用はいくらか

問題は「有料APIを使ったこと」ではなく、公開アクセスと直結したこと

有料APIの利用自体が問題だったわけではありません。公開ページを表示するだけでサーバー側の従量課金APIが実行され、その結果を保存・再利用せず、同じアクセスのたびに再実行する経路が外部へ開かれていたことが問題でした。

IP単位の短時間レート制限はありましたが、複数のIPを合算した日次上限や、Google Cloud側の低いクォータは設定されていませんでした。入口を制限していても、外部API側で何倍に増幅されるかまで見なければ、費用の上限にはなりません。

予算アラートは、費用を自動で止める装置ではない

予算アラートは異常を知らせるための仕組みで、設定額に達した時点で自動的にAPI利用や請求を止めるものではありません。請求情報には遅延もあるため、金額だけを見ていると急増を後から追うことになります。

停止に近い役割を持つのは、APIごとのクォータとアプリ側の回数上限です。予算通知、API利用量の通知、アプリ側の日次上限、Cloud側のクォータを別々の防御として重ねます。

Google Maps Platformの費用管理でも、予算通知とクォータは異なる役割として案内されています。

公開画面から有料処理を切り離す

対策では、公開ページの閲覧を契機に有料APIへ直接問い合わせる構造をやめました。必要なデータは管理された処理で取得し、公開側は保存済みの結果を読む形へ分けます。また、複数回に分かれていた問い合わせを可能な範囲でまとめました。

  • 公開画面と外部API通信を分離する
  • 取得結果を利用条件の範囲内で保存・再利用する
  • 複数条件の問い合わせをまとめ、外部通信回数を減らす
  • ブラウザ用とサーバー用のAPIキーを分離する
  • キーごとに利用できるAPIと接続元を制限する
  • アプリ側とCloud側の両方に分・日単位の上限を設ける

対策後は、Cloud Monitoringの利用量メトリクスで従量課金APIへのリクエスト数を継続的に確認しています。請求データ自体には反映までの遅延があるため、金額よりもリクエスト数そのものを指標にする方が実態を追いやすく、対策前と比べておおむね99%以上少ない件数で推移していること、同種の急増が再発していないことを確かめられます。

費用対策で、サービスの使い勝手まで壊さない

初動では、地図そのものも利用者が操作するまで表示しない方式へ変更しました。しかし主因は地図表示ではなく、その裏側で繰り返される別の有料処理でした。原因ではない機能まで止めると、費用は減ってもサービス価値を損ないます。

そこで、課金の中心となる経路の遮断、キー制限、クォータ、保存済みデータの利用は維持しながら、地図の表示方法は元に戻しました。緊急停止と恒久対策を分け、何を止めれば費用が止まり、何を残せば利用体験を守れるかを確認します。

公開前に、PVではなく最悪費用を試算する

月間PVの予測だけでは、クローラーによる全ページ巡回や、一つの処理内で増幅する外部通信を捉えられません。公開URL数、1ページ当たりの外部API回数、単価を掛け合わせ、想定外ではなく計算可能な最大値として確認します。

  • 公開ページ1表示で発生する外部API通信を計測したか
  • ループや条件分岐の中で通信回数が増えていないか
  • 全公開URLを一度巡回された場合の費用を計算したか
  • 同一条件の再取得を避ける仕組みがあるか
  • IP単位だけでなくプロジェクト全体の日次上限があるか
  • 予算通知とは別にAPIクォータを設定したか
  • 異常時に止める処理と、維持する利用者向け機能を分けたか
  • 請求・API使用量の急増を複数の連絡経路で検知できるか

発生した費用は、原因と対策を添えて相談する

従量課金APIの費用は通常の利用に対する正当な対価であり、Google側に自動的な返金の仕組みはありません。それでも、原因を特定し、技術的な再発防止策を完了させたうえで依頼すれば、初めてのインシデントについて一時的な費用調整(クレジット)を検討してもらえる余地はあります。相談先は請求先アカウントに紐づく課金サポートで、有料サポートプランに入っていなくても利用できます。

依頼文のサンプル(Google Cloud 課金サポート宛)

同じような急増に直面した方の参考になるよう、実際に使った依頼文の型を、個別の数値を置き換えられる形で残します。件名は「〇〇API 想定外の高額請求に関するクレジット申請」のように、対象APIと目的が分かる形にします。

  • 請求先アカウントID・対象プロジェクト名を先頭に記載する
  • ■発生した問題:発生期間、対象APIのみの費用、請求先アカウント全体の費用を数字で示す
  • ■原因:制限が不十分だったキーや経路が、外部からの機械的なアクセスに晒されていたことを説明する
  • ■実施済みの再発防止策:キーの分離、接続元・利用APIの制限、アプリ側とCloud側それぞれの回数上限、公開経路と有料APIの切り離しなど、実際に手を打った内容を箇条書きにする
  • ■依頼内容:初めてのインシデントであり技術的な再発防止策を完了していることを添え、対象期間の異常利用分について一時的なクレジット(費用調整)を検討してもらえるよう依頼する

この経験から残す判断基準

公開ページと従量課金APIの間には、クローラーも通常利用者も通る入口があります。アクセス数だけを制限するのではなく、一つのアクセスが外部で何回の課金へ変換されるかを把握し、費用の最終上限をシステムとCloudの両側で持たせます。

従量課金APIを使うWeb制作では、「正常に表示できるか」と同じ重さで、「すべての公開URLを機械的に巡回されても支払えるか」を公開条件に含める必要があります。

PRACTICAL KNOWLEDGE 同じフェーズの実務知識

私たちが別の制作で得た判断や確認方法を、同じ制作フェーズからご覧いただけます。

複数社でWeb制作の引き継ぎ内容を確認する作業デスク

自社で公開できないWeb制作で、入稿・納品・確認の責任範囲をどう決めるか

外部CMSや別会社の環境へ入稿・納品する制作で、利用できる技術、確認段階、修正の戻し先、完了条件をどう決めるか整理します。

支給デザインを共通ルールと例外へ分けて確認する制作チーム

支給デザインを、共通ルール・例外・動作仕様へどう変換するか

Figma、画像、印刷物、参考サイトなどの支給物から、共通部品、例外、可変条件、レスポンシブ、動作仕様を整理し、複数人で再現できる実装ルールへ変換する方法をご紹介します。

公開日時と素材の進行状況を確認するWeb制作の作業デスク

公開日を動かせないWeb制作で、未確定素材・版管理・日時公開をどう管理するか

公開日時が固定された制作で、後から届く素材、複数の版、日時指定公開、公開直前の変更を安全に管理する方法をご紹介します。

Web制作中に増えた要望と工程への影響を整理する制作チーム

その追加要望、今入れますか? Web制作中の変更をどう判断するか

Web制作中に増えた要望を、目的、合意範囲、影響する工程、費用、日程、公開時期から確認し、修正・追加対応・公開後対応へ整理する方法をご紹介します。

短納期の制作で公開条件と後工程をカードに分ける制作チーム

短納期のWeb制作で、削ってよい工程・削ってはいけない確認は何か

短い制作期間で、共通ルール、未確定素材、確認範囲、公開後へ送る改善を整理し、速さのために品質判断まで省略しない進め方をまとめます。

受付窓口で申込書と処理の流れを確認する担当者と利用者

紙・PDFで続けてきた申込・注文業務を、どうWebへ移すか

紙やPDFで行ってきた申込・注文業務をWeb化するとき、利用者の操作、受付側の確認、例外処理、計算、保存、外部連携までを一続きで設計する方法を整理します。

公共空間でスマートフォン、タブレット、ノートPCを使う人々

対応端末・ブラウザは、利用場面からどう決めるか

Web制作の対応端末とブラウザを、利用者、場所、主な操作、重要度から優先・代表・簡易確認へ分け、境界の内容と再現情報を確認する方法を整理します。

Webフォームの入力から通知までを検証する作業デスク

フォームの送信確認で、通知・自動返信・保存データ・担当振り分けまでどう検証するか

Webフォームについて、入力・確認・送信だけでなく、管理者通知、自動返信、保存データ、担当振り分け、本番環境でのメール到達までを一続きで検証する方法を整理します。

CSVの一括更新結果と既存データへの影響を確認する資料

CSVで一括登録・更新するとき、既存データをどう守るか

CSVの一括登録・更新で、識別キー、空欄、部分失敗、事前確認、再実行、復旧を安全に扱う確認方法を整理します。

更新担当者と制作会社がページテンプレートの編集範囲を確認する作業台

お客さまもHTML・CSSを更新するサイトで、編集範囲をどう設計するか

お客さまがHTML・CSSを直接更新するWebサイトで、編集できる範囲、共通部品、CSSの影響範囲、変更履歴、制作会社へ相談する条件をどう決めるか整理します。

会員の登録状態と役割ごとの権限、外部連携を整理した立体模型

会員サイトで、登録状態・役割・権限・外部連携をどう設計するか

会員サイトの登録途中を含む状態、役割ごとの操作権限、外部サービスとの状態差、機能を段階公開する場合の判断方法を整理します。

少量のサンプルから本番規模の多様なコンテンツへ広げて検証する模型

少量のサンプルで動くWebサイトを、本番規模でも崩さないために何を試すか

数件のきれいなデータだけでは見つからない、最大件数、長文、画像量、空欄、ページ送り、一括処理の問題を公開前に確かめる方法を整理します。

原稿から複数言語のページと公開状態へ展開する編集工程

多言語サイトで、翻訳原稿・共通部品・段階公開をどう同期するか

多言語サイト制作で、ページと言語の対応、翻訳原稿の状態、共通部品の文字量差、言語ごとの段階公開を安全に管理する方法を整理します。

共通基盤でつながりながら役割を分けた複数サイトの建築模型

複数サイト・複数部署で、共通部分と運用範囲をどう分けるか

複数サイトや複数部署で運用するとき、共通化する見た目・情報・仕組み、権限、公開日、正となる情報源をどう分けるかを整理します。

光と布の動きが段階的に変化する展示空間

動きのあるデザインを、雰囲気ではなく実装仕様へどう変えるか

参考サイトやデザインの動きを、開始条件、時間、順番、終了状態、読み込み、端末ごとの代替表現へ分解し、安全に実装する方法を整理します。