手動スケーリング

このページでは、サービスを手動でスケーリングする方法について説明します。また、Cloud Scheduler ジョブと Cloud Run Admin API を使用してスケジュールに基づいてインスタンス数を変更する一般的なユースケースの手順も示します。

概要

デフォルトでは、Cloud Run はトラフィックと CPU 使用率に応じて、指定されたインスタンス数またはデフォルトの最大インスタンス数に自動的にスケールアウトします。ただし、ユースケースによっては、手動スケーリングを使用して特定の数のインスタンスを設定することが必要になる場合があります。

手動スケーリングでは、トラフィックや使用率を問わず、再デプロイを必要とすることなく、特定のインスタンスの数を設定できます。これらすべてにより、外部システムを使用して独自のスケーリング ロジックを記述できます。例については、スケジュールベースのスケーリングをご覧ください。

リビジョン レベルの最小値と最大値の設定と手動スケーリング

サービスを手動スケーリングに設定した場合、リビジョン レベルの最小インスタンス数と最大インスタンス数の設定は無視されます。

手動スケーリングのトラフィック分割

次のリストは、手動スケーリングでトラフィックを分割するときにインスタンスが割り振られる方法を示しています。これには、トラフィック タグのみのリビジョンの動作も含まれます。

  • トラフィック分割中、各リビジョンには、サービスレベルの最小インスタンス数を使用したトラフィック分割と類似した方法で、トラフィック分割に基づいてインスタンスが比例的に割り当てられます。

  • トラフィックを受信するリビジョン数が手動インスタンス数を超えると、一部のリビジョンにインスタンスが割り当てられません。これらのリビジョンに送信されたトラフィックについては、リビジョンが無効になっている場合と同じエラーが発生します。

  • トラフィック分割でトラフィックを受信するすべてのリビジョンで、リビジョン レベルの最小インスタンス数と最大インスタンス数が無効になります。

  • リビジョンがトラフィック タグが原因でのみアクティブな場合:

    • リビジョン レベルの最小インスタンス数が設定されている場合、指定された数のインスタンスが起動されますが、サービス手動インスタンスの合計数にはカウントされません。リビジョンは自動スケールされません。
    • リビジョン レベルの最小インスタンス数が設定されていない場合、リビジョンはタグ URL に送信されたトラフィックに応じて最大 1 つのインスタンスにスケールアウトされます。

手動スケーリングを使用した課金の動作

手動スケーリングを使用する場合、請求の動作は最小インスタンス数機能を使用する場合の動作に類似しています。

つまり、手動スケーリングとインスタンスベースの課金では、手動でスケーリングされたアイドル状態のインスタンスは、アクティブ インスタンスとして課金されます。

リクエスト ベースの課金で手動スケーリングを使用する場合、手動でスケーリングされたアイドル状態のインスタンスは、アイドル状態の最小インスタンス数として課金されます。課金の詳細については、料金ページをご覧ください。

必要なロール

Cloud Run サービスのデプロイに必要な権限を取得するには、次の IAM ロールを付与するよう管理者に依頼してください。

Cloud Run に関連付けられている IAM ロールと権限のリストについては、Cloud Run IAM ロールCloud Run IAM 権限をご覧ください。Cloud Run サービスがGoogle Cloud APIs(Cloud クライアント ライブラリなど)と連携している場合は、サービス ID の構成ガイドをご覧ください。ロールの付与の詳細については、デプロイ権限アクセスの管理をご覧ください。

スケーリングを構成する

スケーリング モードは、サービスを作成または更新するときに、 Google Cloud コンソール、Google Cloud CLI、YAML ファイル、または API を使用して構成できます。

コンソール

  1. Google Cloud コンソールで Cloud Run に移動します。

    [Cloud Run] に移動

  2. 新しいサービスを構成する場合は、メニューから [サービス] を選択し、[コンテナをデプロイ] をクリックして [サービスの作成] フォームを表示します。既存のサービスを構成する場合は、サービスをクリックして詳細パネルを表示し、詳細パネルの右上にある [スケーリング] の横にある鉛筆アイコンをクリックします。

  3. [サービスのスケーリング] フォーム(新しいサービスの場合)、または [スケーリングの編集] フォーム(既存のサービスの場合)を見つけます。

    画像

    [インスタンス数] フィールドに、サービスのコンテナ インスタンスの数を指定します。

  4. 新しいサービスの場合は [作成]、既存のサービスの場合は [保存] をクリックします。

