メインコンテンツまでスキップ

フェイルオーバー手順

マルチリージョン構成バックアップが準備できたら、実際の切り替え手順を整理します。DR のフェイルオーバーは Blue-Green デプロイと似ていますが、計画外で実行される点が異なります。


Blue-Green デプロイとの違い

Blue-Green デプロイDR フェイルオーバー
タイミング計画的(リリース時)計画外(障害時)
精神状態落ち着いているパニックになりやすい
準備時間数時間〜数日なし(即座に判断)
ロールバック容易(旧環境が残っている)困難(Primary が壊れている可能性)
データ同期レプリケーション稼働中レプリケーションが切れている可能性

だからこそ手順を事前に整理し、定期的に訓練しておく必要がある。


そもそも操作できるのか

DR が必要な状況では、操作する側も被災している可能性がある。手順書があっても実行できなければ意味がない。

人の問題

リージョン障害 = その地域のインフラ全体が影響を受ける可能性

オペレーターが同じ地域にいる場合:
├── 地震・台風 → オペレーター自身が被災
├── 停電 → 自宅のネットワークも使えない
└── 深夜の障害 → そもそも気づかない

対策:
├── オンコール体制を複数リージョン / 拠点で組む
│ → 東京が被災しても大阪のメンバーが対応
├── リモートワーク前提 → 複数の通信手段(携帯回線 + 自宅回線)
└── 自動フェイルオーバーを最大限活用
→ 人の介入なしで復旧できる範囲を広げる

ツールの問題

DR 操作に使うツールが Primary リージョンに依存していないか?

確認すべき項目:
□ クラウドの管理コンソール → 通常はグローバルサービス(OK)
□ CI/CD パイプライン → どのリージョンで動いている?
□ 踏み台サーバー / VPN → Primary リージョンだけに置いていないか?
□ チャットツール(Slack 等) → SaaS なら通常 OK
□ ページングツール(PagerDuty 等) → SaaS なら通常 OK
□ IaC の state ファイル → S3 + DynamoDB がどのリージョンにある?
□ シークレット(DB パスワード等) → Primary リージョンだけに保存していないか?

対策:
├── CI/CD はマルチリージョン or SaaS(GitHub Actions 等)
├── 踏み台 / VPN は DR リージョンにも配置
├── シークレットは DR リージョンにレプリケーション
└── IaC の state は別リージョンにバックアップ

自動化で人の介入を減らす

理想:
┌──────────────────────────────────────────────┐
│ 人が何もしなくても復旧する範囲を最大化する │
│ │
│ 自動: │
│ ・DNS ヘルスチェック → 自動切替 │
│ ・DB フェイルオーバー → 自動昇格 │
│ ・アプリ → オートスケーリングで自動起動 │
│ │
│ 手動(人が必要): │
│ ・フェイルオーバーの「判断」(自動が不適切な場合)│
│ ・フェイルバック(Primary に戻す) │
│ ・ステークホルダーへの報告 │
└──────────────────────────────────────────────┘

→ 深夜に地震が来ても、DNS + DB + アプリが自動復旧
→ 朝出社したら DR リージョンで動いている状態が理想

フェイルオーバーの判断

いつフェイルオーバーするか

自動フェイルオーバー(DNS ヘルスチェック):
・全エンドポイントが応答なし → 自動で DR リージョンに切替
→ 明確なダウンは自動で対応

手動判断が必要:
・一部 AZ のみ障害(全体ではない)
・性能劣化だがダウンではない
・クラウドプロバイダーが「復旧中」と発表

判断基準:
┌──────────────────────────────────────────────────┐
│ │
│ 「30分以内に復旧の見込みがあるか?」 │
│ │
│ YES → Primary の復旧を待つ │
│ (ただし30分後に再判断) │
│ │
│ NO or 不明 → DR フェイルオーバーを開始 │
│ │
└──────────────────────────────────────────────────┘

フェイルオーバーのリスク

