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
applysimultaneamente - 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 planDentro 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_bucketVer também: terraform | terraform-cloud-aws