以下の内容はhttps://timtoronto634.hatenablog.com/entry/2025/05/04/082656より取得しました。


terraform の tfstate をAWS 管理する場合の s3 bucket / DDB 設定

S3 の作成

tfstate を管理する S3 は手動、ないし別の terraform で作る必要がある。

複数の環境で作ったり、再利用する際に便利で安定するので、api で作っておくと良い。

バケット作成 S3 はグローバルなイメージがあるが、名前空間をグローバルに一意にする必要があるだけで、実際には region 指定するので注意。

aws s3api create-bucket \
  --bucket <name>-<region, env, account name など> \
  --region ap-northeast-1 \
  --create-bucket-configuration LocationConstraint=ap-northeast-1

デフォルトで public access はブロック、ACL は無効にされている。

タグ指定

aws s3api put-bucket-tagging \
  --bucket your-bucket-name \
  --tagging 'TagSet=[{Key=project,Value=xyz},{Key=env,Value=dev}]'

terraform 1.10 以前は lock のために DynamoDB を利用する必要があったが、 terraform 1.11 以降は S3-native state locking という機能が導入されており、 S3 で完結させられるようになった。便利。

Backend Type: s3 | Terraform | HashiCorp Developer

この際、bucket versioning を有効にすることが強く推奨されている。(bucket versioning を有効にする理由は他にもいくつもある)

aws s3api put-bucket-versioning \
  --bucket your-bucket-name \
  --versioning-configuration Status=Enabled

put-bucket-versioning — AWS CLI 2.27.2 Command Reference

terraform file

S3 ができたら、terraform ファイルを書き始められる。

backend.tfuse_lockfile を指定しているのが、 DynamoDB を不要にする設定となる。

versions.tf

terraform {
  required_version = ">= 1.11.4"

  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.96.0"
    }
  }
}

provider.tf

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

backend.tf

terraform {
  backend "s3" {
    bucket         = your-bucket-name
    key            = "terraform.tfstate" # 複数の tfstate を管理するなら {project-name}/terraform.tfstate 等にしても良い
    region         = "ap-northeast-1"
    use_lockfile = true  # S3-native state locking
  }
}

tree 構造

.
├── backend.tf
├── versions.tf
├── provider.tf
└── main.tf

動作確認

以上で完了。

現状だと resource が何も無いので、動作の確認をするために dummy の s3 を作ってみる。

main.tf

resource "aws_s3_bucket" "dummy" {
  bucket = "terraform-dummy-${random_id.suffix.hex}"
}

resource "random_id" "suffix" {
  byte_length = 4
}

実行すれば、毎回 S3 の差分が出るのが分かる。

terraform init
terraform fmt
terraform validate
terraform plan
terraform apply

備忘録

当初 key の値を {project-name}/terraform.tfstate と記載し、あとから terraform.tfstate に変えた。この際、backend の記述を変更したことで、 migrate が必要になった

terraform init -migrate-state

s3api の --create-bucket-configuration option は us-east-1 では指定するとエラーになる

おわりに

AI で tf ファイルを書かせたり相談するとまだ DynamoDB を使う方を提案されるので、新しい便利でシンプル書き方というのは明確に AI の弱みに感じた。




以上の内容はhttps://timtoronto634.hatenablog.com/entry/2025/05/04/082656より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14