システムメンテナンスを事故なく終わらせるためのTips

システム運営をやっていると、システムメンテナンスをやらないといけない場面が出てきます。 ミドルウェアのバージョンアップ、データのマイグレーション、大きな機能リリースなどなど。 そこで事故なくメンテナンスを終わらせるためのTipsを書き残しておきます。

メンテナンス前

  • メンテナンス数週間前に関係各所(主に社内)に連絡をする
    • メンテナンス当日に大きな機能リリースやキャンペーンなどが無いかを確認する。あればメンテナンス日をずらす。
  • ユーザへのメンテナンス通知
    • アプリやWeb、SNS上でユーザに対しメンテナンスのお知らせを出す
  • メンテナンス手順書を作る
    • これが最も肝心。必ず作成すること。一度作成すれば次回のメンテナンス時にも手順書を流用できる。そして毎回手順書をブラッシュアップしていくことでどんどんミスが少ないメンテナンスができるようになる。
    • 必ず手順書はレビューしてもらう。
    • メンテナンス実施時には、手順をなぞるだけでメンテが完了するように、手順書は詳細かつ分かりやすく書く。特に深夜メンテナンス時は眠気と緊張で頭が普段の半分以下しか働かないものと想定する。
  • 手順書について
    • メンテ前に事前に行うことのチェックリストを設けておく(次回に使える)
      • たとえば関係各所への連絡、作成すべきプルリクエストや、止めておくバッチの確認など
    • 文章だけでは分かりにくい部分は画像で伝える。
    • サーバーに入ってなにかコマンドを実行する場合は具体的なコマンドを載せる
      • 例えば「Webサーバーを止める」という文章だけではなく止める際のコマンドを正確に書く。
    • メンテナンスの目的がきちんと達成されたかを確認する項目を設ける
      • メンテナンスを開けたあとに実はバージョンが上がってなかったとか、一部DBマイグレーションが失敗していたとかそういうことが稀に発生します。なので必ずメンテナンス中に目的が達成されたか確認をする。
    • 行うべき動作確認をリストアップしておくこと
      • メンテナンス後、システム影響(エラー等)が出ていないかを確認しますが、その際確認すべき項目をリストアップしておく。例えばよくあるのは会員登録からコンバージョンまでの一連のフロー。
    • 切り戻し手順を書いておく。切り戻しを行うデッドラインの時間を決めておく。
      • メンテナンス中に思わぬシステム影響が発生することを想定する
    • 細かいが重要なこと
      • メンテナンス中に止めるべきバッチ、メンテナンス後手動で再開すべきバッチを確認しておく
  • メンテナンスのリハーサルをする
    • これもかなり重要。一度リハーサルをしておくとメンテナンス当日の安心感が違う。
    • リハーサルをやると手順書通りにうまくいかないことが判明したりする。またステージング環境などできるだけ本番に近い環境でリハーサルを行っておく。この際、メンテナンスにかかった時間を測っておく。
  • メンテナンス当日に社内にリマインドをする
    • 忘れている人が多いので、今日この時間帯にメンテナンスをやりますと周知する。

メンテ時

  • Zoomをつなぎつつ、各作業開始/終了の報告はSlackで行う
    • 各作業というのは、「ユーザのアクセスを止める」とか「Webサーバーを止める」とか「DBのスナップショットを取得する」とか「動作確認をする」とかそういう細かい作業
    • これは結構個人的には重要だと思っている。各作業は平行して行うことが多いので自分の作業中に相手から口頭で各作業の開始終了を伝えられても覚えてられないんですよね。お互い、え、いまどこやってるんだっけ?みたいことになる。そうすると事故につながりかねない。
    • Slackで各作業開始/終了を書き残しておくと、メンテナンス作業に伴うシステム障害やメンテナンス時にうまくいかなかった場合の調査に役立つ。この作業とこの作業の間に問題が起きたからこの作業が影響しているのではみたいなことがすぐに分かる。これが口頭だと残らない(レコーディングしてても時間を割り出すのは面倒)。
  • 監視を止める
    • メンテナンス中にオンコールが発生してメンテナンス対応者以外のエンジニアが起こされることがないようにしましょう。自分は面倒なので全部の監視を止めてますがそれだと気づくべきアラートに気づけないという問題もあるので理想的には最低限の監視だけ止められるとよい。
  • SentryやRollbarを確認する
    • メンテナンス中に動作確認をすると思いますが、その際実は裏でエラーが発生していたということもあります。またメンテナンスを開けたあと、一般のユーザがアクセスしだした後も一応確認すると良い。リアルアクセスに勝る動作確認はない。
  • メンテが終わったらSlackで無事終わった報告をする
    • メンテナンス後他のエンジニアがメンテナンスは無事に終わったのか心配にならないように報告しておきましょう。
  • もし切り戻しをした場合や、なにか引き継ぎが必要な場合はSlackに細かく書いてきちんと引き継ぐこと。

メンテ後

  • メンテナンス振り返り(KPT)をする
    • 多くの場合、メンテナンスは改善の余地がたくさんあるものだと思います。手順書のブラッシュアップや一部作業の自動化など。
    • ポストモーテムと同じで振り返りで出たアクションアイテムは必ず対応すること

その他

  • インフラ/SRE以外のエンジニアにも時々参加してもらう
    • メンテナンス作業はインフラ/SREが行うことが多いと思いますが、インフラ/SRE以外のエンジニアに参加してもらうことで、システムの理解が深まったり、いざというときにメンテナンス時の知見が役立ったりします。