gcloud

新しいサービスのスケーリングを指定するには、deploy コマンドを使用します。

gcloud run deploy SERVICE \
    --scaling=INSTANCE_COUNT \
    --image IMAGE_URL

次のように置き換えます。

  • SERVICE: サービスの名前。
  • INSTANCE_COUNT: サービスのインスタンス数。これにより、サービスは手動スケーリングに設定されます。サービスを無効にするには、値 0 を指定します。デフォルトの Cloud Run 自動スケーリングの動作を使用するには、値 auto を指定します。
  • IMAGE_URL: コンテナ イメージへの参照(例: us-docker.pkg.dev/cloudrun/container/hello:latest)。Artifact Registry を使用する場合は、リポジトリ REPO_NAME がすでに作成されている必要があります。URL は LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG の形式です。

次の update コマンドを使用して、既存のサービスのスケーリングを指定します。

gcloud run services update SERVICE \
   --scaling=INSTANCE_COUNT

YAML

  1. 新しいサービスを作成する場合は、この手順をスキップします。既存のサービスを更新する場合は、その YAML 構成をダウンロードします。

    gcloud run services describe SERVICE --format export > service.yaml
  2. scalingMode 属性と manualInstanceCount 属性を更新します。

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
      annotations:
      run.googleapis.com/scalingMode: MODE
      run.googleapis.com/manualInstanceCount: INSTANCE_COUNT

    次のように置き換えます。

    • SERVICE: Cloud Run サービスの名前。
    • MODE: 手動スケーリングの場合は manual、デフォルトの Cloud Run 自動スケーリングの動作の場合は automatic
    • INSTANCE_COUNT: サービスに対して手動でスケーリングするインスタンス数。サービスを無効にするには、値 0 を指定します。
  3. 次のコマンドを使用して、サービスを作成または更新します。

    gcloud run services replace service.yaml

REST API

特定のサービスでサービスレベルの最小インスタンスを更新するには、PATCH HTTP リクエストを Cloud Run Admin API の service エンドポイントに送信します。

curl の使用例を次に示します。

    curl -H "Content-Type: application/json" \
    -H "Authorization: Bearer ACCESS_TOKEN" \
    -X PATCH \
    -d '{"scaling":{"manualInstanceCount":MANUAL_INSTANCE_COUNT }}' \
    https://run.googleapis.com/v2/projects/PROJECT_ID/locations/REGION/services/SERVICE?update_mask=scaling.manualInstanceCount

次のように置き換えます。

  • ACCESS_TOKEN: サービスを更新する IAM 権限を持つアカウントの有効なアクセス トークン。たとえば、gcloud にログインしている場合は、gcloud auth print-access-token を使用してアクセス トークンを取得できます。Cloud Run コンテナ インスタンスから、コンテナ インスタンス メタデータ サーバーを使用してアクセス トークンを取得できます。
  • MANUAL_INSTANCE_COUNT: サービスのインスタンス数。これにより、サービスは手動スケーリングに設定されます。サービスを無効にするには、値 0 を指定します。
  • SERVICE: サービスの名前。
  • REGION: サービスがデプロイされている Google Cloud リージョン。
  • PROJECT_ID: Google Cloud プロジェクト ID。

Terraform

Terraform 構成を適用または削除する方法については、基本的な Terraform コマンドをご覧ください。

Terraform 構成の google_cloud_run_v2_service リソースに次の内容を追加します。
resource "google_cloud_run_v2_service" "default" {
  name     = "SERVICE_NAME"
  location = "REGION"

  template {
    containers {
      image = "IMAGE_URL"
    }
  }
  scaling {
    scaling_mode = "MANUAL"
    manual_instance_count = "INSTANCE_COUNT"
  }
}

次のように置き換えます。

  • SERVICE_NAME: Cloud Run サービスの名前。
  • REGION: Google Cloud リージョン。例: europe-west1
  • IMAGE_URL: コンテナ イメージへの参照(us-docker.pkg.dev/cloudrun/container/hello:latest など)。Artifact Registry を使用する場合は、リポジトリ REPO_NAME がすでに作成されている必要があります。URL は LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG の形式です。
  • INSTANCE_COUNT: サービスに対して手動でスケーリングするインスタンス数。このインスタンス数は、受信するトラフィックの割合に基づいて、指定されたトラフィックを含むすべてのリビジョンに分割されます。

