O state é o arquivo que o Terraform mantém para mapear os recursos declarados nos arquivos .tf com os recursos reais na infraestrutura. Por padrão, é salvo localmente como terraform.tfstate.

Por que o state existe

O Terraform precisa saber:

  • Quais recursos ele criou (para não criar duplicatas)
  • O estado atual dos atributos (para calcular diffs no plan)
  • As dependências entre recursos

State local vs. remoto

State local funciona bem para experimentos e uso individual, mas tem problemas em equipes:

  • Conflito de estado quando múltiplas pessoas rodam apply simultaneamente
  • Sem locking automático nem histórico
  • Risco de perda ou corrupção do arquivo

State remoto resolve isso armazenando o state em um backend compartilhado com locking automático.

Backend S3 + DynamoDB (padrão AWS)

terraform {
  backend "s3" {
    bucket         = "meu-projeto-tfstate"
    key            = "prod/terraform.tfstate"
    region         = "us-east-1"
    dynamodb_table = "terraform-locks"
    encrypt        = true
  }
}
  • S3: armazena o arquivo de state
  • DynamoDB: fornece locking para evitar apply simultâneo

Workspaces

Workspaces permitem múltiplos states independentes no mesmo backend, útil para ambientes (dev, staging, prod):

terraform workspace new staging
terraform workspace select staging
terraform plan

Dentro do código, o workspace atual fica disponível via terraform.workspace:

resource "aws_instance" "app" {
  instance_type = terraform.workspace == "prod" ? "t3.medium" : "t3.micro"
}

Comandos úteis

# Inspecionar o state atual
terraform state list
terraform state show aws_s3_bucket.meu_bucket
 
# Mover resource no state (renomear sem recriar)
terraform state mv aws_s3_bucket.antigo aws_s3_bucket.novo
 
# Importar resource existente para o state
terraform import aws_s3_bucket.meu_bucket nome-do-bucket-existente
 
# Remover resource do state sem destruir o recurso real
terraform state rm aws_s3_bucket.meu_bucket

Ver também: terraform | terraform-cloud-aws