Cloud Run のリビジョン管理機能について試してみた

Cloud Run のリビジョン管理機能について試してみた

2026.06.22

はじめに

こんにちは。
クラウド事業本部コンサルティング部の渡邉です。

Cloud Run はサーバーレスでコンテナを実行できる Google Cloud のマネージドサービスです。Cloud Run はデプロイのたびにリビジョンが自動生成され、これを活用することでトラフィックを細かく制御した安全なリリースを実現することができます。

本記事では、Cloud Run のリビジョン管理機能である トラフィック分割を使った段階的ロールアウトタグ付きリビジョンを使ったテストロールバック について、ハンズオン形式でご紹介します。

Cloud Run のリビジョン管理とは

Cloud Run では、サービスをデプロイするたびにリビジョンが作成されます。リビジョンはコンテナイメージ・環境変数・スケーリング設定などを含むイミュータブルなスナップショットで、一度作成されると変更されません。

複数のリビジョンに対してトラフィックの割合を指定できるため、以下のようなユースケースに対応できます。

ユースケース 概要
段階的ロールアウト 新リビジョンに少量のトラフィックから徐々に流す
タグ付きリビジョンのテスト 専用URLで新リビジョンをテストしてから本番移行
ロールバック 問題発生時に旧リビジョンへ即座に切り戻す
A/Bテスト 複数リビジョンにトラフィックを分散して比較

主要機能の概要

段階的ロールアウト

段階的ロールアウトでは、新しいリビジョンを --no-traffic オプションでデプロイすると、コンテナのビルドとデプロイだけが行われ、本番トラフィックは旧リビジョンへ流れ続けます。その後 gcloud run services update-traffic コマンドでトラフィック割合を少しずつ増やすことで、問題が発生した際の影響範囲を最小化しながらリリースできます。また LATEST=10 オプションのように LATEST キーワードを使うと、「常に最新リビジョンへ 10% を流す」継続的なカナリア設定も可能です。

以下の図は、--no-trafficオプションで新リビジョンをデプロイし、トラフィックを段階的に移行するフローです。

タグ付きリビジョンによるテスト

リビジョンにタグを付与すると、https://TAG---SERVICE-HASH.a.run.app という形式の専用 URL が発行されます。この URL への通信はそのリビジョンだけで処理されるため、本番ユーザーへのトラフィックを一切変えずに本番環境で動作確認できます。タグはデプロイ時に --tag で付与する方法と、デプロイ済みのリビジョンに --update-tags で後から付与する方法(再デプロイ不要)の2通りがあります。

ロールバック

新リビジョンで問題が発生した場合、gcloud run services update-traffic --to-revisions REVISION=100 コマンドを実行するだけで特定リビジョンへ 100% のトラフィックを戻せます(ロールバック)。新しいコンテナイメージのビルドやデプロイは不要なため、数秒〜数十秒で切り戻しが完了します。なお、トラフィック変更は即時ではなく、切り替え中のリクエストはドロップされずに処理が完了します。

実際に試してみる

前提条件

  • Google Cloud プロジェクトが作成済みであること
  • gcloud CLI がインストール・認証済みであること
  • Cloud Run API が有効化されていること
  • roles/run.developer 相当の IAM 権限があること

ステップ1: サンプルサービスのデプロイ(v1)

まず、サンプルのコンテナイメージを使って最初のリビジョン(v1)をデプロイします。

# Cloud Run API を有効化
gcloud services enable run.googleapis.com \
  --project=YOUR_PROJECT_ID

# v1 としてサービスをデプロイ
gcloud run deploy my-app \
  --image us-docker.pkg.dev/cloudrun/container/hello \
  --region asia-northeast1 \
  --allow-unauthenticated \
  --project=YOUR_PROJECT_ID

Deploying container to Cloud Run service [my-app] in project [YOUR_PROJECT_ID] region [asia-northeast1]
 Deploying new service... Done.                                                                                             
 Creating Revision...                                                                                                     
 Routing traffic...                                                                                                       
 Setting IAM Policy...                                                                                                    
Done.                                                                                                                        
Service [my-app] revision [my-app-00001-4ch] has been deployed and is serving 100 percent of traffic.
Service URL: https://my-app-<PROJECT_NUMBER>.asia-northeast1.run.app

デプロイ後にリビジョン一覧を確認します。

gcloud run revisions list \
  --service my-app \
  --region asia-northeast1 \
  --project=YOUR_PROJECT_ID

   REVISION          ACTIVE  SERVICE  DEPLOYED                 DEPLOYED BY
  my-app-00001-4ch  yes     my-app   2026-06-22 02:38:04 UTC  your-email@example.com

v1リビジョンのデプロイ結果
v1リビジョンのデプロイ結果

ステップ2: 新しいリビジョンをトラフィックなしでデプロイ

