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.tf で use_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 の弱みに感じた。