サービスのスケーリング構成を確認する

Cloud Run サービスのスケーリング構成インスタンスを表示するには:

コンソール

  1. Google Cloud コンソールで Cloud Run に移動します。

    Cloud Run に移動

  2. 目的のサービスをクリックして、[サービスの詳細] パネルを開きます。

  3. 現在のスケーリング設定は、サービスの詳細パネルの右上にある [スケーリング] ラベルの後の鉛筆アイコンの横に表示されます。

gcloud

次のコマンドを使用して、サービスの現在のスケーリング構成を表示します。

gcloud run services describe SERVICE

SERVICE は、実際のサービス名に置き換えます。

describe から返されたテキストの上部付近にある Scaling: Manual (Instances: ) フィールドを探します。

YAML

次のコマンドを使用して、サービスの YAML 構成をダウンロードします。

gcloud run services describe SERVICE --format export > service.yaml

スケーリング構成は scalingMode 属性と manualInstanceCount 属性に含まれます。

サービスの無効化

サービスを無効にしても、現在処理中のリクエストは完了できます。ただし、サービス URL に対するその後のリクエストは失敗し、Service unavailable または Service disabled のエラーが発生します。

トラフィック タグが原因でのみアクティブになっているサービス リビジョンへのリクエストは、リビジョンが無効になっていないため影響を受けません。

サービスを無効にするには、スケーリングをゼロに設定します。サービスは、 Google Cloud コンソール、Google Cloud CLI、YAML ファイル、または API を使用して無効にできます。

コンソール

  1. Google Cloud コンソールで Cloud Run に移動します。

    Cloud Run に移動

  2. 無効にするサービスをクリックして詳細パネルを表示し、詳細パネルの右上にある [スケーリング] の横にある鉛筆アイコンをクリックします。

  3. [スケーリングを編集] フォームを見つけて、[手動スケーリング] を選択します。

    画像

    [インスタンス数] フィールドに値 0(ゼロ)を入力します。

  4. [保存] をクリックします。

gcloud

サービスを無効にするには、次のコマンドを使用してスケーリングをゼロに設定します。

gcloud run services update SERVICE --scaling=0

SERVICE は、実際のサービス名に置き換えます。

YAML

  1. サービスの YAML 構成をダウンロードします。

    gcloud run services describe SERVICE --format export > service.yaml
  2. manualInstanceCount 属性をゼロ(0)に設定します。

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
      annotations:
      run.googleapis.com/scalingMode: manual
      run.googleapis.com/manualInstanceCount: `0`

    SERVICE は、Cloud Run サービスの名前に置き換えます。

  3. 次のコマンドを使用して、サービスを作成または更新します。

    gcloud run services replace service.yaml

REST API

サービスを無効にするには、Cloud Run Admin API の service エンドポイントPATCH HTTP リクエストを送信します。

curl を使用する場合の例を次に示します。

    curl -H "Content-Type: application/json" \
    -H "Authorization: Bearer ACCESS_TOKEN" \
    -X PATCH \
    -d '{"scaling":{"manualInstanceCount":0 }}' \
    https://run.googleapis.com/v2/projects/PROJECT_ID/locations/REGION/services/SERVICE?update_mask=scaling.manualInstanceCount

次のように置き換えます。

  • ACCESS_TOKEN: サービスを更新する IAM 権限を持つアカウントの有効なアクセス トークン。たとえば、gcloud にログインしている場合は、gcloud auth print-access-token を使用してアクセス トークンを取得できます。Cloud Run コンテナ インスタンスから、コンテナ インスタンス メタデータ サーバーを使用してアクセス トークンを取得できます。
  • SERVICE: サービスの名前。
  • REGION: サービスがデプロイされている Google Cloud リージョン。
  • PROJECT_ID: Google Cloud プロジェクト ID。

Terraform

サービスを無効にするには、manual_instance_count 属性を 0 に設定します。

resource "google_cloud_run_v2_service" "default" {
  name     = "SERVICE_NAME"
  location = "REGION"

  template {
    containers {
      image = "IMAGE_URL"
    }
  }
  scaling {
    scaling_mode = "MANUAL"
    manual_instance_count = "0"
  }
}

