はじめに #
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 でリソース作っていきましょう。