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 の関連書籍も参考になる。

関連用語