Terraform: linguagem, ciclo e o papel do state
Objetivos desta aula
- Escrever provider, resource, variable e output
- Entender init/plan/apply/destroy
- Compreender o que o state guarda
Terraform é declarativo: você descreve o estado desejado e ele calcula o plano de mudança. O ciclo é init (baixa providers e configura backend), plan (mostra o diff), apply (executa) e destroy (remove). Ler o plano antes de aplicar é obrigação profissional, não formalidade.
O state é o mapa entre o código e os recursos reais, incluindo atributos e dependências. Perder o state significa que o Terraform não sabe mais o que gerencia; corrompê-lo por duas execuções simultâneas significa recurso duplicado ou destruído. Por isso: backend remoto, versionamento e lock.
Atenção de segurança: o state contém valores sensíveis em texto (senhas geradas, endpoints, chaves). Ele nunca vai para o Git; vai para bucket privado, criptografado e com acesso restrito.
1. Declarativo, não imperativo
Você descreve o estado desejado; o Terraform calcula a diferença e executa as chamadas de API na ordem certa, usando o grafo de dependências entre recursos.
2. Blocos da linguagem HCL
terraform/provider: versões e configuração do provedorresource: algo que o Terraform cria e gerenciadata: leitura de algo que já existevariable/output/locals: entradas, saídas e valores calculados
3. O ciclo
init baixa providers e configura backend; fmt e validate checam; plan mostra o que vai mudar; apply executa. Leia o plan sempre: -/+ significa destruir e recriar.
4. O state
O state mapeia cada recurso do código ao ID real na nuvem. Sem ele, o Terraform não sabe o que já criou. Ele contém dados sensíveis: nunca vá para o Git.
5. Lock file e versões
.terraform.lock.hcl fixa versões exatas dos providers e deve ser commitado. Restrinja versões com ~> 5.0.
6. Checagem final
Você deve ler um plan e dizer o que será criado, alterado ou recriado, e explicar por que o state é crítico.
Na prática
Configuração base do CloudShop
hcl
terraform {
required_version = "~> 1.9"
required_providers {
aws = { source = "hashicorp/aws", version = "~> 5.60" }
}
}
provider "aws" {
region = var.region
default_tags {
tags = {
project = "cloudshop"
env = var.env
owner = "equipe-plataforma"
managed = "terraform"
}
}
}
variable "region" { type = string, default = "us-east-1" }
variable "env" { type = string }
variable "vpc_cidr" {
type = string
description = "Faixa da VPC do ambiente"
validation {
condition = can(cidrhost(var.vpc_cidr, 0))
error_message = "vpc_cidr deve ser um CIDR valido."
}
}
resource "aws_vpc" "main" {
cidr_block = var.vpc_cidr
enable_dns_hostnames = true
tags = { Name = "cloudshop-${var.env}" }
}
output "vpc_id" {
value = aws_vpc.main.id
description = "ID da VPC criada"
}Nota de segurança: Marque outputs sensíveis com sensitive = true e nunca imprima segredo em log de pipeline.
Ciclo de trabalho
bash
terraform init
terraform fmt -recursive && terraform validate
terraform plan -var-file=env/dev.tfvars -out=plan.tfplan
terraform apply plan.tfplan
terraform output -json | jq
terraform state list
terraform state show aws_vpc.main
terraform destroy -var-file=env/dev.tfvarsRecurso, variável e output
hcl
terraform {
required_version = ">= 1.8"
required_providers {
aws = { source = "hashicorp/aws", version = "~> 5.0" }
}
}
variable "env" { type = string }
resource "aws_s3_bucket" "images" {
bucket = "cloudshop-${var.env}-images"
}
output "images_bucket" { value = aws_s3_bucket.images.bucket }Ciclo com plano salvo
bash
terraform init
terraform fmt -check && terraform validate
terraform plan -var env=dev -out tfplan
# Plan: 1 to add, 0 to change, 0 to destroy.
terraform apply tfplan # aplica exatamente o que foi revisadoPor que isso importa
IaC é requisito quase universal nas vagas; explicar state e plano é pergunta recorrente em entrevista.
Erro comum
Rodar apply sem ler o plano e destruir um recurso com dados.
Dica de produção
Salve o plano em arquivo e aplique exatamente esse plano: evita surpresa entre revisar e aplicar.
Alerta de segurança
State em bucket público é vazamento de credenciais e topologia. Bloqueie acesso público e habilite criptografia.
Pergunta de entrevista
O que acontece se dois engenheiros rodarem apply ao mesmo tempo sem lock?
Glossário
- provider
- Plugin que traduz configuração Terraform em chamadas de API de uma plataforma.
- state
- Arquivo que mapeia recursos declarados aos recursos reais e seus atributos.
- provider
- Plugin que traduz recursos Terraform em chamadas de API de um serviço.
- state
- Arquivo que liga recursos do código aos objetos reais.
- data source
- Bloco que lê informações existentes sem gerenciá-las.
Conexão com o CloudShop
Criar a VPC do CloudShop via Terraform, substituindo os comandos manuais do módulo anterior.
Quiz da aula
1. Para que serve o state do Terraform?
2. No plan, o que significa -/+?
3. O .terraform.lock.hcl deve ir para o Git?
Minhas anotações
Salvo automaticamente neste navegador.