メインコンテンツまでスキップ

クラウド破産しかけなかった話

前回 Google Cloud Run を使って読み上げ機能を自作したというのを書いたが、設定ミスにより 566+ 円の請求が確定した。

少額なので大して面白い話ではないのだが、よくあるクラウド破産話とやっていることは同じなので、記憶に刻む意味を込めてテキストとして残す。

時系列

メールその 1 が来る

11/13 に Google Cloud から

Billing Budget Alert

100% of budget expected to be reached

というメールが来る。上限を 1000 円に設定していて、Cloud Run にデプロイしてから 2 週間くらいしかたってないのでなんかおかしいので調べないと、と思いつつやるのを忘れる。

メールその 2 が来る

翌日 11/14 に今度は

50% of budget reached

というメールが来ていることに夜気づいて、翌日朝対応することにする。

調査

Google Cloud Console で Billing / Reports を見ると、11/5 から毎日 33 円のコストが計上され、11/11 からは毎日 99 円のコストが計上されていることを確認。

Billing

青が Services Min Instance Memory (Request-based billing) でオレンジが Services Min Instance CPU (Request-based billing)。

デプロイしてから(悲しいことに)全く使っていなかったので変だなと思いつつ Cloud Run のログを見てもアクセスされている形跡がない。よくわからないのでとりあえず "Services Min Instance Memory (Request-based billing)" で検索したら似たな事象に関する Reddit のポストが出てきた。

結果としては、Cloud Run の Manual scaling で Number of instances を 1 に設定していたため、常に 1 つのインスタンスが起動していたのが原因だった。

なぜ Manual scaling で設定していたのか

  • Text-to-Speech API を試した後にブラウザ拡張の方の実装に移ったのだが、その際に一度インスタンスを完全に停止したかったので Manual scaling で 0 を設定していた。(これ以外インスタンスを停止する方法はない)
  • 利用を再開する際に Manual scaling で 1 を設定してしまった
  • このときは Manual scaling でもコールドスタートするものと思っていた

なぜもっと早く気づけなかったのか

  • Billing / Reports はデプロイ直後数日間は見ていたが、無料枠に収まっていたのでまあ大丈夫だろうとたかをくくっていた
  • 無料枠に計上されていた中身をちゃんと確認しておらず、勝手に Cloud Build の利用だと勘違いしていた1

対策

  • Auto scaling で Max instances を 1 にする
  • Billing / Reports の表示で Savings のフィルタを無効にする
    • デフォルトは Savings 適用後の金額で表示されるため
    • Savings はないものとして考えるべき
      • ちなみに Savings 適用がない場合は 1,360 円
  • サービスの仕様とコスト計算をもっと理解する
    • けど複雑で面倒なのであまりやらない気がする

感想

Billing でアラート設定するのはやはり重要


  1. Billing 見るとそもそも Cloud Build での計上がなかった。でもデプロイするとき Docker のビルドは GCP 上でやっているので何かしらのリソースを消費しているはずなのだがどうなってるんだ