💭

Google Cloud Run の課金について分かりやすくまとめてみる

に公開

基本的にリクエストの処理時間とメモリ使用量で料金が計算されるAWS Lambdaに比べて、コールドスタートやアイドル状態、インスタンス数などの概念が存在するCloud Runは料金形態が必然的に複雑になります。公式のドキュメントを読んでもよく分からなかったのでなるべく簡潔にまとめてみました。

TL;DR

以下の構成を行っている場合、「起動中」「リクエストの処理中」「シャットダウン中(SIGTERMを受信してから最大10秒間)」でしか課金されない

  • 課金の種類をリクエストベース
  • スケーリングの設定を自動スケーリング最小インスタンス数は0に設定

詳細解説

  • Cloud Runのコンテナはリクエストの処理していない間は、アイドル状態というステートになる

    • アイドル状態ではCPUの割り当てがほぼ0になり、基本的に課金は発生しない
    • ただしインスタンスの最小数の設定を行うと、インスタンスがリクエストを処理していない時点でも別の「アイドル状態」の料金が発生する
      • 料金表だと「アイドル状態の最小インスタンスの場合」と書かれているが、正確には「アイドル状態(最小インスタンス数の設定に基づいて維持されている場合)」
    • アイドル状態がしばらく(15分くらい?)続くとコンテナはシャットダウンされる。この状態でリクエストが来るとコールドスタートが発生する
      • ただGoなどの起動時間が高速な言語で書かれたプログラムを動かしてる分には、コールドスタートが発生してもそこまで気になるほどのレイテンシーは発生しない
  • リクエストの処理中にはCPUとメモリ使用量に基づいて課金が発生する

    • 100ms単位で切り上げで計算される
    • 複数リクエストが処理されている場合、最初のリクエストの処理が始まってから最後のリクエストの処理が完了するまで使用時間としてカウントされる
  • 他にコンテナの起動中とシャットダウン中の処理にも課金されるので注意

    • JVMとかやたら起動に時間がかかるものを動かしてない限りそこまで気を使う必要もないと思う
    • SIGTERMをちゃんとハンドルするようにしとく必要がある

出典

https://cloud.google.com/blog/ja/products/serverless/lifecycle-container-cloud-run

Discussion