次のように置き換えます。

  • SERVICE_NAME: Cloud Run サービスの名前。
  • REGION: Google Cloud リージョン。例: europe-west1
  • IMAGE_URL: コンテナ イメージへの参照(us-docker.pkg.dev/cloudrun/container/hello:latest など)。Artifact Registry を使用する場合は、リポジトリ REPO_NAME がすでに作成されている必要があります。URL は LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG の形式です。

スケジュールベースのスケーリングの例

手動スケーリングの一般的なユースケースは、事前定義されたスケジュールに基づいてインスタンス数を変更することです。この例では、Cloud Scheduler を使用して 2 つのジョブをスケジュール設定しています。各ジョブは Cloud Run Admin API を呼び出してインスタンス数をスケーリングします。1 番目の Cloud Scheduler ジョブは、業務時間中(月曜日~金曜日の午前 9 時~午後 5 時)にサービスを指定されたインスタンス数に手動でスケーリングするように設定します。2 番目のジョブは、業務時間外にサービスを指定されたインスタンス数にスケールダウンするように設定します。

この例では、わかりやすくするために Cloud Run クイックスタートを使用していますが、任意のサービスを使用できます。

スケジュールベースの手動スケーリングを設定するには:

  1. 次のコマンドを使用してサービスをデプロイします。

    gcloud run deploy SERVICE \
       --image=us-docker.pkg.dev/cloudrun/container/hello \
       --region=REGION \
       --project PROJECT_ID

    次のように置き換えます。

    • SERVICE: Cloud Run サービスの名前。
    • REGION: Cloud Run サービスがデプロイされているリージョン。
    • PROJECT_ID: Google Cloud プロジェクト ID。
  2. 次のコマンドを使用して、10 インスタンスに手動スケーリングするようにサービスを構成します。

    gcloud run services update SERVICE \
       --region=REGION \
       --scaling=10
  3. 業務時間中に指定されたサービス インスタンス数に手動でスケーリングする Cloud Scheduler ジョブを作成します。

    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='{"scaling":{"manualInstanceCount":INSTANCE_COUNT}}' \
      --oauth-service-account-email=PROJECT_NUMBER-compute@developer.gserviceaccount.com

    次のように置き換えます。

    • REGION: Cloud Run サービスがデプロイされているリージョン。
    • PROJECT_ID: Google Cloud プロジェクト ID。
    • INSTANCE_COUNT: スケーリングするインスタンス数(例: 10)。
    • PROJECT_NUMBER: Google Cloud プロジェクト番号。

    このコマンドは、Cloud Run Admin API への HTTP 呼び出しを行う Cloud Scheduler ジョブを作成し、インスタンス数を指定した数に設定します。この例では、Cloud Scheduler ジョブに Compute Engine のデフォルトのサービス アカウント PROJECT_NUMBER-compute@developer.gserviceaccount.com を使用しています。Cloud Run サービスを更新するための権限を付与されている任意のサービス アカウントを使用できます。

  4. 業務時間外にサービス インスタンス数を手動でスケールダウンする Cloud Scheduler ジョブを作成します。

    gcloud scheduler jobs create http hello-stop-instances \
      --location=REGION \
      --schedule="0 17 * * 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='{"scaling":{"manualInstanceCount":INSTANCE_COUNT}}' \
      --oauth-service-account-email=PROJECT_NUMBER-compute@developer.gserviceaccount.com

    次のように置き換えます。

    • REGION: Cloud Run サービスがデプロイされているリージョン。
    • PROJECT_ID: Google Cloud プロジェクト ID。
    • INSTANCE_COUNT: スケーリングするインスタンス数。サービスを無効にするには、0 に設定します。
    • PROJECT_NUMBER: Google Cloud プロジェクト番号。

    このコマンドは、Cloud Run Admin API への HTTP 呼び出しを行う Cloud Scheduler ジョブを作成し、手動スケーリング インスタンス数を指定したインスタンス数に設定します。インスタンス数を 0 に設定すると、サービスは事実上無効になりますが、Cloud Scheduler ジョブは無効になりません。これらのジョブは引き続き実行され、スケジュールどおりにサービスを増加後のインスタンス数にリセット(および再有効化)します。