Blue/Green と Canary デプロイの使い分け、トラフィックシフトの仕組み、監視すべき指標、そして安全なリリースのための実践的なロールアウト/ロールバック手順を解説します。

新しいコードを出すのは本質的にリスクがあります。理由は単純で、実際のユーザーが当たるまで本当の挙動がわからないからです。Blue/Green と Canary は、ダウンタイムをほぼゼロに保ちながらそのリスクを抑えるための一般的な手法です。
Blue/Green デプロイは、別々の似た環境を2つ用意します:
Green 環境をバックグラウンドで準備し(ビルドをデプロイしてチェックを実行し、ウォームアップする)、確信が持てたら Blue から Green へトラフィックを切り替えます。何か問題があれば素早く戻せます。
重要なのは「色が二つあること」ではなく、クリーンで可逆的な切り替えができることです。
カナリアリリースは段階的なロールアウトです。全員を一度に切り替えるのではなく、まずはごく一部(例:1〜5%)のユーザーに新しいバージョンを送ります。問題がなければ段階的に拡大し、最終的に100%にします。
重要なのは、本番トラフィックから学習してから完全移行することです。
どちらの手法も次を目指します:
実現方法は異なり、Blue/Green は環境間の高速な切替に、Canary はトラフィックシフトによる制御された露出に重点を置きます。
どちらが自動的に優れているということはありません。選択はプロダクトの使われ方、テストの自信度、迅速にフィードバックが必要か、避けたい障害の種類などによります。
多くのチームは両者を組み合わせます。インフラ的には Blue/Green を使い、ユーザー露出は Canary 的に制御するなどです。
次のセクションでは両者を比較し、それぞれが向く場面を示します。
Blue/Green と Canary はどちらもユーザーを中断させずに変更を出す方法ですが、どのようにトラフィックを新しいバージョンへ移すかが異なります。
Blue/Greenは完全な2つの環境("Blue":現行、"Green":新)を走らせ、Green を検証後に一度に全トラフィックを切り替えるイメージです。
Canaryはまずごく一部(例:1–5%)に新バージョンを出し、実世界のパフォーマンスを見ながら段階的にトラフィックを移すやり方です。
| 要素 | Blue/Green | Canary |
|---|---|---|
| スピード | 検証後の切替は非常に高速 | 段階的なので意図的に遅い |
| リスク | 中程度:切り替え後に問題だと全員に影響 | 低い:完全展開前に問題が露見することが多い |
| 複雑さ | 中程度(環境が二つある、クリーンな切替が必要) | 高い(トラフィック分割、解析、段階制御が必要) |
| コスト | 高め(展開時に容量がほぼ倍になる) | 多くは低め(既存容量で段階的に増やせる) |
| 向き | 大規模で調整が必要な変更 | 頻繁に小さな改善を出す場合 |
大きな変更、マイグレーション、旧バージョンと新バージョンを明確に分けたい場合は Blue/Green を選びます。
頻繁にデプロイし、実際の利用から安全に学びたい・影響範囲を小さくしたい場合は Canary が向きます。
迷うならまず Blue/Green で運用の簡潔さを確立し、監視とロールバックの習慣が固まったら高リスクサービスに対して Canary を導入しましょう。
Blue/Green はリリースを“スイッチ一つ”の感覚にしたい場合に有効です。2つの本番に近い環境(Blue:現行、Green:新)を用意し、Green を検証後にルーティングします。
チェックアウト、予約、ログインダッシュボードなど、明確なメンテナンス表示が許されないプロダクトでは、Blue/Green が有効です。新バージョンはユーザーに送る前に起動・ウォームアップ・チェックを済ませられます。
ロールバックは多くの場合トラフィックを Blue に戻すだけで済みます。これが価値を発揮するのは:
ロールバックが再ビルドや再デプロイを必要としない点が最大の利点です。
Blue/Green はデータベースのマイグレーションが後方互換であると簡単です。短期間 Blue と Green が共存する可能性があるため、両方で読み書きできる状態が理想です。
適合しやすいパターン:
適さないリスクの高い変更:カラムの削除、フィールド名の変更、意味の変化など。そうした変更は "元に戻す" 約束を破るので、段階的なマイグレーションを計画する必要があります。
Blue/Green は追加キャパシティ(二重のスタック)とトラフィック制御手段(ロードバランサ、Ingress、プラットフォームのルーティング)が必要です。環境の自動化やクリーンなルーティング手段があれば、Blue/Green は高信頼で低ドラマのリリース手段になります。
カナリアリリースは変更をまず一部の実ユーザーに当て、学習してから拡大する手法です。大規模トラフィックかつ明確な指標があり、段階的導入でリスクを減らしたい場合に向いています。
Canary は高トラフィックアプリと相性が良いです。1–5% のトラフィックでも十分なデータが短時間で得られることが多く、エラー率やレイテンシ、コンバージョンなど明確なメトリクスで検証できます。
本番負荷でしか現れない問題(DB クエリの遅さ、キャッシュミス、地域ごとの遅延、稀なデバイス挙動など)があります。Canary なら全ユーザーに広げる前に性能悪化やエラー増加がないか確認できます。
頻繁にリリースがあり、複数チームが寄与する場合、あるいは UI の微調整や価格実験など段階導入可能な変更は Canary が自然に合います(1% → 10% → 50% → 100%)。
カナリアは機能フラグと非常に相性が良いです。コードを安全にデプロイし、機能は一部のユーザーや地域、アカウントに対して有効化できます。ロールバックはフラグをオフにするだけで済む場合もあり、再デプロイが不要です。
プログレッシブデリバリーを目指すなら、Canary は柔軟な出発点になります。
See also: /blog/feature-flags-and-progressive-delivery
トラフィックシフトとは、新しいバージョンを誰にいつ渡すかを制御することです。全員を一度に切り替える代わりに、リクエストを段階的(または選択的)に古いバージョンから新しいバージョンに移します。これは Blue/Green と Canary の実務的な核心であり、ゼロダウンタイムデプロイを現実的にします。
スタックのどの地点でトラフィックを制御するかは複数あります。選択は既存の構成とどの程度細かく制御したいかに依存します。
すべてのレイヤーが必要なわけではありません。ルーティング決定の“単一の真実のソース”を決め、リリース管理が推測にならないようにします。
多くのチームは次のどれか(または混合)を使います:
割合ベースが説明は簡単ですが、コホートは誰に見せるかを制御できるため安全なことが多いです(最初の数時間で重要顧客を驚かせないなど)。
計画が堅牢でも、次の2点で躓くことが多いです。
スティッキーセッション(セッションアフィニティ)。ユーザーを特定のサーバ/バージョンに紐づけていると、10% の分割が実際には 10% の挙動を示さないことがあります。セッション中にバージョンを行き来すると混乱する不具合も起きます。共有セッションストアを使う、あるいはルーティングでユーザーを一貫して同じバージョンに保つなど対策が必要です。
キャッシュのウォームアップ。新バージョンは CDN やアプリのキャッシュ、DB クエリキャッシュがコールドになりがちです。これはコード自体の問題でなく性能低下に見えることがあります。高トラフィックページや高コストなエンドポイントは、トラフィックを増やす前にウォームアップを計画しましょう。
ルーティング変更は単なるボタン操作ではなく、本番変更と同じ扱いにしてください。
文書化すること:
このガバナンスがないと、「ちょっと 50% にしてみよう」と無邪気にやられている間に、検証がまだ終わっていない事態を招くことがあります。
ロールアウトは「デプロイが成功したか?」だけでなく「実ユーザーの体験が悪化していないか?」を確かめることです。Blue/Green や Canary 中に落ち着いていられる方法は、システムが健全で、変更が顧客を害していないかを示す少数のシグナルを見ることです。
エラー率:HTTP 5xx、リクエスト失敗、タイムアウト、依存サービスのエラー(DB、決済、サードパーティ)を追跡します。小さなエラー増加でもサポート負荷を生むことがあります。
レイテンシ:p50 と p95(p99 が取れるならそれも)を監視します。平均が安定でも長尾の遅延はユーザーに響きます。
飽和:CPU、メモリ、ディスク IO、DB コネクション、キュー深度、スレッドプールなどシステムの“満杯度”。飽和は大規模障害の前に現れることが多いです。
ユーザー影響シグナル:チェックアウト失敗、サインイン成功率、検索結果返却、アプリのクラッシュ率、主要ページの読み込み時間など、実際にユーザーが経験する問題を測ります。これらはインフラ指標よりも意味があることが多いです。
ワン画面に収まる小さなダッシュボードを作り、それをリリースチャネルで共有します。ロールアウトごとに一貫したダッシュボードにしておくと、グラフ探しで時間を浪費しません。
含める項目:
Canary の場合はバージョン/インスタンス群ごとに分割して比較できるようにし、Blue/Green の場合は切替ウィンドウで新旧を比較できるようにします。
トラフィックを動かす前にルールを決めておきます。例:
数値はサービスによって異なりますが、合意が重要です。全員がトリガーとロールバック計画を知っていれば、顧客が影響を受けている間に議論する必要はありません。
ロールアウト中に特化した(または一時的に厳しくした)アラートを追加します:
アラートは実行可能であること(何が変わったか・どこか・次に何をするか)を重視します。ノイズが多いアラートは、本当に重要なシグナルを見逃す原因になります。
多くのロールアウト失敗は大きなバグではなく、小さな不整合(設定値の欠落、マイグレーションの失敗、期限切れ証明書、統合の違い)によるものです。プレリリースチェックは被害範囲が小さいうちにそれらを発見するチャンスです。
トラフィックを動かす前に(Blue/Green の切替でも Canary の最初の段階でも)新バージョンが基本的に生きているか確認します。
ユニットテストは有用ですが、デプロイされたシステム自体が動くことを証明しません。数分で終わる短い自動化されたエンドツーエンドテストを新環境で走らせます。
サービス間を横断するフロー(Web → API → DB → サードパーティ)に焦点を当て、重要な統合ごとに少なくとも1回の"実際の"リクエストを含めます。
自動テストで見落としがちな点を防ぐために、コアワークフローをターゲットにした手動または半自動の検証も行います:
複数ロール(管理者 vs カスタマー)があるなら、各ロールの代表的な流れを確認します。
チェックリストは暗黙知を繰り返し可能な手順に変えます。短く実行可能に保ちます:
これらが日常化すれば、トラフィックシフトは制御された一手順になります。
Blue/Green ロールアウトはチェックリストに従うと簡単に回せます:準備、デプロイ、検証、切替、観察、クリーンアップ。
新バージョンを Green 環境にデプロイし、その間 Blue は現行のままトラフィックを捌きます。設定やシークレットは揃えて Green がミラーとなるようにします。
高速で信号性の高いチェックを行います:アプリが正常に起動するか、主要ページが表示されるか、決済/ログインが動くか、ログに異常がないか。自動スモークテストがあれば今実行します。Green 用の監視ダッシュボードやアラートが有効かもここで確認します。
データベース変更は注意が必要です。拡張(expand)→縮約(contract) アプローチを使います:
これにより「Green は動くが Blue に戻せない」状況を避けます。
切替前に重要なキャッシュ(ホームページやよく使われるクエリ)をウォームアップして、ユーザーにコールドスタートの負担をかけないようにします。
バックグラウンドジョブや cron については、切替中に二重実行を避けるため:
ロードバランサ/DNS/Ingress を用いて Blue から Green にルーティングを切替えます。短いウィンドウでエラー率、レイテンシ、ビジネスメトリクスを監視します。
実ユーザー観点でスポットチェックを行い、しばらく Blue をフォールバック用に残します。安定を確認したら Blue のジョブを停止し、ログをアーカイブし、コストと混乱を減らすために Blue を削除します。
Canary の要点は安全に学ぶことです。全員に一斉に出すのではなく、実ユーザーのごく一部に露出して監視し、証拠に基づいて段階的に拡大します。目的は「ゆっくり出す」ことではなく「各段階で安全を証明する」ことです。
新バージョンを安定版と並べてデプロイします。各々にトラフィック割合を割り当てられることと、両方が監視で見えること(別ダッシュボードやタグがあると便利)を確認します。
ごく小さく開始します。ここで早く明らかになるのは壊れたエンドポイント、設定漏れ、DB マイグレーションの不整合、予期しない遅延スパイクなどです。
ステージ中に残すメモ:
最初が問題なければ約 25% に増やします。より多様なユーザ行動や長尾のデバイス、競合が見えてきます。
半分トラフィックでスケーリングや性能の限界が見えやすくなります。ここで警告サインが現れることが多いです。
指標が安定しユーザー影響が許容範囲であれば全トラフィックを新バージョンへ移し、プロモート完了とします。
待ち時間はリスクとトラフィック量に依存します:
また、ビジネスの時間帯(ランチタイムや週末、課金タイミング)も考慮して、問題が起きやすい条件をカバーする長さにします。
手動だとためらいや不整合が出ます。可能なら自動化しましょう:
自動化は人の判断をなくすものではなく、遅延を取り除くものです。
各段階ごとに次を記録します:
これらの記録はロールアウト履歴を次回のプレイブックに変え、将来のインシデント診断を容易にします。
ロールバックは『何が"まずい"か』と『誰がボタンを押すか』を事前に決めておくと最も簡単です。ロールバック計画は悲観的ではなく、小さな問題を長期障害にしないための手段です。
議論を回避するため、短いリストで測定可能なトリガーを決めます。一般的なもの:
トリガーは測定可能に(例:「p95 > 800ms が 10 分間続く」)し、オンコールやリリースマネージャなど実行権限のある担当者に紐づけます。
スピードが重要です。ロールバックは次のいずれかであるべきです:
最初の手段は「マニュアル修正して続行」ではなく、まず安定化→その後調査にします。
Canary では一部のユーザーが新バージョンでデータを作る場合があります。事前に決めておく事項:
安定したら短い事後報告を残します:何がロールバックを引き起こしたか、欠けていたシグナル、チェックリストに加えること。これは責める場ではなく、リリースプロセスの改善サイクルです。
機能フラグは デプロイ(コードを本番に出す) と リリース(ユーザーに公開する) を切り離します。これは大きな利点で、同じデプロイパイプライン(Blue/Green や Canary)を使いながら露出をスイッチで制御できます。
フラグを使えば、機能がまだ全員向けでなくてもマージしてデプロイできます。コードは存在するが無効化された状態で、本番に置けます。確信が持てたら段階的にフラグを有効化し、問題があれば素早く無効化できます。
プログレッシブデリバリーはアクセスを段階的に増やすことです。フラグは次の対象に有効化できます:
Canary で新バージョンが健全でも、機能リスクを個別に管理したいときに特に有効です。
機能フラグは強力ですが、管理がないと問題になります。簡潔なガードレール:
実務ルール:誰かが「これをオフにしたら何が起きる?」に答えられないなら、そのフラグは準備不足です。
より深いガイダンスは /blog/feature-flags-release-strategy を参照してください。
Blue/Green と Canary の選択は“どちらが優れているか”ではなく、どのリスクを制御したいか、そして現在のチームとツールで現実的に運用できるかで決まります。
クリーンで予測可能な切替と「元に戻す」ボタンが最優先なら、Blue/Green が通常簡単に合います。
影響範囲を小さくし実ユーザーから学びたいなら、Canary が安全です(特に変更頻度が高くテストで全て検証しにくい場合)。
実務的なルール:深夜2時に運用できる方法を選ぶこと。継続的に実行できることが何より重要です。
1つのサービス(またはユーザー向けワークフロー)を選び、数回のリリースでパイロットを行います。重要だがあまりにもクリティカルでない対象が良いです。目的はトラフィックシフト、監視、ロールバックの筋力トレーニングを積むことです。
1ページ程度で十分です:
所有権を明確にしないと、戦略は単なる提案に終わります。
新しいプラットフォームを入れる前に、既に使っているツール(ロードバランサ設定、デプロイスクリプト、既存の監視、インシデントプロセス)で何ができるか見てください。パイロットで感じた摩擦を解消する場合にのみ新しいツール導入を検討します。
もしサービスを迅速に作ってデプロイする必要があるなら、アプリ生成とデプロイ制御を組み合わせたプラットフォームが運用負荷を下げることがあります。例えば、Koder.ai はチャットインターフェースからウェブ/バックエンド/モバイルアプリを生成し、リリースの安全機能(スナップショットとロールバック)、カスタムドメイン、ソースコードのエクスポートをサポートしてホストできるプラットフォームです。これらの機能はこの記事の核心—リリースを再現可能に、可観測に、可逆にする—に合致します。
実装オプションと対応ワークフローを確認するには /pricing と /docs/deployments を見てください。次に最初のパイロットリリースをスケジュールし、何がうまくいったかを記録してランブックを毎回改善しましょう。