合成実験だけでは、CI環境と本番環境の違いから問題を発見しきれない場合があります。そのため、本番に支障が出るまで問題に気付かず、被害が発生するケースもあります。こうした背景から、アジャイル開発はソフトウェア開発プロセスを変革しました。
カナリアデプロイは、現代の開発者が採用している新たな手法の一部です。旧バージョンが使われながら最新バージョンを一部サーバーに導入し、テスト後に他のサーバーへ展開します。
この記事を通じて、この最新手法の詳細を学んでほしい。
少し独特な手法を用いていますが、カナリアデプロイはブルーグリーン方式と同様に動作します。つまり、一度にサーバーやノードの一部だけを切り替え、残りは順次切り替える形で進め、全面的な環境切替えを待たなくても進行できます。
カナリアデプロイの実装には、ステージングやテスト環境を多様な形で整えることが可能です。最もシンプルな方法は、通常通りロードバランサの背後にエコシステムを設置しつつ、アプリの規模に応じて未使用のサーバーやノードを1台以上確保する方法です。
この予備のノードまたはサーバー群がCI/CDプロセスにおけるデプロイ対象となります。ビルド、デプロイ、テスト後、短時間だけこのノードをロードバランサに戻し、一部のユーザーで動作を確認します。これにより、クラスタ内の他のノードへ同様の手順を適用する前に変更の効果を検証できます。
もう一つの方法は、フィーチャートグルの開発パターンを活用することです。アプリに変更を加える際、フィーチャーフラグと呼ばれる設定でその機能を有効に管理します。
クラスタからノードを一旦外し、デプロイ後に再追加することで、ロードバランサを経由せずにテストや管理を行う方法もあります。全ノードが更新された後、一部のユーザー向けに機能を有効化し、問題なければ全体へと展開します。
ただし、この手法にはフィーチャートグル対応のため、開発コストや時間、資金が増加するという欠点もあります。アプリの規模や成熟度によって、実装の難易度は変わるでしょう。
カナリアリリースの意味について考える場合、まずその内容を確認してみよう。
全ユーザーへ配布されているものの、安定性に欠けるか新機能が未検証のアプリは「カナリアリリース」と呼ばれます。
アルファ版、ベータ版、またはアーリーアクセス版が用いられることもあります。オープンソースコミュニティでは、新リリースの実験を促すために、安定版と開発版を分けて運用することが一般的です。
Mozilla Firefoxはナイトリーベータ版を提供し、Google Chromeもカナリアリリースを活用しています。Google Chromeには新バージョンへの早期アクセスを可能にするカナリアチャネルが設けられています。
一方、カナリアデプロイは、段階的なリリースを行うソフトウェア開発手法です。限られたユーザーにまずアップデートを提供し、テストとフィードバックを得る仕組みです。
変更が承認された後、残りのユーザーへアップデートが展開されます。
最後に、APIバージョンの最新リリースを、APIゲートウェイのカナリアデプロイとして展開するという優れた手法も存在します。
カナリアデプロイでは、2つのバージョンのアプリが同時に稼働します。旧バージョンを「安定版」、新バージョンを「カナリア」と呼びます。アップデートのリリース方法には、ロールングとサイドバイサイドの2種類があります。
それぞれの動作を見ていこう。
ブルーグリーンデプロイとサイドバイサイドデプロイは非常に似ています。カナリア版は、既存マシンを順次アップグレードするのではなく、新たに複製した環境にインストールされます。
アプリがデータベース、複数のサービス、そして複数のコンピュータやコンテナを使用している場合、次の手順となります。
数台ずつ、段階的に変更をリリースする手法がロールングデプロイです。残りのユーザーは引き続き安定版を利用します。最もシンプルな方法の一つと言えるでしょう。
以下は、こうしたデプロイがどのように動作するかの説明である:
カナリアは、英国鉱山において一酸化炭素などの有害物質を検知し、危険を知らせるために重要な役割を果たしていました(ソフトウェアのデプロイでも人間より感受性が高いことから『カナリア分析』という用語が使われています)。
WallarmのDevOpsエンジニアは、CI/CDプロセスにおける新リリースが企業に影響を及ぼさないかどうか、事前に検証を行っています。
重大な問題が発生した場合、すぐにデプロイを元に戻すことができます。フィーチャーフラグの切り替えやトラフィックの旧バージョンへの再振り分けで実施されます。
旧システムに代わる新たなマイクロサービス導入時、プロダクション環境で必要な容量をテストできる点が有益です。カナリアモデルを小規模なユーザーで検証することで、システム拡張に必要なリソースを算出できます。
多くの企業がKubernetesを利用しているため、AWSでの手法に似た形でカナリアデプロイを実施できます。しかし、用語は異なります。
サービスに「登録」されたポッドには、ロードバランサとして機能する仕組みがあり、またASGと同様の働きをする「デプロイメント」も存在します。
完全無欠な手法ではないため、以下のような欠点もあります:
サイドバイサイドデプロイで必要な追加インフラのため、コストは高くなります。クラウドの利点を活かし、必要に応じてリソースの追加や削減を行い、費用削減に努めます。
この手法はブルーグリーン方式に近く、多数の製造マシンの管理、ユーザーの移行、新システムの保守など、負担が大きくなる場合があります。
ソリューションのインフラを、均等なリソースを持つ2つのゾーン「ブルー」と「グリーン」に分割します。ブルーゾーンではロードバランサが現在のアプリのトラフィックの半分を管理し、その後、新しいアプリやソリューションをグリーンゾーンに展開します。
グリーンゾーンでテストと展開を進める間、ロードバランサがトラフィックを振り分け、ブルー環境には手を加えず、常にプロダクション用として維持します。
すべてのアプリ展開とテストが完了した後、ロードバランサを利用してグリーン環境を完全に管理し、ユーザーに変化を感じさせることなく切り替えることができます。
簡単に言えば、ブルーグリーンデプロイとカナリアデプロイの違いは次の通りです:
検討すべき点は多岐にわたり、全ての状況に万能な解決策は存在しません。以下のいずれかが当てはまる場合、ブルーグリーンデプロイを検討するのが一般的です:
一方、カナリアデプロイが適しているのは、
カナリアデプロイ計画の要素
カナリアデプロイは、以下の場合には利用できません:
カナリアデプロイ戦略は、変更を本番環境に取り込むリスクを低減し、必要なインフラも少なくて済むため支持されています。全ユーザーへ一斉に展開するのではなく、実際の環境で新バージョンをテストできます。
環境の更新や変更時にダウンタイムを発生させないため、デプロイの自動化と一貫性は非常に重要です。CI/CDパイプラインを活用して、アプリ環境の自動デプロイ、テスト、切替えを管理することが有益です。
結論として、カナリアデプロイは思ったほど難しくありません。実施方法は多岐にわたりますが、Kubernetesを利用するのが自然に感じられるかもしれません。全てを自動化すれば、より迅速かつ安心して展開でき、結果としてビジネスにダウンタイムゼロをもたらします。
最新情報を購読