フェイルオーバーにもリスクがある:

・レプリカラグ分のデータ損失(通常数秒、障害時は増大の可能性)
・DR 環境が本番と完全に同一でない可能性
・DR 環境の容量が不足している可能性(Pilot Light の場合)
・フェイルバック(Primary に戻す)が難しい

→ 「フェイルオーバーしない方がリスクが高い」と判断した場合に実行

フェイルオーバー手順

Step 1: 状況確認(5分)

□ Primary リージョンの状態を確認
・クラウドプロバイダーのステータスページ
・ヘルスチェックの状態
・DB のステータス

□ DR リージョンの状態を確認
・DB レプリカのステータスとラグ
・アプリの状態(稼働中 or 停止中)

□ IC が Sev 1 を宣言、DR フェイルオーバーを決定

Step 2: DB の昇格(5〜15分)

DR リージョンの DB を Writer に昇格:

Global Database の場合:
・Secondary クラスタを Primary に昇格
・旧 Primary との接続を切断
・数分で完了

スタンドアロンレプリカの場合:
・レプリカを昇格
・接続先エンドポイントをアプリに設定

確認:
□ 昇格が完了したか
□ Writer として書き込み可能か
□ 最後のレプリカラグを記録(データ損失量の推定)
□ 昇格後の最終書き込みタイムスタンプを確認
(SELECT max(created_at) FROM 主要テーブル でデータの鮮度を検証)

Step 3: アプリの起動 / スケールアウト(5〜15分)

Pilot Light の場合:
・DR リージョンのアプリを起動
・起動完了を待機
・ヘルスチェックが通ることを確認

Warm Standby の場合:
・DR リージョンのアプリをスケールアウト(1台 → 4台等)
・全台のヘルスチェックが通ることを確認

Active-Active の場合:
・既に稼働中。追加作業なし

Step 4: DNS 切り替え(数秒〜数分)

DNS のルーティングを DR リージョンに変更:
・重み付き: Primary 100 → 0, DR 0 → 100
・フェイルオーバー: ヘルスチェック連動で自動(既に切り替わっている可能性)

確認:
□ DNS の伝搬を確認(dig コマンド等)
□ DR リージョンにトラフィックが来ているか
□ ユーザーがアクセスできるか

注意:
DNS の TTL によっては、切り替えが反映されるまで数分〜数十分かかる
→ TTL は事前に短く設定しておく(60秒推奨)

Step 5: 動作確認(10分)

□ ログインフロー手動テスト
□ トークン発行確認
□ 主要テナントの動作確認
□ エラー率の監視
□ レイテンシの確認(DR リージョンの方が遅い可能性)

Step 6: 報告

□ 「DR フェイルオーバー完了」をステークホルダーに報告
□ データ損失の推定値を報告(レプリカラグ分)
□ フェイルバック(Primary に戻す)の計画を策定

フェイルバック(Primary に戻す)

Primary リージョンが復旧したら、元に戻す作業が必要。フェイルオーバーより難しい。

なぜ難しいか:

フェイルオーバー後:
DR リージョンが Primary になっている
→ DR に新しいデータが書き込まれている
→ 旧 Primary にはそのデータがない

フェイルバックするには:
① DR → 旧 Primary にデータを同期
② 旧 Primary が追いついたことを確認
③ DNS を旧 Primary に戻す
→ 実質的に「逆方向の DR フェイルオーバー」

推奨:
・急いで戻す必要はない
・DR リージョンで安定稼働を確認
・計画的なメンテナンスウィンドウでフェイルバック
・Blue-Green デプロイと同じ手順で切り替え

まとめ

DR フェイルオーバーの原則:

1. 判断基準を事前に決めておく(30分ルール)
2. 手順を事前にドキュメント化しておく(この文書)
3. パニックにならない → 手順に従う
4. フェイルバックは急がない → 安定してから計画的に
5. 定期的に訓練する → Game Day

次のステップ