障害時に直前の状態へ戻すロールバック

ロールバックは、デプロイや変更を行ったあとに問題が発生したとき、直前の正常な状態に戻す作業です。

文章を編集していて変な形になったら、Ctrl+Z で一つ前に戻します。落ち着いてから、改めて正しく直す。ロールバックは、いわば本番環境の Ctrl+Z です。デプロイや設定変更のあとに問題が起きたら、直前の正常な状態へ素早く巻き戻します。

どれだけ事前にテストしても、本番で初めて表に出る問題はあります。そのとき、問題のある新しい状態をその場で直すより、問題のなかった古い状態へ戻すほうが早いことがよくあります。正しく直すことより、まずサービスを正常に戻すことを優先する。そのための切り戻しの手順です。

戻すか、その場で直すか

開発チームのチャット
監視の通知

エラーの発生件数が急に増えています。

開発リーダー

30分前のデプロイが怪しい。原因を調べるのは後にして、まず前の版に戻そう。

次のような状況では、ロールバックが候補になります。

  • デプロイの直後から、エラーや不具合が増えてサービスに影響が出ている
  • データベースの構造変更(マイグレーション)を適用したら、アプリが正常に動かなくなった
  • 設定を変えたら、処理の速さが急に落ちた
  • 公開した機能に重大なバグが見つかり、修正に時間がかかりそう

障害のさなかに「戻すかどうか」を議論し始めると、そのぶん影響が長引きます。どんな状態になったら戻すのか、誰が判断するのか、どの手順で戻すのかを、あらかじめチームで決めておきます。デプロイ後の異常にすぐ気づけるよう、監視を整えておくことも前提になります。

戻せない変更もある

Ctrl+Z がいつでも効くとは限りません。直前のバージョンをすぐに置き直せる仕組みがなければ、そもそも戻せません。

特に気をつけたいのが、データに触る変更です。データベースの構造を変えたり、データを削除したりした場合、プログラムだけを古い版に戻しても、データは元に戻りません。マイグレーションには、元に戻す手順を一緒に用意しておくのが慣習です。データそのものを戻すには、バックアップからの復元が必要になることが多いので、戻せない変更を入れる前には、戻れないことを承知のうえで進めるかを確認しておきます。

戻したあとにやること

ロールバックは、問題をなかったことにする手段ではありません。サービスを正常に戻すための応急処置です。戻したあとで原因を調べ、修正して、改めてデプロイし直す。ここまで終えてはじめて、障害への対応が完了します。