デプロイメント・ロールバック戦略

英語名 Deployment Rollback
読み方 デプロイメント ロールバック
難易度
所要時間 30分〜1時間
提唱者 DevOps / SRE
目次

ひとことで言うと
#

リリースしたバージョンに問題が見つかったとき、素早く前のバージョンに戻す仕組みと手順。「デプロイは必ずうまくいく」前提ではなく、「問題があったらすぐ戻せる」前提で設計する。

押さえておきたい用語
#

押さえておきたい用語
Rollback(ロールバック)
問題のあるバージョンから前の安定バージョンに戻す操作のこと。手動と自動の両方がある。
MTTR(Mean Time To Recovery)
障害発生から復旧までの平均時間を指す。ロールバック体制が整っているとMTTRが大幅に短縮される。
Blue-Green Deployment
本番環境を2面(Blue/Green)用意し、切り替えでダウンタイムゼロのデプロイとロールバックを実現する方式。
Expand-Contract Pattern
DBスキーマ変更を「追加→移行→削除」の3段階で行い、どの時点でもロールバック可能にする手法である。
Canary Release(カナリアリリース)
全ユーザーに展開する前に、一部のトラフィックだけに新バージョンを配信して問題を早期検知する手法

デプロイロールバックの全体像
#

デプロイロールバック:問題検知から復旧までのフロー
Deploy新バージョン展開Monitorメトリクス監視Detect問題検知Rollback前版に復帰ロールバックの方式自動ロールバックエラー率やレイテンシの閾値超過で自動発動Blue-Green: DNS/LB切り替え(秒単位)K8s: 旧ReplicaSetにロールバックMTTR: 1〜5分手動ロールバックオンコール担当が判断して実行CIパイプラインで前バージョンを再デプロイDB migrationの巻き戻しが必要な場合MTTR: 10〜30分ロールバックは「戻せる設計」がないと動かない
ロールバック体制構築の進め方フロー
1
ロールバック可能な設計
DB migration・API・設定の後方互換を確保
2
自動検知の整備
デプロイ後のエラー率・レイテンシ監視を設定
3
Runbook整備
誰でも実行できるロールバック手順書を作成
自動化
閾値超過時の自動ロールバックをパイプラインに組み込み

こんな悩みに効く
#

  • デプロイ後に問題が発覚しても、復旧に数時間かかる
  • ロールバック手順が属人的で、特定のエンジニアがいないと戻せない
  • DB migrationを含むデプロイが怖くてリリース頻度を上げられない

基本の使い方
#

ロールバック可能な設計にする

ロールバックの最大の障壁はDBスキーマ変更。以下のルールを守る。

  • カラム追加は後方互換: 新カラムはNULL許可またはデフォルト値付き
  • カラム削除は2段階: まずアプリから参照を外し、次のリリースで物理削除
  • APIの破壊的変更は避ける: バージョニングで旧クライアントをサポート
デプロイ後の自動監視を設定する

デプロイ直後に以下のメトリクスを監視し、閾値を超えたらアラートを出す。

  • エラー率(5xx)の急増
  • P95レイテンシの悪化
  • ヘルスチェックの失敗
ロールバック手順をRunbookにまとめる
「誰が見ても実行できる」レベルのRunbookを書く。コマンドをコピー&ペーストで実行できる粒度が理想。四半期ごとにロールバック訓練を実施する。

具体例
#

例1:ECサイトがBlue-Greenで秒単位のロールバックを実現する

月間GMV10億円のECサイト。以前、決済処理のバグで30分間注文不能になり、推定1,500万円の機会損失が発生した。

Blue-Green Deploymentを導入し、ALBのターゲットグループ切り替えでロールバックを実装。

指標BeforeAfter
ロールバック所要時間25分15秒
デプロイ頻度週1回日2回
デプロイ起因障害の損失推定1,500万円/回ほぼゼロ

ALBの重み付きルーティングでカナリアリリースも併用し、全展開前に5%のトラフィックで問題を検知できるようになった。

例2:SaaSプロダクトがDB migrationの安全なロールバックを確立する

エンタープライズ向けHR SaaS。テーブル構造の変更を伴うリリースが月2〜3回あり、ロールバック不能になるリスクを常に抱えていた。

Expand-Contractパターンを導入。

  1. Expand: 新カラム/テーブルを追加(旧バージョンと共存可能)
  2. Migrate: 新バージョンのアプリをデプロイし新旧両方を参照
  3. Contract: 旧バージョンの参照がゼロになったら旧カラムを削除

各フェーズが独立したデプロイになるため、どの時点でもロールバック可能。導入後1年で「ロールバック不能なデプロイ」はゼロになった。

例3:モバイルゲームが自動ロールバックで深夜障害を防ぐ

DAU50万人のモバイルゲーム。深夜のメンテナンス後にAPIサーバーを更新するが、オンコール担当が対応遅れで4時間障害が放置されたことがあった。

ArgoCD + Prometheus + Argo Rolloutsで自動ロールバックを構築。

  • デプロイ後5分間のエラー率が2%を超えたら自動ロールバック
  • P95レイテンシが500msを超えたら自動ロールバック
  • ロールバック実行時にSlackとPagerDutyに自動通知

人間の判断なしで 平均3分で自動復旧 できるようになり、深夜デプロイの安全性が飛躍的に向上した。

やりがちな失敗パターン
#

  1. ロールバックをテストしない — デプロイのテストだけでなくロールバックのテストも行う。本番で初めて試みると想定外の問題で失敗する
  2. DB migrationを1ステップで行う — カラム追加・データ移行・旧カラム削除を1つのmigrationでやるとロールバック不能になる。必ずExpand-Contractパターンで段階的に
  3. ロールバック判断基準が曖昧 — 「なんかおかしい」では判断が遅れる。「エラー率X%以上」「レイテンシY ms以上」のように数値で明確にする
  4. 前バージョンのアーティファクトを保持しない — Dockerイメージやバイナリを削除するとロールバックできない。最低でも直近5バージョンは保持する

まとめ
#

デプロイロールバックは 「すべてのデプロイは失敗し得る」 という前提に立ち、問題発覚時に素早く前のバージョンに戻す仕組み。ロールバック可能な設計(特にDB migrationの後方互換)が土台になり、その上にデプロイ後の自動監視と明確な判断基準を載せる。Blue-Green Deploymentや自動ロールバックで復旧を秒〜分単位にできれば、デプロイ頻度を上げる心理的安全性も確保できる。