ロールバック、段階的なロールアウト、トラフィックの移行

Cloud Run では、トラフィックを受信するリビジョンと、リビジョンが受信するトラフィックの割合を指定できます。この機能を使用すると、以前のリビジョンへのロールバック、リビジョンの段階的なデプロイ、複数のリビジョン間でのトラフィックの分割ができます。このページでは、この機能を使用して Cloud Run リビジョンへのトラフィックを管理する方法について説明します。

トラフィック ルーティングの調整はすぐに行われません。リビジョンのトラフィックを変更しても、処理中のすべてのリクエストは続行されます。処理中のリクエストは破棄されないため、移行期間中は新しいリビジョンまたは以前のリビジョンのどちらかに送信されます。

トラフィック分割とセッション アフィニティ

セッション アフィニティを有効にして複数のリビジョン間でトラフィックを分割する場合は、セッション アフィニティとトラフィック分割で、セッション アフィニティがトラフィック分割に与える影響を確認してください。

トラフィック分割のライフサイクル

複数のリビジョン間でトラフィックを分割した場合や、トラフィックを以前のリビジョンに割り当てた場合は、以降のすべてのデプロイでそのトラフィック分割パターンが使用されます。従来どおり、トラフィック分割を行わず、最新リビジョンのみを使用するようにするには、すべてのトラフィックを最新リビジョンに送信します。

必要なロール

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

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

以前のリビジョンにロールバックする

以前のリビジョンにロールバックするには:

コンソール

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

    Cloud Run に移動します

  2. サービスリストでサービスを見つけてクリックします。

  3. [リビジョン] タブをクリックして、そのサービスの現在のリビジョンのリストを表示します。

  4. リビジョンのリストで、ロールバックしているリビジョンの右側にある省略記号アイコンをクリックします。

    manage-traffic

  5. [トラフィックの管理] をクリックして、トラフィック管理フォームを表示します。

    1. プルダウン リストから、ロールバックする以前のリビジョンを選択します。
    2. 前のリビジョンのトラフィックの割合を 100 に設定します。
    3. 現在、配信されているリビジョンの割合を 0 に設定します。
    4. [保存] をクリックします。

gcloud

次のコマンドを使用します。

gcloud run services update-traffic SERVICE --to-revisions REVISION=100

  • SERVICE は、サービスの名前に置き換えます。
  • REVISION は、ロールバックするリビジョンの名前に置き換えます。

YAML

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

    gcloud run services describe SERVICE --format export > service.yaml
  2. spec 属性の下にある traffic 属性を見つけて、次のように更新します。

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
     name: SERVICE
    spec:
    ...
      traffic:
      - revisionName: REVISION
        percent: 100
    

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

    • REVISION は、ロールバックするリビジョンの名前に置き換えます。
  3. 次のコマンドを使用して、サービスを新しい構成に置き換えます。

    gcloud run services replace service.yaml
  4. 更新が完了するまで待ちます。完了すると、ロールバック元のリビジョンがすでにデプロイされてトラフィックの 0% を処理しているというメッセージが表示されます。

Terraform

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

次のコードを .tf ファイルに追加します。

resource "google_cloud_run_v2_service" "default" {
  name     = "my-service"
  location = "us-central1"

  deletion_protection = false # set to true to prevent destruction of the resource

  template {}

  traffic {
    percent = 100
    # This revision needs to already exist
    revision = "green"
    type     = "TRAFFIC_TARGET_ALLOCATION_TYPE_REVISION"

  }
}

リビジョンの段階的ロールアウト

新しいリビジョンを段階的にロールアウトするには:

コンソール

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

    Cloud Run に移動

  2. サービスリストでサービスを選択します。

  3. [新しいリビジョンをデプロイする] をクリックします。

  4. 必要に応じてデプロイ フォームに記入します。[このリビジョンをすぐに利用する] のチェックボックスは必ずオフにしてください。

  5. [デプロイ] をクリックします。

  6. [トラフィックを管理] をクリックします。

  7. 新しいリビジョンが一覧表示されますが、割合は 0 に設定され、現在はトラフィックが処理されていないことを示します。フォームで次の操作を行います。

    1. 目的の割合(たとえば 5 )に設定します。現在配信中のバージョンの割合は、自動的に同じ値が減少します。
    2. [保存] をクリックします。
    3. これらの [トラフィックの管理] 手順を繰り返します。割合を変更する場合は、新しいリビジョンに必要な割合を増やします。トラフィックの割合を変更するために再デプロイする必要はありません。

