~ / blog / infra
22 set 2026infra9 min de leitura

Terraform básico: infraestrutura como código

Primeiros passos com Terraform: providers, resources, state e um exemplo prático de VM ou bucket sem mistério.

TerraformIaCAWSCloud

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)
  • plan revisado 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

SintomaCausaSolução
State lockOutro apply em andamento ou crashVerifique quem segura o lock; force só se tiver certeza
Resource already existsCriado manualmente ou state desatualizadoterraform import ou alinhe o state
Provider authentication failedCredenciais ou região erradasConfira env vars e profile AWS
DriftMudança manual no consoleterraform plan e decida se aplica de volta

Quer aplicar isso ao seu contexto?

Se esse problema existe na sua operação, podemos analisar o cenário em um diagnóstico gratuito de 30 minutos.

solicitar diagnóstico gratuito →

Leia também