Introdução
🚂 E aee galera! Temos novidade no Terraform para quem utiliza AWS e armazena o state no S3. A partir da versão 1.11, não é mais necessário fazer o deploy de uma tabela DynamoDB para utilizar o recurso de lock, o que reduz custos e simplifica a arquitetura.
Antes da versão 1.11.0
Antes da versão 1.11.0 do provider da AWS para Terraform, como mostrado na imagem abaixo, era necessário criar uma tabela no DynamoDB além do bucket no S3. A tabela do DynamoDB era usada para gerenciar o lock quando duas pessoas tentavam modificar o state ao mesmo tempo.
Essa configuração funcionava bem, mas exigia o provisionamento de mais um recurso, o que aumentava a complexidade e o custo a longo prazo.
Exemplo de código
main.tf
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
}
}
backend "s3" {
bucket = "terraform-state-00000000-prd-us-west-2"
key = "state/prd/resource.tfstate"
region = "us-west-2"
encrypt = true
dynamodb_table = "terraform-locks-prd-us-west-2"
}
}
bucket.tf
resource "aws_s3_bucket" "terraform_state" {
bucket = "terraform-state-${var.prefix_conta}-${var.env}-${var.region}"
lifecycle {
prevent_destroy = true
}
}
resource "aws_s3_bucket_versioning" "enabled" {
bucket = aws_s3_bucket.terraform_state.id
versioning_configuration {
status = "Enabled"
}
}
resource "aws_s3_bucket_public_access_block" "public_access" {
bucket = aws_s3_bucket.terraform_state.id
block_public_acls = true
block_public_policy = true
ignore_public_acls = true
restrict_public_buckets = true
}
dynamodb.tf
resource "aws_dynamodb_table" "terraform_locks" {
name = "terraform-locks-${var.env}-${var.region}"
billing_mode = "PAY_PER_REQUEST"
hash_key = "LockID"
attribute {
name = "LockID"
type = "S"
}
}
Depois da versão 1.11.0
Com a chegada da versão 1.11.0, o processo ficou muito mais simples. Agora é possível usar o próprio S3 para armazenar o arquivo terraform.lock.hcl, sem precisar do DynamoDB.
Exemplo de código
main.tf
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
}
}
backend "s3" {
bucket = "terraform-state-00000000-prd-us-west-2"
key = "state/prd/resource.tfstate"
region = "us-west-2"
encrypt = true
use_lockfile = true
}
}
bucket.tf
resource "aws_s3_bucket" "terraform_state" {
bucket = "terraform-state-${var.prefix_conta}-${var.env}-${var.region}"
lifecycle {
prevent_destroy = true
}
}
resource "aws_s3_bucket_versioning" "enabled" {
bucket = aws_s3_bucket.terraform_state.id
versioning_configuration {
status = "Enabled"
}
}
resource "aws_s3_bucket_public_access_block" "public_access" {
bucket = aws_s3_bucket.terraform_state.id
block_public_acls = true
block_public_policy = true
ignore_public_acls = true
restrict_public_buckets = true
}