セキュリティの事故は「攻撃されたら起きる」ものですが、これは誰にも攻撃されなくても起きます。自分のコードのバグだけで十分です。
そして気づくのは、たいてい請求書が届いてからです。
1. なぜ跳ねるのか — 従量課金には天井が無い
昔のレンタルサーバーは「月1,000円で使い放題」でした。使いすぎればサイトが遅くなるだけで、請求額は変わりません。
いまのクラウドサービスは逆です。使った分だけ請求され、上限を設定しない限り天井がありません。 混雑しても遅くならず、スケールして、そのぶん課金されます。
これは本来メリットです。急にアクセスが増えてもサービスが落ちません。ただし**「増えた」の原因が正常なアクセスとは限らない**というのが、この記事の話です。
2. 跳ねやすい5つのパターン
パターン1: AIのAPI呼び出し
いちばん危険です。
OpenAI や Anthropic のAPIは、1リクエストあたりの単価がクラウドの他のサービスより桁違いに高く、しかも入力が長いほど高くなります。
AI が書きがちな危険な実装:
- 会話履歴を毎回全部送る — やり取りが進むほど、1回のコストが上がっていく
- ユーザーが送った文章の長さを制限していない — 長文を貼られると1回で高額
- リトライ(再試行)に上限が無い — エラーが続くと同じ呼び出しを繰り返す
- ログイン不要で使える — 誰でも無制限に呼べる
最後が特に効きます。「試しに使ってもらいたいから」とログイン無しでAI機能を公開すると、それはあなたのお金で誰でもAIを使える窓口になります。
パターン2: 画像・動画の変換
画像の最適化、サムネイル生成、動画のエンコード。これらは処理が重く、多くのサービスで「変換した枚数」や「転送量」で課金されます。
問題は、同じ画像が何度も変換されることです。キャッシュ(一度作ったものを再利用する仕組み)が効いていないと、ページを表示するたびに変換が走ります。
パターン3: 無限ループ
いちばん静かに、いちばん速く跳ねます。
【起きること】
- 処理Aが処理Bを呼び、処理Bが処理Aを呼ぶ
- データ更新をきっかけに動く処理が、自分でデータを更新する
- 失敗したら再試行する処理が、再試行でも失敗し続ける
3番目が特に多いパターンです。「エラーが出たら再試行して」とAIに頼むと、上限を指定しない限り永久に再試行するコードを書くことがあります。
ループは人間の目には見えません。サーバー側で静かに回り続けます。
パターン4: ボットの巡回
公開したサイトには、検索エンジンやAIのクローラーが来ます。これは正常です。
ただし、重い処理を含むページが大量にある場合、クローラーがそれを全部踏んでいきます。
- 検索結果ページが無限に生成される(
?page=1から?page=99999まで) - カレンダー機能が無限に未来の日付を生成する
- フィルタの組み合わせでURLが爆発する
これらは「URLは無限にあるが中身は同じ」という状態で、クローラーは律儀に全部見に行きます。
パターン5: 無料枠を超えた瞬間
最後に、思い込みの問題です。
「無料プランだから請求は来ないはず」——これはサービスによって違います。
- 無料枠を超えたらサービスが停止する → 請求は来ない(ただしサービスが止まる)
- 無料枠を超えたら自動的に従量課金へ移行する → 請求が来る
どちらの挙動なのかは、公開前に必ず確認してください。カードを登録した時点で後者になっているサービスもあります。
3. 対策1: 支払上限を設定する(最優先)
まずやるべきはこれです。
「請求アラート」では足りない理由
多くの人は請求アラートを設定して安心します。しかしアラートは**「使いすぎました」と教えてくれるだけで、止めてはくれません**。
深夜2時に無限ループが始まったとします。アラートは2時半に届きます。あなたが気づくのは朝7時。その4時間半は、丸ごと課金されています。
必要なのは通知ではなく、支払上限(ハードキャップ) です。
主要サービスでの設定
Vercel — Spend Management の機能で、金額のしきい値に達したときの動作を設定できます。通知だけでなく、デプロイを一時停止する選択もできます。設定できるプランと項目は公式ドキュメントで確認してください。
AI API(OpenAI / Anthropic など) — 管理画面でキー単位・組織単位の使用上限を設定できます。これは必ず設定してください。 金額を指定しておけば、そこで止まります。開発用と本番用でキーを分け、それぞれに上限を付けるとさらに安全です。
Supabase — プランごとの上限と、超過時の課金の扱いを確認してください。Spend cap の設定がある場合は有効にします。
クラウド全般(AWS / GCP) — 予算アラートは設定できますが、自動停止は標準では付いていません。停止まで自動化したい場合は別途仕組みが必要です。
確認すべき2点
どのサービスでも、次の2つを確認してください。
- 上限に達したら何が起きるか — 止まるのか、課金され続けるのか
- 止まる場合、どうやって復旧するか — 深夜に止まったときの手順
「止まる」設定は、裏を返せば「サービスが落ちる」ということです。個人開発なら、青天井の請求よりサービス停止のほうがましな場合がほとんどですが、それは自分で選ぶべき判断です。
4. 対策2: レート制限を入れる
上限設定が「被害の天井」を決めるのに対し、レート制限は**「そもそも大量に呼ばせない」**ための対策です。
レート制限とは、「同じ人からのリクエストを一定時間内で制限する」仕組みです。たとえば「1人あたり1分間に10回まで」。
上限設定だけだとサービスが止まり、レート制限だけだと天井がありません。両方あって初めて、暴走しても止まらず、かつ課金も跳ねない状態になります。
どこに入れるか
全部に入れる必要はありません。コストが高い処理だけで十分です。
- AI のAPIを呼ぶ処理 ← 最優先
- 画像・動画の変換
- 外部の有料APIを呼ぶ処理
- メール送信
- 重い集計・検索
ログイン必須にするだけでも効く
AI 機能をログイン必須にするだけで、無差別な悪用はかなり減ります。「試してもらうために無料で開放したい」気持ちは分かりますが、開放するなら回数制限とセットにしてください。
5. 対策3: 跳ねる原因を先に潰す
上限とレート制限は「起きたときに困らない」ための対策です。そもそも起こさない工夫も、いくつかは簡単に入ります。
再試行に上限を付ける。 「3回まで、間隔を空けて」と決めます。無限に再試行しない。
AIに送る入力を制限する。 文字数の上限を決め、会話履歴も直近N件だけ送る形にします。
変換結果をキャッシュする。 同じ画像を毎回変換しない。
クローラーに見せる範囲を絞る。 robots.txt で、検索結果ページやフィルタの組み合わせページを除外します。中身が実質同じURLを無限に生成しない、というのも設計の話です。
タイムアウトを設定する。 外部サービスの応答を無限に待たない。待っている間も課金されます。
6. AIに貼る指示
このアプリが使っている従量課金のサービスを全部洗い出して、それぞれ
次を表にしてください。
(1) 何が課金の単位になるか(リクエスト数、転送量、実行時間、トークン数)
(2) 想定外に費用が跳ねるシナリオ(具体的に)
(3) 管理画面で設定できる上限やアラートの種類
そのうえで、コードを読んで次の危険な実装が無いか確認してください。
- 再試行(リトライ)に上限が無い箇所
- AIのAPIに送る入力の長さを制限していない箇所
- 会話履歴を毎回全部送っている箇所
- 同じ変換処理が毎回走る(キャッシュされていない)箇所
- ログイン不要で呼べる、コストの高い処理
- 外部サービスの呼び出しにタイムアウトが無い箇所
- 処理が互いを呼び合う可能性がある箇所(無限ループの元)
最後に、コストの高いエンドポイントにレート制限を実装してください。
どのエンドポイントにどんな制限値を入れたかを、理由つきで日本語で
説明してください。私はコードが読めません。
7. 公開直後にやるチェックリスト
- 使っているサービスを全部書き出した(無料枠のものも含む)
- それぞれの「無料枠を超えたときの挙動」を確認した(停止か課金か)
- 支払上限を設定できるサービスでは設定した
- AI APIのキー単位の上限額を設定した
- 請求アラートを設定した(上限の代わりではなく、併用として)
- コストの高い処理にレート制限を入れた
- AI機能をログイン必須にした、または回数制限を付けた
- 再試行に上限を付けた
- 外部呼び出しにタイムアウトを設定した
-
robots.txtで無限に生成されるURLを除外した - 公開後1週間、毎日1回は請求画面を見る ← これが最も効く
最後の項目が地味に重要です。跳ね始めは、たいてい小さな異常として現れます。毎日1回見ていれば、初日に気づけます。
まとめ
- 従量課金には天井が無い。攻撃されなくても、自分のバグだけで跳ねる
- 跳ねやすいのは5つ — AIのAPI、画像・動画の変換、無限ループ、ボットの巡回、無料枠超過時の自動移行
- AI APIが最も危険。単価が高く、入力が長いほど高い。キー単位の上限は必須
- 請求アラートは事後通知でしかない。設定できるなら支払上限を使う
- レート制限は上限設定と別に必要。上限は「被害の天井」、レート制限は「発生の抑止」
- 公開後1週間は毎日請求画面を見る。跳ね始めは小さく現れる
これは公開「前」ではなく公開「直後」の項目ですが、後回しにすると痛い出費として返ってきます。公開前の4項目を潰したら、次はここです。