Cloud Runの手動スケーリングを解説

記事タイトルとURLをコピーする

G-gen の佐々木です。当記事では、Cloud Run の手動スケーリング機能について解説します。

はじめに

Cloud Run とは

Cloud Run は Google Cloud のマネージドなコンテナ実行環境でアプリケーションを実行することができる、サーバレス コンテナコンピューティング サービスです。

Cloud Run には Cloud Run services と Cloud Run jobs、そして Cloud Functions から統合された Cloud Run functions の3種類がありますが、当記事における Cloud Run は Cloud Run services を指すものとします。

blog.g-gen.co.jp

注意事項

当記事で解説する Cloud Run の手動スケーリング機能は、2025年2月時点ではプレビュー提供の機能となります。

プレビュー機能は SLA や技術サポートの対象とならず、また事前通知なしで仕様が変更される可能性があることから、本番環境での利用は非推奨です。詳細については以下の記事を参照してください。

blog.g-gen.co.jp

手動スケーリングの仕様

手動スケーリングとは

Cloud Run の手動スケーリング機能は、Cloud Run services のコンテナインスタンス数を手動で指定できる機能です。

デフォルトでは、Cloud Run services のコンテナインスタンスは自動でスケーリングを行います。受信トラフィック数と CPU 使用率に基づき、事前に指定された最小(最大)インスタンス数をスケーリングの下限(上限)として、自動的にスケーリングが行われます。一方、手動スケーリング設定を行うと、コンテナインスタンス数を任意の値に設定できます。

手動スケーリングでは新たなリビジョンをデプロイすることなく、起動するインスタンスを任意の数に固定することができます。この設定操作を Cloud Scheduler などで自動化することで、「特定の時間帯のみインスタンス数を10に固定し、それ以外の時間は3に固定する」といった自動化を実現できます。

サービスとリビジョンの設定

手動スケーリングはサービスの設定であり、手動スケーリングを設定する場合はリビジョンのインスタンス数の設定は無視されます。リビジョンレベルとサービスレベルのインスタンス数の設定については以下の記事も参照してください。

トラフィック分割への影響

手動スケーリングを使用している Cloud Run サービスでリビジョン間のトラフィック分割を設定している場合、以下のルールが適用されます。

  • 各リビジョンに対してトラフィック分割の割合に比例したインスタンス数が割り当てられる。
  • トラフィック分割対象のリビジョンの数 > インスタンス数 の場合、インスタンスが存在しないリビジョンができる。そのリビジョンにトラフィックが送信された場合はエラーが返る。
  • リビジョンレベルの最小(最大)インスタンス数の設定は無視される。

サービスの無効化

手動スケーリングでインスタンス数を0に設定することで、サービスを無効にすることができます。

無効化したサービスに送信されたリクエストは、Service unavailable または Service disabled エラーで失敗します。

手動スケーリングの使用

手動スケーリングは、サービスの作成時や更新時に設定することができます。

サービス作成時に手動スケーリングを設定する(コンソール)

既存のサービスで手動スケーリングを設定する(コンソール)

gcloud コマンドの場合、gcloud run service deploy コマンドや gcloud run service update コマンドで --scaling フラグを利用することで設定できます。以下はサービス更新時に手動スケーリングを設定するコマンドです。

# 手動スケーリングへの切り替え(プレビュー時点では beta コマンドを使用)
gcloud beta run services update <サービス名> \
   --scaling=<インスタンス数>

手動スケーリングを設定すると、自動スケーリングにおけるリビジョンレベル/サービスレベルのインスタンス数の設定は無効になります。

手動スケーリング設定時の料金

リクエストベースの課金の場合

通常、リクエストベースの課金(旧称:「リクエスト処理中にのみ CPU を割り当てる」設定)では、リクエスト数に応じた料金と、リクエストの処理時間に応じた CPU、メモリの利用料金が発生します。

それに加えて、手動スケーリング設定時は、最小インスタンス数を1以上にしている場合と同様にインスタンスのアイドル時間に対してもCPU、メモリの利用料金が発生します。

リクエストベースの課金で手動スケーリングを使用する場合

インスタンスベースの課金の場合

インスタンスベースの課金(旧称:「CPU を常に割り当てる」設定)の場合、Cloud Run の料金はリクエスト数に関係なく、インスタンスが起動している時間(アクティブ、アイドル状態問わず)に応じて CPU とメモリの料金が発生します。

したがって、手動スケーリングでインスタンスベースの課金を適用する場合は、インスタンスの起動数だけ CPU とメモリの料金が常に発生することになります。

スケジュールベースの自動スケーリング

Cloud Scheduler の利用

手動スケーリングと Cloud Scheduler を併用することで、任意の時刻にインスタンス数をスケーリングすることが可能です。

Cloud Scheduler で HTTP エンドポイントをターゲットとしたジョブを作成し、Cloud Run API へリクエストすることで、ノーコードでサービスをスケーリングすることができます。

gcloud scheduler jobs create http hello-start-instances \
  --location=REGION \
  --schedule="0 9 * * MON-FRI" \
  --time-zone=America/Los_Angeles \
  --uri=https://run.googleapis.com/v2/projects/PROJECT_ID/
  locations/REGION/services/hello?update_mask=launchStage,scaling.manualInstanceCount \
  --headers=Content-Type=application/json,X-HTTP-Method-Override=PATCH \
  --http-method=PUT \
  --message-body='{"launchStage":"BETA","scaling":{"manualInstanceCount":10}}' \
  --oauth-service-account-email=PROJECT_NUMBER-compute@developer.gserviceaccount.com

自動スケーリングにおけるスケールのスケジューリング

なお前述の方法で、手動スケーリング設定でスケジュールに基づいてスケーリングした場合は、インスタンス数を特定の数に固定することしかできないため、設定した以上のインスタンス数が予期せず必要になったときなどに柔軟なスケールアウトを行うことができません。

以下の記事では、サービスレベルの最小インスタンス数をスケジュールベースで変更することで、最大インスタンス数の設定が有効な状態(自動スケーリングの設定)で、任意の数以上のインスタンスを維持する方法を解説しています。

blog.g-gen.co.jp

佐々木 駿太 (記事一覧)

G-gen最北端、北海道在住のクラウドソリューション部エンジニア

2022年6月にG-genにジョイン。Google Cloud Partner Top Engineer 2025 Fellowに選出。好きなGoogle CloudプロダクトはCloud Run。

趣味はコーヒー、小説(SF、ミステリ)、カラオケなど。