はじめに
カオスエンジニアリングとは、本番環境が障害等による不安定な状況にも耐えられることができるという自信をつけるための方法論です。正常稼働中の本番システム上でわざと障害を発生させて、自動修復システムの動作を確認する手法はカオスエンジニアリングの代表例ではありますが、これがすべてではなく、そこに至るまでのステップで開発チームに対して多くのプラスの効果を生みます。
カオスを導入する一般的な方法は、システムコンポーネントの障害を引き起こすエラーを意図的に挿入することです。例えば、APIアプリの停止、VMのシャットダウンや通信制限(ファイアウォール規則の有効化、接続文字列の変更など)、強制フェールオーバーが発生しても、アプリケーションがエラーを適切に処理できるかどうかなどを検証します。
しかしながら、これらの検証を行うには分散システムやクラウドの知識だけでなく、業務システムのアプリケーション開発からインフラ設計に至るまでの幅広い知識と経験が必要で、どこからどうはじめてよいか戸惑うこともあります。
本連載では、これからクラウドを活用したシステムを開発するエンジニアの皆様に向けて、カオスエンジニアリングの概要や求められる背景、カオスエンジニアリングを実現するオープンソースソフトウェアである「Chaos Toolkit」とMicrosoftが提供するパブリッククラウド「Azure」を使って実践的な障害挿入の仕方や気を付けておきたい注意点などについて、エンタープライズシステムの設計開発に長年従事してきた現場エンジニアの生の声をお届けします。
本連載のゴール
- カオスエンジニアリングの必要性について理解する。
- Chaos Toolkit on Azureを使ってクラウド上で動くアプリケーションに対してカオスエンジニアリングができる。
対象読者
- 業務系システムの開発者・インフラ担当者
カオスエンジニアリングが求められる背景
今日オンプレミスの環境で運用されていた業務システムの多くが、クラウドへの移行を進めています。クラウドを活用することで高い拡張性を持つセキュアなシステムを短期間で開発することができ、変化の激しいビジネス環境に追随できるだけでなく、最新技術を起点としてこれまでになかったビジネスモデルを構築し、ソフトウエアで市場を変革するという大きな可能性も秘めています。 一方、クラウドはグローバルに展開された大規模な分散システムです。分散システムでは個々のサービスが適切に機能している場合でも、それらのサービス間の相互作用によって予測不可能な障害を引き起こす可能性があり、これらを完全にゼロにするということは不可能です。そのためクラウドを利用するときは、システムのいずれかで障害が発生しているという前提に立ち、いかに早く障害を検知・復旧させるかに重点を置いて設計開発をすることが重要になります。
こうした背景から、本番環境が上述のような障害等による不安定な状況にも耐えられることができるという自信をつけるための方法論としてカオスエンジニアリングが注目されてきています。
テストと実験の違い
カオスエンジニアリングではカオスを挿入し、その結果を確認することを「実験」と呼んでいます。システム開発においてあまり耳慣れない単語であり、似たような結果を確認する方法である「テスト」とどう違うのかと感じる方も多いかと思います。
テストはどうなるか分かっている既知のことを確認する目的で行い、実験はどうなるのか分からない未知のことを知る目的で行うという違いがあります。
新規システムの場合、開発時にもし未知のことがあれば、リリース前に徹底的に検証を行うので、十分に自信をもってシステムの運用をできる場合が多いのではないかと思います。ところが追加開発を重ねていったシステムだと、規模が大きくなりすぎたり、キーマンの離任などが起こったりします。結果として全容が完全に分からないことが多くなり、おそらくこうだと思うが、あまり自信がないといった未知のことが増えていく傾向にあります。そのため筆者はカオスエンジニアリングの対象は、多くの場合追加開発を行ったシステムになるのではないかと考えています。
カオスエンジニアリングの実例
Google、Microsoft、Slackなど多くの企業がカオスエンジニアリングに取り組んでいることを表明していますが、カオスエンジニアリングの分野で最も有名な事例はNetflixかと思います。Netflixでは2010年頃から本格的にパブリッククラウドであるAWSの利用をし始めました。クラウド利用にあたり、学んだ内容を5 Lessons We’ve Learned Using AWSとして公開しました。その中でも特に注目を浴びた教訓は「The best way to avoid failure is to fail constantly.(障害を避ける最も良い方法は常に障害を起こし続けることである)」でした。一見矛盾するようなこの教訓は、Chaos Monkeyというキャッチーな名前で紹介されたツールの衝撃的な動作とともに多くの人に驚きを与えました。Chaos Monkeyの仕事は、システム上のサーバーをランダムに停止させるというものでした。そうした障害にシステムが耐えられるかを確認し続けるという取り組みが紹介されました。その後もNetflixでは、Latency MonkeyやChaos kongなどさまざまな障害を引き起こすツール群を開発して、自身のシステムの信頼性を確認していきました。もともとはランダムに発生させていた障害への対応することから始まったこの取り組みは、さまざまな改良を加えられることで、より安全に正確に信頼性を高める方法論として確立され、今日のカオスエンジニアリングとなっています。