はじめに
Google Cloudと協業しDevOpsに関する調査レポートを公開しているDORAの「The Accelerate State of DevOps Report」では、生産性の高いエリートパフォーマーは「コードを1日に何度も本番環境にデプロイする」と述べられています。
多くのデプロイを行うことでユーザーに変更を素早く届けることができ、市場で勝てる可能性が高くなります。しかし一方で、コードの変更はさまざまな障害を引き起こします。頻繁なデプロイには重大なリスクが伴います。
プログレッシブデリバリーという用語を提言したJames Governorは次のように述べています。
The elite performers are shipping a lot more code and with higher quality.
――“An Introduction to Progressive Delivery", James Governor at Qcon 2019
つまり私たちが最終的に求めているのは、何も壊さずに頻繁にデプロイできる仕組みです。その仕組みこそがプログレッシブデリバリーです。
言葉にすると簡単に聞こえますが、何も壊さないとは一体どういうことでしょうか。現実世界は極めて複雑です。本記事では、具体的にどのように解決するのか、さまざまなソリューションを比較しながら解説していきます。
プログレッシブデリバリーとは
プログレッシブデリバリーは、新しい機能を段階的に公開していくことで影響範囲や時間を細かく制御するための手法全般を指します。
この言葉にはさまざまな目的を持つ複数の手法が含まれており、新機能の公開範囲を意図的に制御することを目的としたフィーチャーフラグや、それに基づいたA/Bテストなどの手法も含まれます。しかし本記事では、前節で述べた「何も壊さずに頻繁にデプロイできる仕組み」を実現するための手法についてのみ詳述していきます。
この仕組みを実現するためにプログレッシブデリバリーでは、既存のモニタリング技術と組み合わせてユーザーへの悪影響をできるだけ小さくすることを目指します。この文脈でのプログレッシブデリバリーを構成する要素はいくつかありますが、主に以下のプロセスを段階的に行います。
- トラフィック制御(カナリアデプロイメント)
- 分析
- 自動化されたロールバック
まずは、現行バージョンのアプリケーションと新バージョンのアプリケーション(以降カナリアと呼びます)を同時に実行し、僅かなトラフィックのみをカナリアへと流していきます。時間が経つにつれて、徐々にカナリアへ流すトラフィックの割合を増やしていきます。これは一般的にカナリアデプロイメントと呼ばれています。
影響を最小限に留めるために、カナリアが期待通りに動作していない場合は即座にロールバックしなければなりません。そのためにも、カナリア実行中は常に機能指標やパフォーマンス指標を分析し続ける必要があります。これは一般的にカナリア分析と呼ばれることが多いですが、分析手法によって若干表現が異なるため、本記事では単に「分析」と呼びます。
この分析作業は従来、手動で確認したり、専用スクリプトを用意する等のアドホックな方法で行われたりしてきました。プログレッシブデリバリーの文脈ではこの部分を自動化することが必須で、そのためのソリューションが次々に登場しています。
全てのトラフィックがカナリアに通されるまでこの分析は続きます。問題なく分析プロセスが終わると、通常は現行バージョンのアプリケーションをカナリアと同じバージョンへアップグレードします。反対に、途中で問題があった場合は即座にロールバックが実行されるべきです。この「自動化されたロールバック」も、プログレッシブデリバリーの文脈では必須になります。
これらのうち、1つ目の「トラフィック制御」と、3つ目の「自動化されたロールバック」はソリューション間での差異があまりなく、ほとんどの作業は利用しているプラットフォームが用意しているインターフェースに従って設定していくことで実現できます。
システムオーナーが最も時間を割くべきなのは「分析」のフェーズです。次からは、2つ目の構成要素である「分析」に焦点を当てて、具体的なソリューションを紹介していきます。