1. Por que Terraform
Infraestrutura descrita em arquivos de texto versionáveis. Você declara o estado desejado; o Terraform calcula o que criar, alterar ou destruir. Funciona com AWS, Azure, GCP, Proxmox, Cloudflare e dezenas de outros providers.
2. Instalação e estrutura
# Linux (exemplo)
curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
# ou baixe o binário oficial e coloque no PATH
terraform version
projeto/
main.tf
variables.tf
outputs.tf
terraform.tfvars # valores locais (não commitar segredos)
3. Provider e resource
# main.tf
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
provider "aws" {
region = "sa-east-1"
}
resource "aws_s3_bucket" "logs" {
bucket = "meu-projeto-logs-prod"
tags = {
Environment = "prod"
ManagedBy = "terraform"
}
}
4. Init, plan, apply, destroy
terraform init # baixa providers
terraform plan # mostra o que vai mudar
terraform apply # aplica (pede confirmação)
terraform destroy # remove tudo que o state conhece
DICA · Sempre rode
plan antes de apply. Em CI, use -auto-approve só depois de revisão.5. State: o que é e como cuidar
O arquivo terraform.tfstate guarda o mapeamento entre recursos reais e a configuração. Em time, use backend remoto (S3 + DynamoDB lock, ou Terraform Cloud).
terraform {
backend "s3" {
bucket = "meu-tf-state"
key = "prod/terraform.tfstate"
region = "sa-east-1"
dynamodb_table = "tf-locks"
}
}
6. Exemplo mínimo (AWS S3)
# variables.tf
variable "bucket_name" {
type = string
}
# main.tf (resumo)
resource "aws_s3_bucket" "this" {
bucket = var.bucket_name
}
resource "aws_s3_bucket_versioning" "this" {
bucket = aws_s3_bucket.this.id
versioning_configuration {
status = "Enabled"
}
}
# outputs.tf
output "bucket_arn" {
value = aws_s3_bucket.this.arn
}
export AWS_ACCESS_KEY_ID=...
export AWS_SECRET_ACCESS_KEY=...
terraform apply -var="bucket_name=irn-demo-logs-2026"
7. Checklist
- State remoto + lock em projetos de time
- Segredos fora do repositório (variáveis de ambiente ou secrets manager)
planrevisado antes de apply em produção- Tags padrão em todos os recursos
- Módulos para padrões repetidos (não copiar/colar main.tf)
8. Erros comuns
| Sintoma | Causa | Solução |
|---|---|---|
| State lock | Outro apply em andamento ou crash | Verifique quem segura o lock; force só se tiver certeza |
| Resource already exists | Criado manualmente ou state desatualizado | terraform import ou alinhe o state |
| Provider authentication failed | Credenciais ou região erradas | Confira env vars e profile AWS |
| Drift | Mudança manual no console | terraform plan e decida se aplica de volta |