Terraform lock no S3

Juliano Salszbrun | Jul 29, 2025 min read

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.

Imagem 1 - Terraform 1.11.0

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.

Imagem 2 - Terraform 1.11.0

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
}

Referência

Changelog Terraform 1.11.0 – fevereiro de 2025