初めに
とある新規開発案件にて、結合試験中に誤って検証環境のデータを消してしまった事故の話です。
その背景と事故の対処、再発防止をしたかを自分への戒めとともに、このようなことが他でも起こらないようになればと思い、共有します。
そもそもなにをやっていたのか
私はチームリーダー兼プレイヤーとして、結合試験の課題もやりつつ、プロジェクト管理などを担当していました。
そこで、課題対応をするために、検証環境からデータを抽出して、ローカルで取り込んでデバッグをしていました。
デバッグ都度、データの入れ替えか必要だったため、mysqlのTRUNCATE
とデータインポートを繰り返していました。
事件は突如起こる
前述の通り、マルチタスクで作業していたため、接続先が「検証環境」になっていることに気づかない。
その状態で、以下の操作をしてしまう。
- A5M2で読み取り専用で接続する。
- TRUNCATEを実行する。
- データをインポートする。
- ローカルデバッグする。
あれ、さっきまでデバッグがうまく行っていたのに、意図する動作にならない。
ん?もしかして!!
と思い、参照先を見ると「検証環境」になっていた。
事故の処理
- テスターチームにデータが消えてしまったことと、結合試験をストップして、単画面の確認をしてもらうように手配。(消えたのは一部テーブルのため。)
- インフラチームにRDSバックアップからの復元を依頼する。(前日時点に戻るのは止む終えない)
負の連鎖は続く
いざ、インフラチームがRDSバックアップから復元が始まる。
エラーメールがものすごい勢いで来るぞ...
コネクションエラー?
そう、本システムでは、ジョブキューを利用して、キューの監視で定期的にDBのデータ取得が行われていました。
また、それだけでなく並列処理もあるため、約50のプロセスでひたすらコネクションエラーが発生していた。
まずいと思い、ジョブキューを停止させるとともに、アプリをメンテナンスモードに変更する。
(この対応を取るまで2時間近く経過していた)
これで一安心。
まだ終わらない負の連鎖
エラーメールは、所属の親会社ドメインのアドレスに送られてきていて、更にそれを所属会社ドメインのメールに転送していた。
(私を含め、3名のメンバーが同様に設定していた)
■参考までにメールの流れ
システムからエラーメール送信
↓
親会社の開発環境メールサーバー
↓
Gmailから転送
↓
所属会社メールサーバ
それによって所属会社のメールサーバがパンクする。
メールの受信が遅い、メール送信がエラーになるなど周りがざわつく...
(親会社の方はGmailを使用していたため、Gmail側で制御されて、途中から受信間隔が遅延されるようになった)
社内システムに相談を持ちかける。
メールキューの削除はできるが、対象の絞り込みができない(=本来必要なメールが消失する可能性がある)。
また、Gmailからの転送が止まっていないため、この状況がいつまで続くかわからない。
ということで、親会社に連絡してメールキューを削除できないか相談する。
幸い、今回開発用メールサーバを使用しており、メールキューにエラーメール以外ないことがわかり、削除してもらう。
これで火消しが終わる。
再発防止
今回の事象が本番環境で起こさないために、
- A5M2の読取専用では、
TRUNCATE
は実行できてしまうため、参照のみしたい場合には、そもそもDB側に参照用のユーザーを作成する。(mysqlではTRUNCATEはロールバックできない仕様) - DB接続が停止した際に、アプリとしてどのような作業が必要になるか把握しておく。(もちろん試験も実施する)
- マルチタスクは極力避ける
ということをやっていきます!
最後に
1つのミスで、手戻りも含めると15名×8h=120h
のコストをロストしたことになりました。
検証環境だったから、ビジネス的な影響はありませんでしたが、とても反省すべきミスでした。
今後はこのようなミスを起こさないような確認と、「データを消す」行為をするときは細心の注意をして作業しようと思いました。
皆さんもくれぐれも気をつけましょう...