Terraform State
Terraform がインフラの現在の状態を管理するファイルとリモートバックエンド
IaC
Terraform State とは
Terraform State は、Terraform が管理するインフラリソースの現在の状態を記録する JSON ファイル (terraform.tfstate) である。Terraform は State と設定ファイル (.tf) を比較して、何を作成・変更・削除するかを決定する。
terraform plan の動作:
設定ファイル (.tf) ← 望ましい状態
State ファイル ← 現在の状態
差分 = plan ← 実行すべき変更
State がないとどうなるか
State がなければ、Terraform は既存のリソースを認識できない。terraform apply を実行するたびに、既存のリソースを無視して新しいリソースを作成しようとする。State は「Terraform が管理しているリソースの一覧」だ。
リモートバックエンド
State ファイルをローカルに保存すると、チームメンバー間で共有できず、同時に terraform apply を実行すると State が壊れる。リモートバックエンドで State を一元管理する。
S3 + DynamoDB (AWS 標準)
terraform {
backend "s3" {
bucket = "myapp-terraform-state"
key = "prod/terraform.tfstate"
region = "ap-northeast-1"
dynamodb_table = "terraform-locks" # ステートロック
encrypt = true
}
}
- S3: State ファイルの保存 (バージョニング有効)
- DynamoDB: ステートロック (同時実行の防止)
- 暗号化: State には機密情報が含まれるため必須
State に含まれる機密情報
State ファイルには、DB パスワード、API キー、IAM ロールの ARN など機密情報が平文で含まれる。
対策:
- S3 バケットの暗号化 (SSE-S3 or SSE-KMS)
- S3 バケットのパブリックアクセスブロック
- State ファイルを Git にコミットしない (
.gitignoreに追加)
ステートロック
2 人が同時に terraform apply を実行すると、State が破損する。DynamoDB テーブルでロックを取得し、同時実行を防止する。
User A: terraform apply → DynamoDB ロック取得 → 実行中...
User B: terraform apply → ロック取得失敗 → "Error: state locked"
User A: 完了 → ロック解放
User B: terraform apply → ロック取得 → 実行
SAM/CloudFormation との違い
SAM/CloudFormation は State を AWS 側 (CloudFormation スタック) で管理するため、State ファイルの管理が不要だ。Terraform は State を自前で管理する必要がある分、マルチクラウド対応や柔軟性が高い。
State の管理方法
| 方法 | 説明 | 推奨 |
|---|---|---|
| ローカル | ファイルシステムに保存 | ❌ チーム開発に不向き |
| S3 + DynamoDB | リモートバックエンド | ✅ AWS 推奨 |
| Terraform Cloud | マネージドサービス | ✅ |
Terraform State の関連書籍も参考になる。