地獄の「リージョン全滅」を生き残る:TerraformによるDR自動化の極意
SREの現場において、最悪のシナリオは「クラウド事業者のリージョンごと沈むこと」だ。多くのチームが「DR環境を作る」と言いながら、手動運用の残骸や、微妙に構成がズレた「ハリボテのスタンバイ環境」を構築して自滅する。
真のDRとは、「コードがインフラの真実である」という原則をマルチリージョンに拡張することに他ならない。本稿では、Terraformを駆使し、DR発動時に焦らずボタン一つでフェイルオーバーを完結させるためのアーキテクチャを伝授する。
—
1. Stateの分離:DR設計の「生命線」
DRにおける最大のミスは、単一のTerraform Stateで全リージョンを管理することだ。これでは、プライマリ側の破壊的変更(破壊的更新など)が、DR環境に波及して共倒れするリスクがある。
ベストプラクティス:Terragruntによる疎結合化
`terragrunt.hcl` を使い、ディレクトリ構造をリージョンごとに物理的に分断せよ。
ディレクトリ構造
.
├── prod-ap-northeast-1/
│ └── terragrunt.hcl
└── dr-ap-northeast-2/
└── terragrunt.hcl
これにより、リージョン間の依存関係を遮断し、万が一の際にもDR側のPlan/Applyが独立して動作することを保証する。
—
2. 変数設計:動的マッピングによる抽象化
AMI IDやVPC CIDRを直書きするな。DR発動時に「どのリージョンのどのIDを使うか」を脳内で変換していては遅すぎる。`variables.tf` でリージョン情報をマッピングし、ロジックをコードに埋め込め。
variable “region_config” {
type = map(object({
ami_id = string
vpc_cidr = string
}))
default = {
“ap-northeast-1” = { ami_id = “ami-0123456789”, vpc_cidr = “10.0.0.0/16” }
“ap-northeast-2” = { ami_id = “ami-9876543210”, vpc_cidr = “10.1.0.0/16” }
}
}
リソース定義側ではこう呼ぶ
resource “aws_instance” “web” {
ami = var.region_config[var.target_region].ami_id
# …
}
この設計なら、DR発動時に `TF_VAR_target_region=”ap-northeast-2″` を流し込むだけで、一撃でスタンバイ環境が起動する。
—
3. クロスリージョン・レプリケーションのIaC化
DB(RDS)やストレージ(S3)の同期は、Terraformで「定義」し、あとはクラウド側の自動同期機能に任せるのが鉄則だ。
- RDS: `replicate_source_db` を利用し、プライマリリージョンを指定してリードレプリカを作成する。
- S3: `aws_s3_bucket_replication_configuration` をコード化し、ライフサイクルルールと併せてレプリケーションを自動化する。
プロの視点: これらを「DR専用モジュール」として切り出し、プライマリ環境のコードから `module` として参照させることで、DR構成の「設定漏れ」を物理的にゼロにする。
—
4. 現場の戦闘力を底上げする「神ツール・設定」
ここからは、チームの生産性を劇的に向上させる「隠れた技術」だ。
必須プラグイン
- `terraform-ls` (Language Server): エディタ(VSCode等)でシンボルジャンプ、オートコンプリートを完璧にする。これなしでIaCは不可能だ。
- `tflint`: クラウド固有のベストプラクティスを静的解析する。`tflint-ruleset-aws` は必須。
開発効率を上げる隠れたショートカット
- VSCode `Ctrl + Shift + P` -> `Terraform: Format`: チーム開発では、保存時にフォーマットが自動実行される設定(`”editor.formatOnSave”: true`)を強制せよ。PRで「フォーマット崩れ」の指摘をするのは時間の無駄だ。
チーム開発のルール:`.terraform.lock.hcl` を守れ
依存モジュールのバージョンがメンバー間でズレると、不可解なバグが生まれる。このファイルをGitの管理下に置くことは、DR環境の安定性を担保するための最低限の教養だ。
—
5. 実践:DR発動を想定した運用フロー
DRは「作る」ことよりも「使いこなす」ことが難しい。
1. Planの自動化: 毎日深夜に全リージョンの `terragrunt plan` を実行し、Slackに結果を投げる。差分が出たら即座に「DR環境が乖離している」というアラートとして扱う。
2. フェイルオーバー・ドリル: 四半期に一度、DR環境への本番トラフィック切り替えをTerraformの `apply` を使ってシミュレーションする。
最後に:
DRとは保険ではない。「いつか必ず起きる障害を、いかに予定された作業として消化するか」という高度なオペレーション戦略だ。コードを書き、テストし、自動化し、そして「いざという時」にPlan/Applyを叩く。その冷徹なまでのエンジニアリングこそが、ビジネスを止めない唯一の道である。
さあ、コードを書いて、インフラを「再定義」せよ。