ChatGPT上で障害対応をシミュレートする
Table of Contents
長年やろうやろうと思ってできていないことの一つに、障害対応訓練がある。 今回はその訓練をChatGPT上でやってみたという話。 もちろん、Claudeなどの他の対話型生成AIサービスでもできるはず。
障害対応は実際にやらないとできるようにならない #
Webサービスなどのシステムを運用している場合、避けては通れないものとして 障害 がある。 負荷の増加やシステムの変更、オペレーションミスなどで発生するこれらの障害は、 程度にもよるが少なからずシステムの運用に支障をきたすため、迅速に解消する必要がある。 いわゆる 「障害対応」 である。
障害発生時には、まず何が起こっているのかを把握する必要がある。 各種ログやメトリクスから原因となっている箇所を特定し、解消・緩和するための変更を行う。 原因は場合によって様々で、アプリケーションの不具合であることもあるし、 ネットワークなどプラットフォームに近い部分にあることもある。 わかりやすくCPUリソースが枯渇していることもあれば、 平常運転しているときには気を配らないメトリクスを見なければわからない場合もある。 特にシステム固有の仕組みや、複数の要因が相互に作用した結果発生する障害はその原因に気づきにくく、 解消まで時間がかかってしまうことがある。
障害の原因把握のために何を見ればいいのか、解消するために何を操作すればいいのかは、 事前に経験しておかないととっさに思い浮かばない。 経験するためには実際に障害対応する必要があるが、その場合には最も早く障害を解消できる方法が選ばれる。 つまり、障害対応の経験があるメンバーが対応に当たり、 経験がないメンバーにはそれを見守るかせいぜいサポートの役割しか回ってこない。
自分以外誰もいないという状態にならない限り、経験が浅いメンバーが経験を積む機会がないということだ。 安定期に入ったシステムの開発運用に携わっている場合はそもそも障害の発生頻度が低いのでなおさらである。
障害対応訓練 #
そんな問題を解消する手段として、障害対応訓練がある。 本番環境や本番環境を模したシステムを用意し、障害を人為的に発生させ、それに対応する訓練をするというものである。 いわゆるカオスエンジニアリングはこの手法の一つである。
定期的に障害対応訓練を実施できるような組織であればよいのだが(すばらしい!)、実際にはなかなかそうはいかない。 本番環境で実施する場合は、まずビジネスメンバーにその効果とリスクを納得してもらう必要がある。 別環境を用意する場合は、その構築コストと最新化のための運用コストがかかる。 準備をするメンバーの稼働と、訓練に参加するメンバーの稼働をどうやって捻出するかという問題もある1。
実施コストとリスクを抑えつつ、 障害対応をやったことがないメンバーでもなんとなく対応の流れをつかめる方法はないものかと考えた結果、 ChatGPT上でシミュレーションするという方法を思いついた。
シミュレート環境としての生成AIサービス #
生成AIに投げるプロンプトのテクニックとして「ロールを与える」というものがある2。 障害対応訓練に使う場合は、「Webシステム」というロールを与えるのである。
ロールを与える場合はそのロールに関する詳細な説明があるほど出力の精度が上がるが、ここには対象システムの構成を記述する。 アプリケーションの動作方法、データベースのリソース、負荷分散の仕組み、ログパイプラインの構成など、 実際のシステムに関する情報をできるだけ詳しく説明すると、より実際に即したシミュレーションができる3。
プロンプトの例 #
例としてこんなプロンプトを書いてみた。 システム構成はシンプルなWebサーバーを想定している。
あなたはAWS上に構築されたWebシステムです。
以下の項目に則って振る舞ってください。
## 登場人物
- システム(あなた)
- AWS上に構築されたシステム
- システムとして振る舞うことが目的
- 訓練者の要求に応じてシステムの情報を提供する
- 訓練者の要求に応じてシステムの状態を変更する
- システムにはサービスレベルを担保できないほどの現在重大な障害が発生している
- 訓練者(わたし)
- システムを運用管理するバックエンドエンジニア
- システムに発生した障害を取り除くことが目的
## システム構成
- AWS上に構築されたWebサービスを提供するシステム
- データベースとしてAurora for MySQLを使用している。インスタンスは1つで、冗長構成ではない
- WebサーバーとしてECS Serviceを使用している。内部ではGoのアプリケーションが動作している。autoscalingは設定されていない
- ロードバランサーとしてApplication Load Balancerを使用している。httpsを処理するlistnerがあり、すべてのリクエストをWebサーバーにforwardするruleが設定されている
- ログの保存先としてCloudWatch Logsを使用している
- リクエスト数は平均 100req/sec だが、メディア露出などによって急激に増加する場合がある
ここで指定されていない詳細な要素については、システムの構成として常識の範疇で、破綻のない限りは、あなたが自由に決めることができる。
## ルール
- システムは、訓練者が言い当てた場合を除き、障害の根本的な原因を訓練者に伝えてはならない
- システムは、訓練開始時に障害によって発生した具体的な影響を訓練者に提示する
- 訓練者は `:` で始まる文字列をコマンドとしてシステムに対して発行することができる。
- 訓練者が `:help` と入力した場合、システムは取得可能な情報と操作の一覧を提示する
- 訓練者が `:list resources` と入力した場合、システムはシステム内のリソース一覧を提示する
- 訓練者が `:list metrics` と入力した場合、システムは取得可能なメトリクス一覧を提示する
- 訓練者が `:get {メトリクス名}` と入力した場合、システムは対応するメトリクスを提示する
- 訓練者が `:describe {対象リソース}` と入力した場合、システムは対象リソースの詳細な情報を提示するする
- 訓練者が `:modify {変更対象リソース名} help` と入力した場合、システムは変更可能な内容のリストを提示する。
- 訓練者が `:modify {変更対象リソース名} {変更内容}` と入力した場合、システムは変更対象に対して指定された変更を実施する
- 訓練者が `:hint` と入力した場合、システムは障害調査に役立つ情報を提供する
- 訓練者が `:giveup` と入力した場合、システムは発生していた障害の内容を提示し、訓練を終了する
- システムは `:modify` 実行の結果を訓練者に提示する
- システムは `:modify` 実行により障害が解消した場合、訓練者にその旨を伝える
- システムは、障害が解消した場合、訓練者に障害の詳細な内容を伝える
- システムは、障害が解消した場合、訓練者が行った障害対応を100点満点で評点する。障害解消までのステップが多いほど、また `:hint` の利用回数が多いほど減点が増える
- システムは、障害が解消した場合、訓練者に同様の障害を未然に防ぐ方法を提示する
それでは訓練を始めます。
プレイしてみる #
以下は実際にプレイしてみた様子。
なかなかそれらしく動いているように見える。 実際のシステムを使った訓練に比べればだいぶ簡素だし、できることも限られるが、 実際のシステムと違って準備の手間もなくひとりでサクサクと進められるし、詰まったらその場でヒントをもらうこともできる。 何より低コストでプレイできるというのがいい。 最後に点数を出すようにしてみたが、もう一度やってみようというモチベーションに繋がって良い。
今後の展望 #
今回はお試しということでシンプルなシステム構成をシミュレーションしたが、 より複雑なシステム構成を与えれば難易度も相応に高くなるだろう。 MCPサーバーを使って実環境の情報やプラットフォームのドキュメントを参照させれば精度と一貫性の向上も見込める。
ChatGPTなどのインターフェイスをそのまま使うのではなく、内部でLLMに投げるようにしたWEbサービスにすれば、 発生する障害内容を指定しつつプレイヤーの目には触れさせないということもできるだろう。 何人かで同じお題に挑戦して点数を競うのもおもしろい。
例に上げたプロンプトではシステム側が積極的にヒントを出してくれるのでだいぶ難易度が低かったが (実際最後は操作例がそのまま障害解消のための操作になってしまっている)、 求められたときにしかヒントを出さないようにするなどして調整もできる。
おわり #
生成AIサービス上で障害対応訓練をシミュレートする、というのをやってみた。 お手軽なので興味を持った方は試してみてほしい。
あと、ぶっちゃけ障害対応もAIが全部やってくれて、人間は寝ているだけで良い世界になってほしい。
-
なぜかいつでも忙しいし、忙しい中で訓練の時間を取れるようになるとしたら障害の復旧が遅れたという事故が何度も続いて対策しないとどうにもならないことが組織内の共通認識になることだが、そもそもそんな状態になりたくないから訓練をするんだよ! ↩︎
-
https://docs.anthropic.com/en/docs/build-with-claude/prompt-engineering/system-prompts ↩︎
-
業務システムの情報を入力する際は、利用する生成AIサービスのプライバシーポリシー等をよく確認してほしい。 ↩︎