はじめまして。ビズリーチでサーバーサイドエンジニアをしている蒲池です。
今日はビズリーチで行ったシステム防災訓練について書きたいと思います。

なぜ実施したのか?

サービスを運営していく中で、ソフトウェア/ハードウェアの両方で障害は発生しうるものです。
ビズリーチでは、いざ発生した時に迅速に対応できるようにするため、障害対応フローというものを用意しています。

emergency_flow

ただ、障害対応フローが定義されているからといって、誰でも有事で対応できるという話は別です。

など、障害対応には様々なスキルが求められます。(以下これらを包括したスキルのことを 障害対応力 と呼ぶことにします)
この障害対応力を少しでも向上させるために、特に若手エンジニアに向けて、システム防災訓練を行いました。

防災訓練の内容

今回は以下の2つの障害を検証環境で発生させることで訓練を行いました。

  1. DBへのアクセス設定に不備があり、Batchサーバの起動ができない
  2. ソースコード内のUpdate文に不具合あり、意図しないデータ破壊を発生させている

普段のリリース作業を行ったところ障害が発生した想定で行いました。リリース直後にはアプリケーションログ/サーバーに異常ないか見ていますが、その時に異常を検知し、訓練開始です。対応方法は冒頭で説明した障害対応フローに則って行いました。

また今回は若手の障害対応力を向上させることが目的なので、 指揮官 報告者 対応者 を主に新卒1~4年目のメンバーで行いました。ちなみに私は 報告者 を担当しました。

やってみての学び

1. 情報を集める場所を作ろう

実際の障害を目の前にすると経験が浅い人はあたふたすると思います。訓練でもそんな状況になりました。

とりあえずログをみて原因を突き止めようということで、 対応者 みんなが手当たり次第ログを見て、様々なSlackチャンネルに情報共有しました。 そのため、オンライン上でのやりとりが中心になり、誰が調査に参加しているのかわからない・抜け漏れがある調査をしている・ 指揮官 が効率良く情報収集ができない、という問題が発生しました。

状況を図にすると以下の状態です。

今回の様子

as_is

あるべき姿

to_be

情報共有をしよう

スプレッドシートやホワイトーボートなどに情報をまとめていくと、現状を一目で理解できるようになります。特にホワイトボードは、自然と人がそこに集まってくるというメリットがあります。
また共有すべき情報は以下のようなものになると思います。

2. 1つの障害の障害に対し1つの運用体制をつくろう

今回は2つの障害を発生させたからこそ発見できたのですが、1つの体制で2つ障害を対応するのは無理がありました。指揮官 報告者 が作業進捗を共有されるたびにどちらの障害の話をしているかわからず、コミュニケーションコストが無駄に発生したためです。

1つの障害に対して1つの体制を作るべき だと学びました。

to_be_2

3. 対応のパターンはあらかじめ用意しておこう

DBへのアクセス設定に不備があり、Batchサーバの起動ができない
ソースコード内のUpdate文に不具合あり、意図しないデータ破壊を発生させている

今回は以下のような流れで対応を取ることで、迅速に1次対応はできました。

1. アプリケーションログからデータ破壊が起きている可能性を発見
2. データ破壊を起こしている箇所.エンドポイントを特定
3. データが破壊されたことによる、影響範囲を調査する
4. 被害を最小限にするためにサービスをメンテナンス画面に切り替え

ここから以降のフローは改善の余地があったかと思います。実際にとったフローは以下の通りです。

5. 対象のUpdate文を修正する
6. 破壊されたデータを特定する
7. データの普及方法を検討し実行する
8. 修正後のアプリケーションをリリースする

問題点は全て解決するまで、サービス全範囲を止めてしまっていたことです。今回であれば、メンテナンス画面切り替え後に以下のような判断をすべきでした。

基本的な対応方法は事前に準備しよう

などの良くある対応方法に関しては、どういう条件でその対応をするか事前に決めておくと良いかと思います。1次対応をすぐにできることで2次災害を防止でき、早期の復旧に繋がると思います。
他には、ログの調査を素早くするために、Linuxの各種コマンドは使いこなせるように日々トレーニングしておいた方が良いと思いました。

感想

最後に

余談ですが、 指揮官報告者 は誰がやっているか直感的にわかりやすくするため、マリオとルイージの帽子をかぶることルールがあります。

boushi
蒲池柾紀(ちーかま)
蒲池柾紀(ちーかま)

2015年新卒入社。主にサーバーサイドエンジニアです。