gcloud

  1. 段階的にロールアウトするリビジョンをデプロイします。初期設定では、トラフィックを受信しません。

    gcloud run deploy --image IMAGE --no-traffic

    IMAGE は、デプロイするイメージに置き換えます。

  2. 新しいリビジョンに処理するトラフィックの割合(たとえば、5%)を指定します。

    gcloud run services update-traffic SERVICE --to-revisions REVISION=PERCENTAGE
    • SERVICE は、サービスの名前に置き換えます。
    • REVISION は、段階的にロールアウトするリビジョンの名前に置き換えます。最新のリビジョンを指定するには、LATEST を使用します(たとえば、LATEST=5 )。
    • PERCENTAGE は、新しいリビジョンに送信するトラフィックの割合に置き換えます。たとえば、5 ではトラフィックの 5% が送信されます。
  3. リビジョンのパフォーマンスが十分な場合は、上記の update-traffic ステップを繰り返しますが、必要に応じて割合の値を増やします。

YAML

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

    gcloud run services describe SERVICE --format export > service.yaml
  2. サービスに必要な構成の変更を行い、新しいリビジョンのリビジョン名を指定します。

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
     name: SERVICE
    spec:
     template:
       metadata:
         annotations:
         ...
         name: REVISION-NAME
    

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

    • REVISION-NAME は、新しいリビジョンに付ける名前に置き換えます。
  3. spec 属性の下にある traffic 属性を見つけて、新しいリビジョンが少量のトラフィックのみを処理するように更新します。

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
     name: SERVICE
    spec:
    ...
      traffic:
      - revisionName: REVISION-NEW
        percent: PERCENT-NEW
      - revisionName: REVISION-FORMER
        percent: PERCENT-FORMER
    

    割合を合計すると 100 になる必要があります。次のように置き換えます。

    • REVISION-NEW は、段階的にロールアウトするリビジョンの名前に置き換えます。
    • REVISION-FORMER は、現在トラフィックを処理しているリビジョンの名前に置き換えます。
    • PERCENT-NEW は、新しいリビジョンに送信するトラフィックの割合に置き換えます。たとえば、10 を使用すると、新しいリビジョンにトラフィックの 10% が送信されます。
    • PERCENT-FORMER は、古いリビジョンに送信するトラフィックの割合に置き換えます。
  4. 更新が完了するまで待ちます。完了すると、段階的ロールアウト対象の新しいリビジョンがすでにデプロイされ、設定した割合のトラフィックを処理しているというメッセージが表示されます。

Terraform

次のコードを .tf ファイルに追加し、前のリビジョンから最新のリビジョンにトラフィックの割合を段階的に更新します。トラフィックが変更されるたびに、別の terraform apply の実行が必要になることに注意してください。

resource "google_cloud_run_v2_service" "default" {
  name     = "my-service"
  location = "us-central1"

  deletion_protection = false # set to true to prevent destruction of the resource

  template {
    containers {
      # Image or image tag must be different from previous revision
      image = "us-docker.pkg.dev/cloudrun/container/hello"
    }
  }

  # Define the traffic split for each revision
  # https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/cloud_run_v2_service#traffic
  traffic {
    percent = 100
    # This revision needs to already exist
    revision = "green"
    type     = "TRAFFIC_TARGET_ALLOCATION_TYPE_REVISION"
  }

  traffic {
    # Deploy new revision with 0% traffic
    percent = 0
    type    = "TRAFFIC_TARGET_ALLOCATION_TYPE_LATEST"
  }
}

terraform apply」と入力して変更を適用します。

複数のリビジョン間でトラフィックを分割する

2 つ以上のリビジョン間でトラフィックを分割するには:

コンソール

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

    Cloud Run に移動

  2. サービスリストでサービスを見つけてクリックします。

  3. [トラフィックを管理] をクリックします。

  4. 現在、配信されている新しいリビジョンが一覧表示されます。フォームで次の操作を行います。

    1. 現在、配信されているリビジョンの割合を目的の値に分割します。
    2. プルダウン リストを使用して以前のリビジョンの 1 つを選択し、割合を目的の分割に設定します。
    3. 他のリビジョン間でトラフィックを分割するには、[リビジョンを追加] をクリックして目的のリビジョンを選択し、割合を目的の分割に設定します。
    4. [保存] をクリックします。

