Skip to main content

Terraform で Remote tfstate を S3 に保存する

はじめに #

Terraformを使ってインフラをコードとして管理する際、状態ファイル(terraform.tfstate)の管理は非常に重要です。デフォルトではローカルに保存されますが、複数人での作業や環境の一貫性を保つためには、リモートストレージへの保存が推奨されます。今回は、S3を使ってTerraformの状態ファイルをリモート管理する方法について書きます。

tfstate とは #

terraform.tfstate ファイルは、Terraform が管理するインフラの「現状」を記録したファイルです。
このファイルには、作成されたリソースのIDや属性、依存関係などの詳細が含まれています。

役割

  • インフラの現状把握: どのリソースが管理下にあるかを把握。
  • 差分の計算: terraform plan コマンドで現在のインフラとコードの差分を確認。
  • 破壊的変更の防止: 意図しない変更や削除を防ぐ。

※ tfstateファイルには重要な情報(例: パスワードやAPIキー)が含まれる場合があるため、適切な管理が必要です。

tfstateをS3に保存するメリット #

  • チームでの共同作業
    • 複数人が同じ状態ファイルにアクセスできるため、作業の競合を防げます。
  • ロック機能の利用(DynamoDBと併用)
    • S3とDynamoDBを組み合わせることで、state locking(状態のロック)を実現し、同時に複数人が変更を加えることによる競合を防止できます。(今回はやりません。)
  • バックアップと履歴管理
    • S3のバージョニング機能を有効にすれば、過去のtfstateファイルに簡単にロールバックできます。
  • セキュリティ管理の強化
    • IAMポリシーでアクセス制御を細かく設定可能。

S3 バケットを Terraform で作成 #

.tf ファイルを作成します。

mkdir backend
cd backend
touch main.tf

main.tf

provider "aws" {
  region = "ap-northeast-1"
}

# S3バケット
resource "aws_s3_bucket" "terraform_state" {
  bucket = "my-terraform-tfstate-bucket" # ユニークなバケット名
}

# バージョニング設定
resource "aws_s3_bucket_versioning" "versioning" {
  bucket = aws_s3_bucket.terraform_state.id

  versioning_configuration {
    status = "Enabled"
  }
}

# サーバーサイド暗号化設定
resource "aws_s3_bucket_server_side_encryption_configuration" "encryption" {
  bucket = aws_s3_bucket.terraform_state.id

  rule {
    apply_server_side_encryption_by_default {
      sse_algorithm = "AES256"
    }
  }
}

一旦これで実行します。

terraform init
terraform plan
terraform apply

terraform.tfstate などが生成され、S3 バケットが作成されていれば OK です。

aws s3 ls s3://my-terraform-tfstate-bucket

※ .tf ファイルを git 管理する場合は、.gitignore の作成もしておきましょう。

# Terraform Stateファイル(機密情報を含むため絶対に無視すること!)
*.tfstate
*.tfstate.backup

# Terraformのクラッシュログ
crash.log

# Terraformのプランファイル(`terraform plan -out` で生成される)
*.tfplan

# Terraformのロックファイル(ローカル用)
.terraform.lock.hcl

# Terraformの実行ディレクトリ
.terraform/

# 環境変数や一時的な認証情報ファイル
*.env
*.tfvars
*.tfvars.json

# macOS用の不要ファイル
.DS_Store

# VSCodeやIDE用の設定ファイル
.vscode/
.idea/
*.swp

# バックアップファイル
*~

tfstate を S3 に移行する #

以下を追記し、先ほど作成した S3 バケットを backend に設定します。

terraform {
  backend "s3" {
    bucket = "my-terraform-tfstate-bucket"  # 後から作成
    key    = "global/s3/terraform.tfstate"
    region = "ap-northeast-1"
  }
}

実行して移行。

terraform init -migrate-state
terraform plan
terraform apply

これで、tfstate ファイルの移行完了です。

おわりに #

tfstate 管理を楽にする設定を行いました。
これから Terraform でリソース作っていきましょう。