AWS Fault Injection Simulator で始めるカオスエンジニアリング
こんにちは ! ソリューションアーキテクトの金森政雄です。
以前の投稿 で、AWS Fault Injection Simulator (AWS FIS) を使った、簡単な実験の方法をご紹介しました。
しかし、本番環境で実際に実験を行う際には、障害を注入するだけではなく、何か問題が起こった時にすぐにそれを検知して、実験を停止する仕組みも必要になります。
この投稿では、AWS FIS の停止条件という機能を使って、AWS FIS の実験中に想定外の問題が起こった際に、自動的に実験を停止する方法をハンズオン形式でご紹介します。
今回は下記の作業と実験を通して、停止条件の使い方と動きを学びます。
CloudFormation でデプロイした EC2 上の PHP アプリケーションを CloudWatch Synthetics を使って死活監視します。
PHP のアプリケーションが動作している EC2 インスタンスの 80 番ポートへの接続が全て破棄されるブラックホールの状態を作り出す実験を行います
上記の実験の停止条件として、CloudWatch Synthetics の死活監視のアラームを指定しておくことで、ユーザーに影響が出ていることを検知すると自動的に実験が停止されることを確認します。
初めに : 停止条件とは
ハンズオンを始める前に、AWS FIS の停止条件 についてご紹介します。停止条件は実験を安全に行うためのガードレールを提供する機能です。具体的には、CloudWatch アラーム を指定し、実験中にそのアラームで指定された閾値を超えた場合に実験を停止することができます。
カオスエンジニアリングの原則 でも「カオスエンジニアには検証による被害が最小限に抑えられていることを確認する責任と義務があります」と書かれているように、特に本番環境の実験においては実験によって被害が発生した場合に、それをすぐに検知して影響を最小限に抑えるためのモニタリングと “赤い大きな停止ボタン” のような実験を停止するための仕組みが必要です。自分たちでそのような仕組みを作ることも可能ですが、AWS FIS の停止条件を使うことで指定した CloudWatch アラームがアラーム状態になった時に自動的に実験を停止することができます。
停止条件に指定する CloudWatch アラームは、API のエラー率やレイテンシーなどシステムの定常状態を示すものを指定することをお勧めします。定常状態について詳しくは こちら の記事をご参照ください。今回のハンズオンでは、CloudWatch Synthetics を使ってシンプルな死活監視を行い、成功率が閾値を下回った場合に実験を停止するようにします。皆さんがご自身のシステムで実験を行う際は、そのシステムのビジネス的な指標も考慮した定常状態を検討し、それをモニタリングできるようにして停止条件に利用すると良いでしょう。
なお、停止条件はあくまで実験を停止するだけの仕組みです。実験を停止するだけで自動的にロールバックできるシステムや実験であれば問題ありませんが、実験の内容によってはロールバックのために追加の手順が必要な場合がありますので注意してください。例えば、EC2 インスタンスを終了する実験の場合、それによって終了されたインスタンスそのものを復旧することはできません。(Auto Scaling を利用している場合、設定に応じて自動的に新しいインスタンスに置き換えられることが期待できます。)
なお、1 つの実験テンプレートについて停止条件は 5 つまで定義することができます。AWS FIS のその他のクォータについては こちら をご参照ください。
ハンズオンの前提条件
このハンズオンは、AWS FIS の基本的な使い方をご存知のであることを前提としています。AWS FISを使ったことがない方は、こちら のハンズオンを先に実施してみてください。 また、下記が前提条件となります。
AWS アカウントを持っていること。 AWS アカウントがない方は こちら の手順に従って、作成してください (※)。
AWS にログインした際に、AWS FIS、Amazon EC2、AWS Auto Scaling、AWS Systems Manager、AWS IAM を操作できる権限を持っていること (ハンズオンを円滑に進めるために、AdministratorAccess の IAM ポリシーがセットされた IAM ユーザー / ロールを利用することをお勧めします)
AWS FIS が利用できるリージョンを利用してください。現在利用できるリージョンは こちら のサービスエンドポイントを参照してください。
マネジメントコンソールは日本語で設定されていることを前提として手順を記載します。
※AWS アカウントを作成し、IAM の基本的な設定をしていく手順については、「AWS Hands-on for Beginners ハンズオンはじめの一歩: AWS アカウントの作り方 & IAM 基本のキ」を参考にしていただくことをお勧めします。
ご注意
本記事で紹介する AWS サービスを起動する際には、料金がかかります。 builders.flash メールメンバー特典の、クラウドレシピ向けクレジットコードプレゼントの入手をお勧めします。
builders.flash メールメンバー登録
builders.flash メールメンバー登録で、毎月の最新アップデート情報とともに、AWS を無料でお試しいただけるクレジットコードを受け取ることができます。
1. 事前準備
2. 実験の対象になるアプリケーションをデプロイする
実験の対象になる LAMP のアプリケーションを AWS CloudFormation を使ってデプロイします。
3. 停止条件に設定する CloudWatch アラームを設定する
停止条件に指定するためのCloudWatch アラームを作成します。今回は、CloudWatch Synthetics の監視状況に応じて実験を停止したいので、CloudWatch Synthetics の Canary を作成するところから始めます。
4. 停止条件を設定して実験を行う
準備ができましたので遂に、AWS FIS を使って実験をしていきましょう。 今回は、先ほどデプロイした LAMP 環境の PHP アプリケーションが動作している EC2 インスタンスに 80 番ポートへのトラフィックを全て破棄してしまうブラックホールを設定する実験をおこないます。今回の構成では EC2 インスタンスは 1 台しかありませんので、サービス全体でレスポンスが返らない状態になり、CloudWatch Synthetics を使った死活監視でアラームが発生し、実験を停止する流れを確認します。
5. 後片付け
6. まとめ
このハンズオンでお見せしたように、停止条件を使うことで、実験中に想定外の問題が発生し定常状態を維持できなくなった場合、自動的に実験を停止するように実験を設定することができます。システムが自動的に復旧できる機構を持っていたり実験の内容によっては自動的にロールバックされます。
カオスエンジニアリングのプロセスとしては、問題が起こったときに定常状態を維持できる仮説を立てて、それを検証するために実験を行います。停止条件に定常状態を監視する仕組みを設定していた場合、「停止条件によって実験が停止した」と言うことは「仮説が反証された」ということになるので、仮説通りに定常状態が維持できなかった理由を調査し、改善する必要があります。
このような問題点を見つけて改善していくことで長期的なシステムの改善を実現することがカオスエンジニアリングの目的です。一方で、実際にお客様に影響が発生することはできる限り避けるべきでしょう。今回は停止条件の挙動をわかりやすくするためにサイト全体が停止するシナリオを利用しましたが、実際に皆さんのシステムで実施する際は、爆発半径 (Brast Redius) を考慮して実験を計画したり、本番での実験の前に検証環境で実施するなど、「検証による被害が最小限に抑えられていることを確認」しながら進めていただければと思います。
それでも、想定外の事態が起きた場合に、停止条件をご利用いただくことで、被害を最小限に抑えることができるかもしれません。AWS FIS での実験の際には、ぜひ停止条件を利用することをご検討ください。
筆者プロフィール
金森政雄
アマゾン ウェブ サービス ジャパン合同会社
デベロッパースペシャリスト ソリューションアーキテクト
Web、モバイル向けの自社サービスの開発やクラウドを活用したシステムの請負開発を経験後、パートナーソリューションアーキテクトとして、アマゾン ウェブ サービス ジャパン合同会社に入社。2021 年から DevAx チームとして、開発者の方に向けたイベントやワークショップの提供を中心に活動。
最近の個人的ニュースは家の近くのラーメン屋で、「まさお」という自分の名前と同じメニューがあったこと。

Did you find what you were looking for today?
Let us know so we can improve the quality of the content on our pages