gcloud

各リビジョンのリビジョンとトラフィックの割合をカンマ区切りリストで指定します。

gcloud run services update-traffic SERVICE --to-revisions LIST

  • SERVICE は、サービスの名前に置き換えます。
  • LIST は、リビジョンと割合のカンマ区切りのリストに置き換えます。
    REVISION1=PERCENTAGE1REVISION2=PERCENTAGE2REVISIONn=PERCENTAGEx
    (例: hello2-00005-red=25,hello2-00001-bod=25,hello2-00002-nan=50

YAML

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

    gcloud run services describe SERVICE --format export > service.yaml
  2. spec 属性の下にある traffic 属性を見つけて、新しいリビジョンが少量のトラフィックのみを処理するように更新します。

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
     name: SERVICE
    spec:
    ...
      traffic:
      - revisionName: REVISION-A
        percent: PERCENT-A
      - revisionName: REVISION-B
        percent: PERCENT-B
      - revisionName: REVISION-C
        percent: PERCENT-C
    

    割合を合計すると 100 になる必要があります。次のように置き換えます。

    • REVISION-AREVISION-BREVISION-C は、トラフィックを割り当てるリビジョンに置き換えます。
    • PERCENT-APERCENT-BPERCENT-C は、対応するリビジョンに送信するトラフィックの割合に置き換えます。
  3. 次のコマンドを使用して、サービスを新しい構成に置き換えます。

    gcloud run services replace service.yaml
  4. 更新が完了するまで待ちます。完了すると、段階的ロールアウト対象の新しいリビジョンがすでにデプロイされ、トラフィックの 5% (または設定した値)を処理しているというメッセージが表示されます。

Terraform

次のコードを .tf ファイルに追加します。

resource "google_cloud_run_v2_service" "default" {
  name     = "my-service"
  location = "us-central1"

  deletion_protection = false # set to true to prevent destruction of the resource

  template {
    containers {
      image = "us-docker.pkg.dev/cloudrun/container/hello"
    }
    revision = "green"
  }

  # Define the traffic split for each revision
  # https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/cloud_run_v2_service#traffic
  traffic {
    percent  = 25
    revision = "green"
    type     = "TRAFFIC_TARGET_ALLOCATION_TYPE_REVISION"
  }

  traffic {
    percent = 75
    # This revision needs to already exist
    revision = "blue"
    type     = "TRAFFIC_TARGET_ALLOCATION_TYPE_REVISION"
  }
}

terraform apply」と入力して変更を適用します。

すべてのトラフィックを最新のリビジョンに送信する

新しいリビジョンをデプロイすると、このリビジョンを作成でき、将来のすべてのリビジョンがトラフィックの 100% をできるだけ早く処理し、確立されたトラフィック分割を上書きします。

コンソール

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

    Cloud Run に移動します

  2. サービスリストでサービスを見つけてクリックします。

  3. [新しいリビジョンをデプロイする] をクリックします。

  4. 必要に応じてデプロイ フォームに記入します。[このリビジョンをすぐに利用する] のチェックボックスは必ずオンにしてください。これにより、既存のトラフィック分割が上書きされ、新しいリビジョンがトラフィックの 100% を処理します。

  5. [デプロイ] をクリックします。

gcloud

すべてのトラフィックを最近デプロイされたリビジョンに送信するには:

gcloud run services update-traffic SERVICE --to-latest

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

YAML

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

    gcloud run services describe SERVICE --format export > service.yaml
  2. spec 属性の下にある traffic 属性を見つけて、次のように更新します。

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
     name: SERVICE
    spec:
    ...
      traffic:
      - latestRevision: true
        percent: 100
    
  3. 次のコマンドを使用して、サービスを新しい構成に置き換えます。

    gcloud run services replace service.yaml
  4. 更新が完了するまで待機します。完了すると、(最新の)リビジョンがすでにデプロイされ、トラフィックの 100% を処理しているというメッセージが表示されます。

Terraform

次のコードを .tf ファイルに追加します。

resource "google_cloud_run_v2_service" "default" {
  name     = "my-service"
  location = "us-central1"

  deletion_protection = false # set to true to prevent destruction of the resource

  template {}

  traffic {
    percent = 100
    type    = "TRAFFIC_TARGET_ALLOCATION_TYPE_LATEST"
  }
}

terraform apply」と入力して変更を適用します。

テスト、トラフィックの移行、ロールバックにタグを使用する

タグ付きのリビジョンに課金されないようにするには、service-level の最小インスタンスを使用するか、不要になったリビジョンのタグを削除します。

この機能の一般的な使用例は、新しいサービス リビジョンをトラフィックの処理前にテストして確認することです。一般的なシーケンスは次のとおりです。

  1. 開発中にコンテナで統合テストを行います。
  2. ステージングにのみ使用する Google Cloud プロジェクトにコンテナをデプロイし、トラフィックを処理せずに、タグ付きリビジョンをテストします。
  3. トラフィックを処理せずに本番環境にデプロイし、本番環境でタグ付けされたリビジョンに対してテストします。
  4. タグ付きリビジョンにトラフィックを移行します。

新しいタグ付きリビジョンをデプロイする

既存のサービスの新しいリビジョンを本番環境にデプロイするには:

gcloud

新しいタグ付きリビジョンをデプロイします。

gcloud run deploy myservice --image IMAGE_URL  --no-traffic --tag TAG_NAME

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

  • IMAGE_URL は、イメージの URL に置き換えます。
  • TAG_NAME は、小文字のタグ名に置き換えます。

このタグを使用すると、トラフィックを処理することなく、特定の URL で新しいリビジョンを直接テストできます。URL は指定したタグ名で始まります。たとえば、サービス myservice でタグ名 green を使用した場合、URL https://green---myservice-abcdef.a.run.app でタグ付きリビジョンのテストを行います。

Terraform

.tf ファイルに以下を追加します。新しいタグを使用して、古いリビジョンから最新のリビジョンへのトラフィックの割合を段階的に更新します。トラフィックが変更されるたびに、別の terraform apply の実行が必要になることに注意してください。

resource "google_cloud_run_v2_service" "default" {
  name     = "my-service"
  location = "us-central1"

  deletion_protection = false # set to "true" in production

  template {
    containers {
      # image or tag must be different from previous revision
      image = "us-docker.pkg.dev/cloudrun/container/hello"
    }
    revision = "blue"
  }

  # Define the traffic split for each revision
  # https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/cloud_run_v2_service#traffic
  traffic {
    percent = 100
    # This revision needs to already exist
    revision = "green"
    type     = "TRAFFIC_TARGET_ALLOCATION_TYPE_REVISION"
  }

  traffic {
    # Deploy new revision with 0% traffic
    percent  = 0
    revision = "blue"
    tag      = "tag-name"
    type     = "TRAFFIC_TARGET_ALLOCATION_TYPE_REVISION"
  }
}

terraform apply」と入力して変更を適用します。

タグを削除する

リビジョンからタグを削除するには:

コンソール

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

    Cloud Run に移動

  2. サービスリストでサービスを選択します。

  3. 目的のサービスの [リビジョン] セクションに移動し、既存のタグを削除するリビジョンを選択します。

  4. [リビジョンの URL(タグ)] 列にカーソルを合わせ、鉛筆アイコンをクリックします。

    タグの削除

  5. [リビジョンの URL] ダイアログ メニューで、ゴミ箱のアイコンをクリックして、リビジョンで使用されている現在のタグを削除します。

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

gcloud

リビジョンのタグを削除するには:

gcloud run services update-traffic SERVICE --remove-tags TAG_NAME

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

  • TAG_NAME は、トラフィックの移行先のタグの名前で置き換えます。
  • SERVICE は、タグを削除するサービスの名前で置き換えます。

YAML

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

    gcloud run services describe SERVICE --format export > service.yaml
  2. 必要に応じてサービスの構成を変更します。

  3. spec 属性の下で、タグ付きリビジョンの tag 属性を見つけて削除します。

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
     name: SERVICE
    spec:
    ...
      traffic:
      - revisionName: REVISION
        tag: TAG_NAME
        percent: PERCENT-NEW
    
  4. 次のコマンドを使用して、サービスを新しい構成に置き換えます。

    gcloud run services replace service.yaml

Terraform

次のコードを .tf ファイルに追加します。

resource "google_cloud_run_v2_service" "default" {
  name     = "my-service"
  location = "us-central1"

  deletion_protection = false # set to true to prevent destruction of the resource

  template {}

  # Define the traffic split for each revision
  # https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/cloud_run_v2_service#traffic
  traffic {
    percent = 100
    # This revision needs to already exist
    revision = "green"
    type     = "TRAFFIC_TARGET_ALLOCATION_TYPE_REVISION"
  }

  traffic {
    # No tags for this revision
    # Keep revision at 0% traffic
    percent = 0
    # This revision needs to already exist
    revision = "blue"
    type     = "TRAFFIC_TARGET_ALLOCATION_TYPE_REVISION"
  }
}

terraform apply」と入力して変更を適用します。

トラフィックをタグ付きリビジョンに移行する

新しいリビジョンが適切に機能していることを確認したら、Google Cloud コンソール、gcloud コマンドライン、Terraform、または YAML ファイルを使用してトラフィックの移行を開始できます。

コンソール

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

    Cloud Run に移動します

  2. サービスリストでサービスを見つけてクリックします。

  3. トラフィックの送信先となるタグ付きリビジョンを選択します。

    manage-traffic

  4. [トラフィックを管理] をクリックします。

  5. タグ付けされているリビジョン名を見つけます。割合は 0 に設定されています。これは、現在トラフィックが処理されていないことを示します。トラフィックの管理* フォームの場合:

    1. 目的の割合(たとえば 5 )に設定します。現在配信中のバージョンの割合は、自動的に同じ値が減少します。
    2. [保存] をクリックします。
    3. 必要に応じて、このトラフィックの管理手順を数時間または数日繰り返します。ただし、割合を変更した場合は、必要に応じてタグ付けされたリビジョンに割合を増やします。トラフィックの割合を変更するために再デプロイする必要はありません。

gcloud

トラフィックを特定のリビジョンタグに移行するには:

gcloud run services update-traffic myservice --to-tags TAG_NAME=TRAFFIC_PERCENT

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

  • TAG_NAME は、トラフィックの移行先のタグの名前で置き換えます。
  • TRAFFIC_PERCENT は、タグ付きリビジョンで処理するトラフィックの割合で置き換えます(たとえば、1)。

YAML

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

    gcloud run services describe SERVICE --format export > service.yaml
  2. 必要に応じてサービスの構成を変更します。

  3. spec 属性の下で、タグ付きリビジョンの traffic 属性を見つけて更新します。これにより、タグ付きリビジョンが少数のトラフィックのみを処理するようになります。

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
     name: SERVICE
    spec:
    ...
      traffic:
      - revisionName: REVISION
        tag: TAG_NAME
        percent: PERCENT-NEW
      - revisionName: REVISION-FORMER
        percent: PERCENT-FORMER
    

    割合を合計すると 100 になる必要があります。次のように置き換えます。

    • REVISION は、タグ付きリビジョンの名前に置き換えます。
    • TAG_NAME は、段階的にロールアウトするタグの名前に置き換えます。
    • PERCENT-NEW は、タグ付きリビジョンに送信するトラフィックの割合に置き換えます。たとえば、10 を使用して、そのリビジョンにトラフィックの 10% を送信します。
    • REVISION-FORMER は、現在トラフィックを処理しているリビジョンの名前に置き換えます。
    • PERCENT-FORMER は、古いリビジョンに送信するトラフィックの割合に置き換えます。
  4. 次のコマンドを使用して、サービスを新しい構成に置き換えます。

    gcloud run services replace service.yaml
  5. 更新が完了するまで待ちます。完了すると、段階的ロールアウト対象の新しいリビジョンがすでにデプロイされ、設定した割合のトラフィックを処理しているというメッセージが表示されます。

Terraform

次のコードを .tf ファイルに追加します。

resource "google_cloud_run_v2_service" "default" {
  name     = "my-service"
  location = "us-central1"

  deletion_protection = false # set to true to prevent destruction of the resource

  template {}

  # Define the traffic split for each revision
  # https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/cloud_run_v2_service#traffic
  traffic {
    # Update revision to 50% traffic
    percent = 50
    # This revision needs to already exist
    revision = "green"
    type     = "TRAFFIC_TARGET_ALLOCATION_TYPE_REVISION"
  }

  traffic {
    # Update tag to 50% traffic
    percent = 50
    # This tag needs to already exist
    tag = "tag-name"
  }
}

必要であれば、数時間から数日の間、あるタグから別のタグに段階的に更新し、タグ付けされたリビジョンに必要な割合を増やします。

変更のたびに「terraform apply」と入力して適用します。

次のステップ