カナリアリリース

英語名 Canary Release
読み方 カナリア リリース
難易度
所要時間 構築に1〜2週間
提唱者 炭鉱のカナリア(有毒ガス検知)に由来
目次

ひとことで言うと
#

新バージョンを全ユーザーの数%にだけ先行リリースし、問題がないことを確認しながら段階的に展開範囲を広げていく手法。炭鉱のカナリアが有毒ガスを先に検知するように、少数のユーザーで問題を早期発見する。

押さえておきたい用語
#

押さえておきたい用語
カナリアグループ
新バージョンを最初に受け取る少数のユーザー群。社内ユーザーやベータテスターを含めることが多い。
重み付けルーティング
ロードバランサーやIngressでトラフィックの割合を指定して振り分ける仕組み。例: 新版5%、旧版95%。
ベースライン比較
カナリアのメトリクスを同じ期間の旧バージョンのメトリクスと統計的に比較する手法。Kayenta等のツールで自動化できる。
爆風半径(Blast Radius)
問題が発生した場合に影響を受けるユーザーの範囲。カナリアリリースはこれを最小化する。
段階的展開(Progressive Delivery)
5%→25%→50%→100%のように、確認しながら少しずつ展開範囲を広げるリリース手法の総称。

カナリアリリースの全体像
#

対象選定→部分デプロイ→メトリクス比較→段階的展開の4ステップ
対象選定カナリアグループを定義し、最初は1〜5%から開始部分デプロイ新旧バージョンが同時に本番で動く重み付けルーティングメトリクス比較エラー率・レイテンシビジネス指標を新旧で定量比較段階的展開5%→25%→50%→100%各段階で確認し問題時は即ロールバック少数で試して確認し問題なければ広げる
カナリアリリースの進め方フロー
1
対象選定
カナリアグループを定義
2
部分デプロイ
トラフィックの数%に展開
3
メトリクス比較
データでGo/No-Go判断
4
段階的展開
確認しながら100%へ拡大

こんな悩みに効く
#

  • 新機能のリリースが怖く、リリース頻度を上げられない
  • 本番環境で初めて発覚する問題を事前にキャッチしたい
  • 全ユーザーに影響が出る前に問題を検知する仕組みが欲しい

基本の使い方
#

ステップ1: カナリアの対象ユーザーを決める

新バージョンを最初に受け取るカナリアグループを定義する。

  • トラフィックの1〜5%から開始するのが一般的
  • 社内ユーザーやベータテスターを優先的に含める
  • ユーザー属性(地域、プランなど)でセグメントすることも可能

ポイント: 最初のカナリアグループは小さく。影響範囲を最小限にする。

ステップ2: 新バージョンをカナリア環境にデプロイする

本番環境の一部に新バージョンを展開する。

  • ロードバランサーで重み付けルーティングを設定(例: 新版5%、旧版95%)
  • カナリア環境と本番環境は同じインフラ上で動作する
  • デプロイ自体は自動化パイプラインで実行する

ポイント: ブルーグリーンと違い、2つのバージョンが同時に本番で動く。

ステップ3: メトリクスを比較・監視する

カナリアと本番のメトリクスを比較して問題がないか判断する。

  • エラー率、レイテンシ、CPU/メモリ使用率を比較
  • ビジネスメトリクス(コンバージョン率など)も確認
  • 自動判定の仕組み(Kayenta等)を導入すると効率的

ポイント: 「数字で判断する」こと。感覚ではなくデータでGo/No-Goを決める。

ステップ4: 段階的に展開範囲を拡大する

問題がなければカナリアの割合を段階的に増やす

  • 5% → 25% → 50% → 100% のように段階的に拡大
  • 各段階で一定期間(数時間〜1日)メトリクスを観察する
  • 問題が発生したらカナリアの割合を0%に戻す(ロールバック)

ポイント: 各段階で「止まって確認する」時間を必ず取る。

具体例
#

例1:モバイルアプリのAPI変更をカナリアリリースで20時間かけて安全に展開する

状況: APIのレスポンス形式を変更するリリース。MAU 10万人のモバイルアプリ。全ユーザーに一斉展開すると、万一の不具合で大きな影響。

ステップ1: 社内ドッグフーディングユーザー50名+ベータプログラム参加者200名をカナリアグループに設定。

ステップ2: Kubernetes の Ingress で重み付けルーティング。新版3%のトラフィック。

ステップ3: Datadog で新旧のエラー率・p99レイテンシをダッシュボードで並べて監視。2時間経過、エラー率に差なし。

ステップ4: 3%→10%→30%→50%→100% と各段階4時間ずつ観察。

結果: 30%段階で特定のAndroid端末(OS 12以下)でレイテンシが200ms→800msに増加を検知。カナリアを10%に戻し、修正後に再展開。全ユーザーへの影響を回避できた。

例2:決済基盤の刷新をカナリアリリースで段階的に展開し、障害ゼロで完了する

状況: 決済プロバイダーの切り替え(旧Stripe→新Adyen)。月間処理額8億円。一斉切り替えは事業リスクが高すぎる。

カナリア戦略:

  1. 新規登録ユーザーの5%のみ新プロバイダーで決済(既存ユーザーは旧のまま)
  2. 決済成功率・チャージバック率・処理時間を1週間モニタリング
  3. 問題なしを確認後、10%→30%→50%と段階的に拡大(各段階1週間)
  4. 最終段階: 既存ユーザーも含めて全ユーザーを新プロバイダーに切り替え

結果: 全展開まで6週間。決済成功率は99.2%→99.5%に改善。チャージバック率に差なし。月間8億円の決済を障害ゼロで新プロバイダーに移行完了した。

例3:検索アルゴリズムの変更をカナリアリリースでA/Bテスト的に検証する

状況: ECサイトの商品検索アルゴリズムを改良。新アルゴリズムは精度が向上している想定だが、実ユーザーでの効果は未検証。

カナリア戦略:

  • カナリア10%に新アルゴリズム、90%は旧アルゴリズム
  • 比較メトリクス: 検索結果のクリック率、カート追加率、購入コンバージョン率
  • 2週間のデータを収集し、統計的有意差を確認

結果: 新アルゴリズム群はクリック率が12%→16%に向上、コンバージョン率も2.1%→2.8%に改善。統計的有意差を確認後、100%に展開。カナリアリリースをA/Bテストとしても活用し、推定で月間売上1,400万円の増加を実現した。

やりがちな失敗パターン
#

  1. カナリアの割合を一気に上げすぎる — 5%で問題なしだからと一気に100%にすると、スケール時特有の問題を見逃す。段階的に上げ、各段階で観察時間を取ること
  2. 比較するメトリクスが不十分 — エラー率だけ見てOKとすると、レイテンシ悪化やメモリリークを見逃す。複数のメトリクスを総合的に比較すること
  3. ロールバック手順を準備していない — 問題発生時に慌ててしまい、対応が遅れる。ロールバックは1コマンドで実行できるように自動化しておくこと
  4. カナリアの観察期間が短すぎる — 30分で問題なしと判断してしまうと、遅延して発現するバグ(メモリリーク、コネクションリーク等)を見逃す。最低2時間、重要な変更は24時間観察する

まとめ
#

カナリアリリースは 「少数で試して、問題なければ広げる」 という堅実なリリース戦略。全ユーザーに影響が出る前に問題を検知できるのが最大のメリット。メトリクスによる定量的な判断と、段階的な展開ルールを事前に決めておくことが成功の鍵。