--no-traffic フラグを使い、新リビジョン(v2)を本番トラフィックを受けない状態でデプロイします。--revision-suffix を指定すると、リビジョン名のサフィックスを人間が読みやすい文字列にできます。

gcloud run deploy my-app \
  --image us-docker.pkg.dev/cloudrun/container/hello \
  --region asia-northeast1 \
  --no-traffic \
  --revision-suffix v2 \
  --project=YOUR_PROJECT_ID

Deploying container to Cloud Run service [my-app] in project [YOUR_PROJECT_ID] region [asia-northeast1]
 Deploying... Done.                                                                                                         
 Creating Revision...                                                                                                     
 Routing traffic...                                                                                                       
Done.                                                                                                                        
Service [my-app] revision [my-app-v2] has been deployed and is serving 0 percent of traffic.

v2リビジョンをトラフィックなしでデプロイした結果
v2リビジョンをトラフィックなしでデプロイした結果

デプロイ後は v1 が 100% のトラフィックを継続して受けます。

# トラフィック状況を確認
gcloud run services describe my-app \
  --region asia-northeast1 \
  --project=YOUR_PROJECT_ID

 Service my-app in region asia-northeast1

URL:     https://my-app-<PROJECT_NUMBER>.asia-northeast1.run.app
Ingress: all
Traffic:
  100% my-app-00001-4ch

Scaling: Auto (Min: 0, Max: 100)

Last updated on 2026-06-22T02:41:19.689956Z by your-email@example.com:
  Revision my-app-v2
  Container None
    Image:           us-docker.pkg.dev/cloudrun/container/hello
    Port:            8080
    Memory:          512Mi
    CPU:             1000m
    Startup Probe:
      TCP every 240s
      Port:          8080
      Initial delay: 0s
      Timeout:       240s
      Failure threshold: 1
      Type:          Default
  Service account:   <PROJECT_NUMBER>-compute@developer.gserviceaccount.com
  Concurrency:       80
  Scaling:
    Max instances:   100
  Timeout:           300s

ステップ3: タグを付けてテスト用 URL を発行

タグを付与することで、本番トラフィックを受けずにリビジョンを専用 URL でテストできます。タグを付ける方法は2通りあります。

方法A: デプロイ時にタグを付与する

新リビジョンをデプロイする際に --tag を同時に指定します。

gcloud run deploy my-app \
  --image us-docker.pkg.dev/cloudrun/container/hello \
  --region asia-northeast1 \
  --no-traffic \
  --tag green \
  --project=YOUR_PROJECT_ID

Deploying container to Cloud Run service [my-app] in project [YOUR_PROJECT_ID] region [asia-northeast1]
 Deploying... Done.                                                                                                         
 Creating Revision...                                                                                                     
Done.                                                                                                                        
Service [my-app] revision [my-app-00003-hel] has been deployed and is serving 0 percent of traffic.
The revision can be reached directly at https://green---my-app-<HASH>.a.run.app

タグ付きリビジョンのデプロイと専用URL
タグ付きリビジョンのデプロイと専用URL

方法B: 既存リビジョンに後からタグを付与する(再デプロイ不要)

ステップ2 でデプロイ済みのリビジョンのように、すでに存在するリビジョンに --update-tags でタグを追加できます。新リビジョンをデプロイせずにタグだけを操作したい場合に便利です。

# 特定のリビジョンにタグを付与(REVISION-NAME を実際のリビジョン名に置き換える)
gcloud run services update-traffic my-app \
  --update-tags green=REVISION-NAME \
  --region asia-northeast1 \
  --project=YOUR_PROJECT_ID

 Updating traffic... Done.                                                                                                  
 Routing traffic...                                                                                                       
Done.                                                                                                                        
URL: https://my-app-<HASH>.a.run.app
Traffic:
  100% my-app-00001-4ch
  0%   my-app-v2
         green: https://green---my-app-<HASH>.a.run.app

既存リビジョンへのタグ付与結果
既存リビジョンへのタグ付与結果

タグが付いたリビジョンには以下の形式の専用 URL が発行されます。

https://green---my-app-<HASH>.a.run.app

この URL にアクセスすることで、本番トラフィックに影響を与えずに新リビジョンの動作を確認できます。

ステップ4: 段階的にトラフィックを移行

テストで問題がなければ、タグ付きリビジョンへ少量のトラフィックから移行を開始します。

# タグ付きリビジョン(green)に 10% のトラフィックを流す
gcloud run services update-traffic my-app \
  --to-tags green=10 \
  --region asia-northeast1 \
  --project=YOUR_PROJECT_ID

 Updating traffic... Done.                                                                                                  
 Routing traffic...                                                                                                       
Done.                                                                                                                        
URL: https://my-app-<HASH>.a.run.app
Traffic:
  90% my-app-00001-4ch
  10% my-app-v2
        green: https://green---my-app-<HASH>.a.run.app

