本番バグが全ユーザーに影響する前に検出する方法

変更が本番環境を壊すかどうかを確認する最も確実な方法は、本番環境にデプロイすることです。問題は、安全だと確信できるまでに、どれだけのユーザーを潜在的な障害にさらすかです。
カナリアテスト——カナリアデプロイメントまたはカナリアリリースとも呼ばれます——は、本番トラフィックのごく一部を新バージョンにルーティングして障害を監視し、信頼性が高まるにつれて段階的にロールアウトを拡大していくプラクティスです。適切に実施すれば、デプロイメントライフサイクルにおける最も効果的なリスク管理手法の一つです。
カナリアデプロイメントの仕組み
典型的なカナリアデプロイメントでは、本番トラフィックの1〜5%を新バージョンにルーティングします。残りの95〜99%は現在の安定バージョンを引き続き受け取ります。監視システムが両コホートのエラー率、レイテンシ、主要ビジネス指標を並行して追跡します。
カナリアコホートでエラー率の上昇やメトリクスの悪化が検出された場合、大多数のユーザーに影響が及ぶ前に、デプロイメントが自動または手動でロールバックされます。カナリアがベースラインと同等のパフォーマンスを示した場合、ロールアウト比率が段階的に拡大されます。一般的には5%→20%→50%→100%というように、各段階で監視が行われます。
重要な要件はオブザーバビリティです。カナリアテストは、障害を迅速に検出できる場合にのみ有効です。堅牢な監視なしにカナリアデプロイを行うチームは、フルロールアウトよりも安全にするための検出能力なしに、5%のユーザーを障害にさらすことになります。
カナリアテストがデプロイ前テストで見逃す問題を検出できる理由
ステージング環境は、どれほど整備されていても、本番環境を完全には再現できません。実際の本番トラフィックには、ステージングでは正確にモデル化できないデータの分布、同時アクセスパターン、データの形状があります。障害の中には、実際の本番負荷、実際のユーザーデータ、実際のサードパーティ統合との組み合わせでのみ発生するものがあります。
カナリアテストは、影響範囲を限定しながらこれらの障害を検出します。ステージングデータでは高速でも本番データ量では遅くなるデータベースクエリは、全ユーザーに影響する前にレイテンシメトリクスとして可視化されます。実際の決済情報に対して異なる動作をするサードパーティ統合は、問題が広まる前にエラー率に表れます。
カナリアリリースと自動テストの組み合わせ
カナリアテストとデプロイ前の自動テストは、どちらか一方ではなく、補完的な関係にあります。
TestSpriteによるデプロイ前テストは、コードが本番環境に届く前に機能的なリグレッションを検出します。カナリアデプロイメントは、実際の本番環境でのみ検出できる残余の障害を検出します。強固なデプロイ前カバレッジとカナリア監視の組み合わせは、ハイパフォーマーなチームが高頻度で自信を持ってデプロイするために採用しているアプローチです。
関連メカニズムとしてのフィーチャーフラグ
フィーチャーフラグは、異なるメカニズムによって同様のリスク低減を実現します。コードはすべてのユーザーにデプロイされますが、新機能は一部のユーザーのみに対して有効化されます。インフラレベルでトラフィックを分割するカナリアデプロイメントとは異なり、フィーチャーフラグはアプリケーションレベルで分割します。これにより、より細かい制御が可能になりますが、アプリケーションレベルでのインストゥルメンテーションが多く必要になります。
多くのチームは両方を併用しています。全体的な安定性検証のためのインフラレベルのカナリアデプロイメントと、特定のリスクの高い機能の段階的なロールアウトのためのフィーチャーフラグです。この組み合わせにより、デプロイ前テスト単独では提供できない複数層の本番リスク管理が実現されます。