Cloud Run では、トラフィックを受信するリビジョンと、リビジョンが受信するトラフィックの割合を指定できます。この機能を使用すると、以前のリビジョンへのロールバック、リビジョンの段階的なデプロイ、複数のリビジョン間でのトラフィックの分割ができます。このページでは、この機能を使用して Cloud Run リビジョンへのトラフィックを管理する方法について説明します。
トラフィック ルーティングの調整はすぐに行われません。リビジョンのトラフィックを変更しても、処理中のすべてのリクエストは続行されます。処理中のリクエストは破棄されないため、移行期間中は新しいリビジョンまたは以前のリビジョンのどちらかに送信されます。
トラフィック分割とセッション アフィニティ
セッション アフィニティを有効にして複数のリビジョン間でトラフィックを分割する場合は、セッション アフィニティとトラフィック分割で、セッション アフィニティがトラフィック分割に与える影響を確認してください。
トラフィック分割のライフサイクル
複数のリビジョン間でトラフィックを分割した場合や、トラフィックを以前のリビジョンに割り当てた場合は、以降のすべてのデプロイでそのトラフィック分割パターンが使用されます。従来どおり、トラフィック分割を行わず、最新リビジョンのみを使用するようにするには、すべてのトラフィックを最新リビジョンに送信します。
必要なロール
Cloud Run のサービスとリビジョンを管理するために必要な権限を取得するには、次の IAM ロールを付与するよう管理者に依頼してください。
- コンテナ イメージからデプロイされたサービスを管理している場合:
- Cloud Run サービスに対する Cloud Run デベロッパー(
roles/run.developer
)ロール - サービス ID に対するサービス アカウント ユーザー(
roles/iam.serviceAccountUser
)ロール - サービスのコンテナ イメージの Artifact Registry リポジトリに対する Artifact Registry 読み取り(
roles/artifactregistry.reader
)(該当する場合)
- Cloud Run サービスに対する Cloud Run デベロッパー(
- ソースコードからデプロイされたサービスを管理している場合:
- プロジェクトに対する Cloud Run ソース デベロッパー(
roles/run.sourceDeveloper
) - プロジェクトの Service Usage ユーザー(
roles/serviceusage.serviceUsageConsumer
) - サービス ID に対するサービス アカウント ユーザー(
roles/iam.serviceAccountUser
)ロール - さらに、プロジェクトの Cloud Build サービス アカウントに Cloud Run ビルダー(
roles/run.builder
)ロールを付与します。構築サービス アカウントはサービスのビルディングを担当し、デフォルトでは Compute Engine のデフォルトのサービス アカウントになります。
- プロジェクトに対する Cloud Run ソース デベロッパー(
Cloud Run に関連付けられている IAM ロールと権限のリストについては、Cloud Run IAM ロールと Cloud Run IAM 権限をご覧ください。Cloud Run サービスがGoogle Cloud APIs(Cloud クライアント ライブラリなど)と連携している場合は、サービス ID の構成ガイドをご覧ください。ロールの付与の詳細については、デプロイ権限とアクセスの管理をご覧ください。
以前のリビジョンにロールバックする
以前のリビジョンにロールバックするには:
コンソール
Google Cloud コンソールで Cloud Run に移動します。
サービスリストでサービスを見つけてクリックします。
[リビジョン] タブをクリックして、そのサービスの現在のリビジョンのリストを表示します。
リビジョンのリストで、ロールバックしているリビジョンの右側にある省略記号アイコンをクリックします。
[トラフィックの管理] をクリックして、トラフィック管理フォームを表示します。
- プルダウン リストから、ロールバックする以前のリビジョンを選択します。
- 前のリビジョンのトラフィックの割合を 100 に設定します。
- 現在、配信されているリビジョンの割合を 0 に設定します。
- [保存] をクリックします。
gcloud
次のコマンドを使用します。
gcloud run services update-traffic SERVICE --to-revisions REVISION=100
- SERVICE は、サービスの名前に置き換えます。
- REVISION は、ロールバックするリビジョンの名前に置き換えます。
YAML
新しいサービスを作成する場合は、この手順をスキップします。既存のサービスを更新する場合は、その YAML 構成をダウンロードします。
gcloud run services describe SERVICE --format export > service.yaml
spec
属性の下にあるtraffic
属性を見つけて、次のように更新します。apiVersion: serving.knative.dev/v1 kind: Service metadata: name: SERVICE spec: ... traffic: - revisionName: REVISION percent: 100
次のように置き換えます。
- REVISION は、ロールバックするリビジョンの名前に置き換えます。
次のコマンドを使用して、サービスを新しい構成に置き換えます。
gcloud run services replace service.yaml
更新が完了するまで待ちます。完了すると、ロールバック元のリビジョンがすでにデプロイされてトラフィックの
0
% を処理しているというメッセージが表示されます。
Terraform
Terraform 構成を適用または削除する方法については、基本的な Terraform コマンドをご覧ください。
次のコードを .tf
ファイルに追加します。
リビジョンの段階的ロールアウト
新しいリビジョンを段階的にロールアウトするには:
コンソール
Google Cloud コンソールで Cloud Run に移動します。
サービスリストでサービスを選択します。
[新しいリビジョンをデプロイする] をクリックします。
必要に応じてデプロイ フォームに記入します。[このリビジョンをすぐに利用する] のチェックボックスは必ずオフにしてください。
[デプロイ] をクリックします。
[トラフィックを管理] をクリックします。
新しいリビジョンが一覧表示されますが、割合は 0 に設定され、現在はトラフィックが処理されていないことを示します。フォームで次の操作を行います。
- 目的の割合(たとえば 5 )に設定します。現在配信中のバージョンの割合は、自動的に同じ値が減少します。
- [保存] をクリックします。
- これらの [トラフィックの管理] 手順を繰り返します。割合を変更する場合は、新しいリビジョンに必要な割合を増やします。トラフィックの割合を変更するために再デプロイする必要はありません。
gcloud
コンテナ イメージからサービスをデプロイするには:
段階的にロールアウトするリビジョンをデプロイします。初期設定では、トラフィックを受信しません。
ソースコードからサービスをデプロイするには:
gcloud run deploy --image IMAGE --no-traffic
IMAGE は、デプロイするイメージに置き換えます。
ソースコードからサービスをデプロイするには:
gcloud run deploy SERVICE --source . --no-traffic
SERVICE は、実際のサービス名に置き換えます。
新しいリビジョンで処理するトラフィックの割合(例: 5%)を指定します。
gcloud run services update-traffic SERVICE --to-revisions REVISION=PERCENTAGE
- SERVICE は、サービスの名前に置き換えます。
- REVISION は、段階的にロールアウトするリビジョンの名前に置き換えます。最新のリビジョンを指定するには、
LATEST
を使用します(たとえば、LATEST=5
)。 - PERCENTAGE は、新しいリビジョンに送信するトラフィックの割合に置き換えます。たとえば、
5
ではトラフィックの 5% が送信されます。
リビジョンのパフォーマンスが十分な場合は、上記の
update-traffic
ステップを繰り返しますが、必要に応じて割合の値を増やします。
YAML
新しいサービスを作成する場合は、この手順をスキップします。既存のサービスを更新する場合は、その YAML 構成をダウンロードします。
gcloud run services describe SERVICE --format export > service.yaml
サービスに必要な構成の変更を行い、新しいリビジョンのリビジョン名を指定します。
apiVersion: serving.knative.dev/v1 kind: Service metadata: name: SERVICE spec: template: metadata: annotations: ... name: REVISION-NAME
次のように置き換えます。
- REVISION-NAME は、新しいリビジョンに付ける名前に置き換えます。
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 は、古いリビジョンに送信するトラフィックの割合に置き換えます。
更新が完了するまで待ちます。完了すると、段階的ロールアウト対象の新しいリビジョンがすでにデプロイされ、設定した割合のトラフィックを処理しているというメッセージが表示されます。
Terraform
次のコードを .tf
ファイルに追加し、前のリビジョンから最新のリビジョンにトラフィックの割合を段階的に更新します。トラフィックが変更されるたびに、別の terraform apply
の実行が必要になることに注意してください。
「terraform apply
」と入力して変更を適用します。
複数のリビジョン間でトラフィックを分割する
2 つ以上のリビジョン間でトラフィックを分割するには:
コンソール
Google Cloud コンソールで Cloud Run に移動します。
サービスリストでサービスを見つけてクリックします。
[トラフィックを管理] をクリックします。
現在、配信されている新しいリビジョンが一覧表示されます。フォームで次の操作を行います。
- 現在、配信されているリビジョンの割合を目的の値に分割します。
- プルダウン リストを使用して以前のリビジョンの 1 つを選択し、割合を目的の分割に設定します。
- 他のリビジョン間でトラフィックを分割するには、[リビジョンを追加] をクリックして目的のリビジョンを選択し、割合を目的の分割に設定します。
- [保存] をクリックします。
gcloud
各リビジョンのリビジョンとトラフィックの割合をカンマ区切りリストで指定します。
gcloud run services update-traffic SERVICE --to-revisions LIST
- SERVICE は、サービスの名前に置き換えます。
- LIST は、リビジョンと割合のカンマ区切りのリストに置き換えます。
REVISION1=PERCENTAGE1、REVISION2=PERCENTAGE2、REVISIONn=PERCENTAGEx
(例:hello2-00005-red=25,hello2-00001-bod=25,hello2-00002-nan=50
)
YAML
新しいサービスを作成する場合は、この手順をスキップします。既存のサービスを更新する場合は、その YAML 構成をダウンロードします。
gcloud run services describe SERVICE --format export > service.yaml
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-A、REVISION-B、REVISION-C は、トラフィックを割り当てるリビジョンに置き換えます。
- PERCENT-A、PERCENT-B、PERCENT-C は、対応するリビジョンに送信するトラフィックの割合に置き換えます。
次のコマンドを使用して、サービスを新しい構成に置き換えます。
gcloud run services replace service.yaml
更新が完了するまで待ちます。完了すると、段階的ロールアウト対象の新しいリビジョンがすでにデプロイされ、トラフィックの
5
% (または設定した値)を処理しているというメッセージが表示されます。
Terraform
次のコードを .tf
ファイルに追加します。
「terraform apply
」と入力して変更を適用します。
すべてのトラフィックを最新のリビジョンに送信する
新しいリビジョンをデプロイすると、このリビジョンを作成でき、将来のすべてのリビジョンがトラフィックの 100% をできるだけ早く処理し、確立されたトラフィック分割を上書きします。
コンソール
Google Cloud コンソールで Cloud Run に移動します。
サービスリストでサービスを見つけてクリックします。
[新しいリビジョンをデプロイする] をクリックします。
必要に応じてデプロイ フォームに記入します。[このリビジョンをすぐに利用する] のチェックボックスは必ずオンにしてください。これにより、既存のトラフィック分割が上書きされ、新しいリビジョンがトラフィックの 100% を処理します。
[デプロイ] をクリックします。
gcloud
すべてのトラフィックを最近デプロイされたリビジョンに送信するには:
gcloud run services update-traffic SERVICE --to-latest
SERVICE は、サービスの名前に置き換えます。
YAML
新しいサービスを作成する場合は、この手順をスキップします。既存のサービスを更新する場合は、その YAML 構成をダウンロードします。
gcloud run services describe SERVICE --format export > service.yaml
spec
属性の下にあるtraffic
属性を見つけて、次のように更新します。apiVersion: serving.knative.dev/v1 kind: Service metadata: name: SERVICE spec: ... traffic: - latestRevision: true percent: 100
次のコマンドを使用して、サービスを新しい構成に置き換えます。
gcloud run services replace service.yaml
更新が完了するまで待機します。完了すると、(最新の)リビジョンがすでにデプロイされ、トラフィックの
100
% を処理しているというメッセージが表示されます。
Terraform
次のコードを .tf
ファイルに追加します。
「terraform apply
」と入力して変更を適用します。
テスト、トラフィックの移行、ロールバックにタグを使用する
タグ付きのリビジョンに課金されないようにするには、service-level の最小インスタンスを使用するか、不要になったリビジョンのタグを削除します。
この機能の一般的な使用例は、新しいサービス リビジョンをトラフィックの処理前にテストして確認することです。一般的なシーケンスは次のとおりです。
- 開発中にコンテナで統合テストを行います。
- ステージングにのみ使用する Google Cloud プロジェクトにコンテナをデプロイし、トラフィックを処理せずに、タグ付きリビジョンをテストします。
- トラフィックを処理せずに本番環境にデプロイし、本番環境でタグ付けされたリビジョンに対してテストします。
- タグ付きリビジョンにトラフィックを移行します。
新しいタグ付きリビジョンをデプロイする
既存のサービスの新しいリビジョンを本番環境にデプロイするには:
gcloud
コンテナ イメージから新しいタグ付きリビジョンをデプロイするには:
gcloud run deploy myservice --image IMAGE_URL --no-traffic --tag TAG_NAME
次のように置き換えます。
- IMAGE_URL は、イメージの URL に置き換えます。
- TAG_NAME は、小文字のタグ名に置き換えます。
ソースコードからサービスをデプロイするには:
gcloud run deploy myservice --source . --no-traffic --tag TAG_NAME
TAG_NAME は、小文字のタグ名に置き換えます。
このタグを使用すると、トラフィックを処理することなく、特定の URL で新しいリビジョンを直接テストできます。URL は指定したタグ名で始まります。たとえば、サービス myservice
でタグ名 green
を使用した場合、URL https://green---myservice-abcdef.a.run.app
でタグ付きリビジョンのテストを行います。
Terraform
.tf
ファイルに以下を追加します。新しいタグを使用して、古いリビジョンから最新のリビジョンへのトラフィックの割合を段階的に更新します。トラフィックが変更されるたびに、別の terraform apply
の実行が必要になることに注意してください。
「terraform apply
」と入力して変更を適用します。
タグを削除する
リビジョンからタグを削除するには:
コンソール
Google Cloud コンソールで Cloud Run に移動します。
サービスリストでサービスを選択します。
目的のサービスの [リビジョン] セクションに移動し、既存のタグを削除するリビジョンを選択します。
[リビジョンの URL(タグ)] 列にカーソルを合わせ、鉛筆アイコンをクリックします。
[リビジョンの URL] ダイアログ メニューで、ゴミ箱のアイコンをクリックして、リビジョンで使用されている現在のタグを削除します。
[保存] をクリックします。
gcloud
リビジョンのタグを削除するには:
gcloud run services update-traffic SERVICE --remove-tags TAG_NAME
次のように置き換えます。
- TAG_NAME は、トラフィックの移行先のタグの名前で置き換えます。
- SERVICE は、タグを削除するサービスの名前で置き換えます。
YAML
新しいサービスを作成する場合は、この手順をスキップします。既存のサービスを更新する場合は、その YAML 構成をダウンロードします。
gcloud run services describe SERVICE --format export > service.yaml
必要に応じてサービスの構成を変更します。
spec
属性の下で、タグ付きリビジョンのtag
属性を見つけて削除します。apiVersion: serving.knative.dev/v1 kind: Service metadata: name: SERVICE spec: ... traffic: - revisionName: REVISION tag: TAG_NAME percent: PERCENT-NEW
次のコマンドを使用して、サービスを新しい構成に置き換えます。
gcloud run services replace service.yaml
Terraform
次のコードを .tf
ファイルに追加します。
「terraform apply
」と入力して変更を適用します。
トラフィックをタグ付きリビジョンに移行する
新しいリビジョンが適切に機能していることを確認したら、 Google Cloud コンソール、gcloud コマンドライン、Terraform、または YAML ファイルを使用して、トラフィックの移行を開始できます。
コンソール
Google Cloud コンソールで Cloud Run に移動します。
サービスリストでサービスを見つけてクリックします。
トラフィックの送信先となるタグ付きリビジョンを選択します。
[トラフィックを管理] をクリックします。
タグ付けされているリビジョン名を見つけます。割合は 0 に設定されています。これは、現在トラフィックが処理されていないことを示します。トラフィックの管理* フォームの場合:
- 目的の割合(たとえば 5 )に設定します。現在配信中のバージョンの割合は、自動的に同じ値が減少します。
- [保存] をクリックします。
- 必要に応じて、このトラフィックの管理手順を数時間または数日繰り返します。ただし、割合を変更した場合は、必要に応じてタグ付けされたリビジョンに割合を増やします。トラフィックの割合を変更するために再デプロイする必要はありません。
gcloud
トラフィックを特定のリビジョンタグに移行するには:
gcloud run services update-traffic myservice --to-tags TAG_NAME=TRAFFIC_PERCENT
次のように置き換えます。
- TAG_NAME は、トラフィックの移行先のタグの名前で置き換えます。
- TRAFFIC_PERCENT は、タグ付きリビジョンで処理するトラフィックの割合で置き換えます(たとえば、
1
)。
YAML
新しいサービスを作成する場合は、この手順をスキップします。既存のサービスを更新する場合は、その YAML 構成をダウンロードします。
gcloud run services describe SERVICE --format export > service.yaml
必要に応じてサービスの構成を変更します。
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 は、古いリビジョンに送信するトラフィックの割合に置き換えます。
次のコマンドを使用して、サービスを新しい構成に置き換えます。
gcloud run services replace service.yaml
更新が完了するまで待ちます。完了すると、段階的ロールアウト対象の新しいリビジョンがすでにデプロイされ、設定した割合のトラフィックを処理しているというメッセージが表示されます。
Terraform
次のコードを .tf
ファイルに追加します。
必要であれば、あるタグから別のタグに段階的に、数時間から数日をかけて更新し、タグ付けされたリビジョンに必要なだけ割合を増やします。
変更のたびに「terraform apply
」と入力して適用します。