前置き
以下の記事でも書きましたが、独立したエンドツーエンドパイプラインを採用するということは、従来の「デプロイ前のE2Eテスト」を放棄することを意味します。
その代わりに、CI/CDパイプラインはサービスメッシュとオブザーバビリティを組み込み、
デプロイ後の本番環境での検証を自動化する、より高度な責務を担うことになります。
なぜ従来のE2Eテストが破綻するのか
サービスが非同期で疎結合になり、パイプラインが独立すると、従来のE2Eテスト(Staging環境で全サービスを起動してテストする)は以下の理由で破綻します。
環境構築の不可能性
100のサービスを、すべて特定のバージョンで同期させてStaging環境にデプロイするのは、現実的に不可能です。
非同期の壁
Service Aがイベントを発行した後、Service Bが処理を終えるまで「何秒待つ」というテストは、本質的に不安定(Flaky)です。
独立性の侵害
Pipe-AがPipe-Bの起動を待つ時点で、パイプラインには時間的結合が発生しており、パイプラインの「独立性」が失われ、ファンインパイプラインに逆戻りしてしまいます。
新しいパラダイム:CI/CDが本番環境を「観測」する
この問題を解決するため、パイプラインの責務は
「デプロイしたら終わり」から「デプロイし、その影響を観測し、安全を保証する」
へと進化します。
ここでCI/CD、サービスメッシュ、オブザーバビリティが連携します。
1. CI/CDパイプラインの役割(オーケストレーター)
パイプラインは、Service A (v1.1)のデプロイを指示します。
2. サービスメッシュの役割(アクチュエーター)
CI/CDの指示を受け、サービスメッシュ(Istio, Linkerdなど)がプログレッシブ・デリバリーを実行します。
事例
「Service Aへの本番トラフィックのうち、1%だけを新しいv1.1に流し、残りの99%は安定版のv1.0に流し続ける」(カナリアリリース)。
3. オブザーバビリティの役割(センサー)
サービスメッシュは、すべての通信のメトリクス(レイテンシー、成功率など)をオブザーバビリティ・プラットフォーム(Prometheus, Datadogなど)に送信します。
「サービス間をまたぐレイテンシー」を監視するメカニズム
パイプラインはデプロイ後、監視(Observe) フェーズに入ります。
ステップA (CI/CD)
1%のカナリアデプロイ後、5分間待機する。
ステップB (CI/CD)
オブザーバビリティ・プラットフォームに対し、「v1.1を経由したユースケース」 のメトリクスを問い合わせる。
CI/CDが投げるクエリ (適応度関数)
・「Service A (v1.1)を経由したサービス間をまたぐユースケース(例: /checkout)のP99レイテンシーは、v1.0と比較して悪化していないか?」
・「Service A (v1.1)のエラーレートは、v1.0と比較して増加していないか?」
ステップC (CI/CD):
もし適応度関数が成功したら (例: レイテンシーもエラーも問題なし)
パイプラインはサービスメッシュに「トラフィックを100% v1.1に流せ」と指示します(プロモート)。
もし適応度関数が失敗したら (例: レイテンシーが急増)
パイプラインはサービスメッシュに「v1.1へのトラフィックを0%に戻せ」と指示します(自動ロールバック)。
まとめ
非同期・独立E2Eパイプラインの世界では、
サービスメッシュが「安全なデプロイの“実行部隊”」
となり、
オブザーバビリティが「デプロイの影響を測る“目”」
となります。
そして
CI/CDパイプラインは、それらを制御する「脳」
として機能し、「デプロイ後の本番環境での観測」こそを、最も重要な「E2Eテスト」 として実行します。