トラフィックを10%移行した結果
トラフィックを10%移行した結果

モニタリングを行いながら徐々にトラフィックを増やします。

① 設定値の確認(gcloud run services describe

まず設定上のトラフィック割合が意図通りか確認します。

gcloud run services describe my-app \
  --region asia-northeast1 \
  --format="yaml(spec.traffic)" \
  --project=YOUR_PROJECT_ID

spec:
  traffic:
  - percent: 90
    revisionName: my-app-00001-4ch
  - percent: 10
    revisionName: my-app-v2
  - revisionName: my-app-v2
    tag: green

② 実際にアクセスして分布を確認(curl ループ + Cloud Logging)

設定値の確認だけでなく、実際にリクエストを送って分布を観測します。curl を繰り返しサービス URL に送信します。

# SERVICE_URL はデプロイ時に表示された URL に置き換える
SERVICE_URL="https://my-app-<PROJECT_NUMBER>.asia-northeast1.run.app/"

for i in $(seq 1 20); do
  curl -s -o /dev/null "$SERVICE_URL"
done

リクエスト送信後、Cloud Logging でどのリビジョンが何件処理したかを確認します。

gcloud logging read \
  'resource.type="cloud_run_revision" AND resource.labels.service_name="my-app"' \
  --project=YOUR_PROJECT_ID \
  --format="value(resource.labels.revision_name)" \
  --limit=20 | sort | uniq -c | sort -rn

    19 my-app-00001-4ch
    1 my-app-v2

10% 設定であれば 20 リクエスト中おおよそ 1~2 件が my-app-v2 で処理されているはずです。

ステップ5: ロールバック

問題が発生した場合は、旧リビジョンへ即座にロールバックします。

まず現在のリビジョン一覧を確認します。

gcloud run revisions list \
  --service my-app \
  --region asia-northeast1 \
  --project=YOUR_PROJECT_ID

   REVISION          ACTIVE  SERVICE  DEPLOYED                 DEPLOYED BY
  my-app-00003-hel          my-app   2026-06-22 02:44:14 UTC  your-email@example.com
  my-app-v2         yes     my-app   2026-06-22 02:41:18 UTC  your-email@example.com
  my-app-00001-4ch  yes     my-app   2026-06-22 02:38:04 UTC  your-email@example.com

旧リビジョン名を確認したら、そのリビジョンへ 100% のトラフィックを向けます。

# REVISION-NAME を旧リビジョン名に置き換える
gcloud run services update-traffic my-app \
  --to-revisions my-app-00001-4ch=100 \
  --region asia-northeast1 \
  --project=YOUR_PROJECT_ID

 Updating traffic... Done.                                                                                                  
 Routing traffic...                                                                                                       
Done.                                                                                                                        
URL: https://my-app-<HASH>.a.run.app
Traffic:
  100% my-app-00001-4ch
  0%   my-app-v2
         green: https://green---my-app-<HASH>.a.run.app

旧リビジョンへのロールバック結果
旧リビジョンへのロールバック結果

ロールバック後、不要になったリビジョンを削除することもできます。

# トラフィックが 0% のリビジョンを削除
gcloud run revisions delete my-app-v2 \
  --region asia-northeast1 \
  --project=YOUR_PROJECT_ID

不要リビジョンの削除
不要リビジョンの削除

まとめ

本記事では、Cloud Run のリビジョン管理機能である 段階的ロールアウトタグ付きリビジョンを使ったテストロールバック について、ハンズオン形式でご紹介しました。

--no-traffic フラグを使ってデプロイすることで、新しいリビジョンを本番環境に配置しながらトラフィックを旧リビジョンに流し続けることができます。その後 update-traffic コマンドで 10%・50% と段階的に割合を増やし、問題があれば --to-revisions REVISION=100 で旧リビジョンへ即座に切り戻せます。

タグ付きリビジョンを活用すると、本番トラフィックに影響を与えずに専用 URL で新バージョンを検証できます。デプロイ時の --tag による付与と、既存リビジョンへ --update-tags で後から付与する方法(再デプロイ不要)の2通りがあります。テスト後は --remove-tags でタグを削除しておきましょう。タグを削除してもリビジョン自体は削除されません。また、リビジョンレベルのミニマムインスタンスを設定している場合はタグ付きリビジョンも課金対象になるため、使い終わったタグは速やかに削除することを推奨します。

本記事で紹介した機能を組み合わせることで、本番環境での継続的デリバリーをより安全に進めることができます。ぜひ Cloud Run のリビジョン管理機能の活用を検討してみてはいかがでしょうか。

この記事が誰かの助けになれば幸いです。

以上、クラウド事業本部コンサルティング部の渡邉でした!

この記事をシェアする

関連記事