パイプラインが自ら判断する:プログレッシブデリバリーの自動化判断

こんな状況を想像してみてほしい。土曜日の午前2時。チームは帰宅前にリリースをトリガーした。新しいバージョンが本番トラフィックの5%を受け付け始める。5分後、エラーレートが上昇し始める。誰もダッシュボードを見ていない。朝、誰かがスマホを確認したときには、ユーザーは何時間もエラーに直面していたことになる。

このシナリオは、ほとんどのチームが認めたがるよりもはるかに頻繁に発生している。リリースは必ずしも営業時間内に行われるわけではない。チームメンバーには仕事以外の生活がある。そして、人間が問題に気づいてから行動を起こすのを待つことは、不必要なダウンタイムを生み出す。

解決策は、人を常時オンコールにしておくことではない。パイプラインに自律的に判断する能力を与えることだ。

自動ゲーティングの仕組み

核となるアイデアは単純だ。プログレッシブデリバリーパイプラインには複数のステージがあり、各ステージで新しいバージョンにより多くのトラフィックを公開する。各ステージの間にはゲートが設置されている。このゲートは、事前に定義されたしきい値に対してリアルタイムメトリクスをチェックし、次に何をするかを判断する。

具体的な例を示そう。パイプラインはまず、新しいバージョンにトラフィックの5%をルーティングする。データが蓄積されるのを5分間待つ。その後、次の3つの項目をチェックする。

  • 新しいバージョンのエラーレートが0.1%未満か?
  • レイテンシが古いバージョンのベースラインの10%以内か?
  • 5xxレスポンスに有意な増加はないか?

すべてのメトリクスが合格すれば、パイプラインは次のステージ(例えばトラフィックを20%に拡大)に進む。メトリクスが不合格の場合、パイプラインは何をすべきかを判断する必要がある。

3つの選択肢:継続、保留、ロールバック

メトリクスがしきい値を超えると、パイプラインには3つの選択肢がある。

継続は、すべてが正常であることを意味する。新しいバージョンは次のトラフィック階層に移行する。これが正常なパスであり、人間の介入は不要である。

保留は、パイプラインがリリースの進行を停止するが、新しいバージョンは現在のトラフィック割合で稼働し続けることを意味する。チームに通知が届き、プレッシャーなく調査できる。これは問題がまだ重大でない場合に有用だ。エラーレートがわずかに上昇したが、警告を発するほどではない場合などだ。チームはログを確認し、トレースを調べ、続行するかロールバックするかを判断できる。

ロールバックは、パイプラインが直ちにすべてのトラフィックを古いバージョンに戻すことを意味する。これはメトリクスが深刻な問題を示している場合に発生する。エラーレートが劇的に急上昇している。すべてのリクエストが失敗し始めている。レイテンシが許容限界を超えて劣化している。このような場合、人間の承認を待つことは事態を悪化させるだけだ。

しきい値の設定:警告とクリティカル

保留とロールバックの判断は深刻度に依存する。多くのチームは2段階のしきい値を実装している。

警告しきい値は保留をトリガーする。例えば、エラーレートが0.5%に達した場合、パイプラインは進行を停止し、チームに通知する。新しいバージョンは現在のトラフィックレベルに維持され、誰かが調査する。

クリティカルしきい値は自動ロールバックをトリガーする。エラーレートが2%に達した場合、パイプラインは直ちに新しいバージョンを引き揚げる。待機はない。疑問の余地もない。

この2段階アプローチにより、軽微な問題に対してはチームに余裕を与え、重大な障害からはユーザーを保護することができる。正確な数値はアプリケーションのエラー許容度に依存する。決済システムは、コンテンツサイトよりもはるかに厳格なしきい値を持つ可能性がある。

パイプラインが判断するために必要なもの

自動判断を実現するには、3つの要素が連携する必要がある。

第一に、可観測性システムがリアルタイムでメトリクスを公開しなければならない。パイプラインはトラフィックをシフトした直後にエラーレートやレイテンシなどのシグナルをクエリする必要がある。モニタリングに5分の遅延がある場合、パイプラインはタイムリーな判断を下せない。

第二に、パイプラインは新しいバージョンのメトリクスを古いバージョンのベースラインと比較する必要がある。これは、以前の安定したリリースからのベースラインデータを保存することを意味する。比較は通常の変動を考慮に入れるべきだ。ピーク時の5%のレイテンシ増加は正常かもしれないが、同じ増加でも低トラフィック時には問題を示す可能性がある。

第三に、パイプライン設定に明確なルールをエンコードする必要がある。これらのルールは、どのメトリクスをチェックするか、どのしきい値を使用するか、各しきい値レベルに対してどのアクションを取るかを定義する。ルールはシンプルかつ明示的に保つこと。複数の条件を持つ複雑なロジックは、保守とデバッグが困難になる。

自動化は人間を置き換えない

自動判断によってリリースを完全に無視できるようになると考えるのは魅力的だ。しかし、そうではない。自動化は予測可能なシナリオを処理する。人間は依然として以下を行う必要がある。

  • 各メトリクスに適切なしきい値を定義する
  • アプリケーションの進化に伴い、しきい値が引き続き適切かどうかをレビューする
  • 自動化がカバーしないエッジケースを処理する
  • 保留を調査し、続行するかロールバックするかを判断する
  • 新しい障害パターンが出現したときにルールを更新する

自動化を一般的なケースのためのセーフティネットと考えよう。明白な問題を迅速にキャッチし、人間が状況と判断を必要とする複雑な問題に集中するための時間を増やす。

実践的なクイックチェックリスト

自動判断ゲートを実装する前に、以下の基本事項を確認すること。

  • パイプラインはモニタリングシステムからリアルタイムでメトリクスをクエリできるか?
  • 現在の安定バージョンからのベースラインメトリクスはあるか?
  • エラーレート、レイテンシ、5xxレスポンスに対する警告およびクリティカルしきい値を定義したか?
  • パイプラインにはロールバックせずに進行を保留するメカニズムがあるか?
  • 保留またはロールバックが発生したときに適切な担当者に通知が届くように設定されているか?
  • ステージング環境で自動ロールバックをテストしたか?

次に来るもの

パイプラインが継続、保留、ロールバックを判断できるようになったら、次のステップはトラフィックの配信方法を選択することだ。一般的なアプローチとして、カナリアリリースと段階的ロールアウトの2つがある。それぞれ、新しいバージョンのリーチを拡大する方法が異なる。適切な選択は、アプリケーションのアーキテクチャとインフラストラクチャがトラフィックルーティングをどのように処理するかに依存する。

しかし、それはまた別の機会に譲ろう。今は、誰も見ていないときにパイプラインが判断を下せるようにすることに集中してほしい。ユーザーは感謝し、チームはより良い睡眠を得られるだろう。