目次
はじめに
こんにちは。今回はtfstateをS3で管理・共有するための構成について書きたいと思います。
今回はBackend機能を使用します。
実行環境
この記事は以下の動作環境で動作確認しています。
$ terraform --version
Terraform v0.12.28
+ provider.aws v2.70.0
tfstateを保存するS3バケットを作成する
まずはtfstateを保存するためのS3バケットを作成しましょう。
この中でtfstateを管理していきます。
resource "aws_s3_bucket" "tfstate-storage" {
bucket = "tfstate-${var.app_name}"
acl = "private"
region = "ap-northeast-1"
versioning {
enabled = true
}
}
DynamoDBを用いてstate lockを有効化する
S3で管理する事によって複数人でtfstateを扱うことが出来るようになりましたが、データがコンフリクトする可能性が出てきました。
そこで、tfstateの一貫性を保つことができるstate lock機能を使用してコンフリクトを防ぎましょう。
ここではDynamoDBを使用します。
resource "aws_dynamodb_table" "terraform-state-lock" {
name = "tfstate-lock-${var.app_name}"
read_capacity = 1
write_capacity = 1
hash_key = "LockID"
attribute {
name = "LockID"
type = "S"
}
}
リソースを作成する
次の章でBackend設定をするのですが、その前にリソースを作成しておかないとエラーが発生します。
このタイミングでS3バケットとDynamoDBは作成しておきましょう。
$ terraform init
$ terraform apply
Backend機能を使用してtfstateを管理する
ここで先ほど作成したS3バケットとDynamoDBを実際にBackendに設定しましょう。
terraform {
backend "s3" {
bucket = "tfstate-${var.app_name}"
key = "terraform.tfstate"
region = "ap-northeast-1"
dynamodb_table = "tfstate-lock-${var.app_name}"
}
}
おわりに
terraformをチーム開発で使用する際には必須の知識になると思いますので、整理と共有をしました。
命名を変更することで環境ごとに対応することも可能です。
それでは良いterraform lifeを🎉
参考: https://blog.gruntwork.io/how-to-manage-terraform-state-28f5697e68fa