TerraformのBackendにS3やDynamoDBを使用できますが、各Terraformプロジェクトで共通のものを使うことができます。
例えばterraform-state-for-my-company
というS3バケットと、terraform-state-lock-for-my-company
というDynamoDBテーブルを作成します。
terraform-state.tf
resource "aws_dynamodb_table" "terraform_statelock" {
name = "terraform-state-lock-for-my-company"
hash_key = "LockID"
read_capacity = 5
write_capacity = 5
attribute {
name = "LockID"
type = "S"
}
}
resource "aws_s3_bucket" "terraform_state" {
bucket = "terraform-state-for-my-company"
acl = "private"
versioning {
enabled = true
}
}
S3とDynamoDBを作成するリージョンはどこでも構いません。Backendを利用するTerraformプロジェクトのAWSプロバイダのリージョンと異なってていも、問題なく使用することができます。節約のために料金が安いリージョンを選択することも可能です。
Backendを使いたいTerraformプロジェクトで以下のようにBackendを設定します。
例)my-project
my-project-terraform/backend.tf
terraform {
backend "s3" {
bucket = "terraform-state-for-my-company"
dynamodb_table = "terraform-state-lock-for-my-company"
key = "my-project"
region = "us-west-2" # S3やDynamoDBが作成されているリージョン
}
}
私の場合は、最初に作成したS3とDynamoDBも1つのTerraformプロジェクトとして管理しています。こちらも自身のS3やDynamoDBを使うことができるので、その場合は一度S3とDynamoDBをapplyし、Backendの設定を追加します。
まとめ
これでプロジェクトごとにS3やDynamoDBを作る必要がなくなりました。会社で複数のTerraformプロジェクトがある場合は便利です。