TERRAFORM WORKFLOW — INFRASTRUCTURE AS CODE main.tf HCL Config Resources Variables init terraform plan Preview Changes Dry Run apply terraform apply Create/Update Infrastructure State File Cloud Providers AWS Azure GCP EC2, S3, RDS VMs, Storage GCE, GKE Docker, Cloudflare, DNS... Write → Plan → Apply — declarative infrastructure management

Infraestrutura como Código (IaC) mudou fundamentalmente a forma como gerenciamos infraestrutura de TI. Em vez de clicar manualmente em consoles web para criar servidores, configurar redes e gerenciar serviços cloud, IaC permite que você defina toda a sua infraestrutura em código legível por humanos que pode ser versionado, revisado e automatizado.

O Terraform, criado pela HashiCorp, é a ferramenta de IaC mais amplamente adotada. Ele suporta virtualmente todos os provedores de cloud e serviços por meio de um fluxo de trabalho consistente e uma linguagem de configuração chamada HCL (HashiCorp Configuration Language). Este guia apresentará os conceitos fundamentais, o levará através de exemplos práticos e lhe dará uma base sólida para gerenciar infraestrutura com o Terraform.

O Que É Infraestrutura como Código?

Infraestrutura como Código é a prática de gerenciar e provisionar recursos de computação usando arquivos de definição legíveis por máquina, em vez de configuração interativa manual. Os benefícios incluem:

  • Versionamento: Sua infraestrutura é versionada junto com o código da sua aplicação
  • Reprodutibilidade: Ambientes idênticos podem ser criados de forma confiável
  • Automação: Mudanças na infraestrutura podem ser integradas em pipelines CI/CD
  • Colaboração: Equipes podem revisar mudanças de infraestrutura usando os mesmos fluxos de trabalho de revisão de código
  • Documentação: A configuração em si serve como documentação
  • Recuperação de Desastres: Ambientes inteiros podem ser recriados a partir do código

Instalando o Terraform

Linux (Ubuntu/Debian)

# Adicionar a chave GPG da HashiCorp
wget -O- https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg

# Adicionar repositório
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list

# Instalar Terraform
sudo apt update && sudo apt install terraform -y

macOS

brew tap hashicorp/tap
brew install hashicorp/tap/terraform

Windows

winget install HashiCorp.Terraform

Verificar Instalação

terraform version

Conceitos Fundamentais do Terraform

Providers

Providers são plugins que permitem ao Terraform interagir com APIs de cloud e outros serviços. Os providers populares incluem AWS, Azure, Google Cloud, Cloudflare, Docker e muitos mais.

# Configurar o provider AWS
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
}

provider "aws" {
  region = "us-east-1"
}

Recursos

Recursos são os componentes de infraestrutura que o Terraform gerencia. Cada recurso pertence a um provider e tem um tipo e um nome:

# Criar uma instância EC2 na AWS
resource "aws_instance" "web_server" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t3.micro"

  tags = {
    Name        = "web-server"
    Environment = "production"
  }
}

Variáveis

Variáveis tornam suas configurações reutilizáveis e flexíveis:

# Definir variáveis em variables.tf
variable "instance_type" {
  description = "Tipo da instância EC2"
  type        = string
  default     = "t3.micro"
}

variable "environment" {
  description = "Nome do ambiente de implantação"
  type        = string
}

# Usar variáveis na configuração de recursos
resource "aws_instance" "web_server" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = var.instance_type

  tags = {
    Name        = "web-server"
    Environment = var.environment
  }
}

Outputs

Outputs exibem informações sobre sua infraestrutura após o apply:

output "instance_public_ip" {
  description = "O endereço IP público do servidor web"
  value       = aws_instance.web_server.public_ip
}

output "instance_id" {
  description = "O ID da instância EC2"
  value       = aws_instance.web_server.id
}

Estado (State)

O Terraform mantém um arquivo de estado (terraform.tfstate) que rastreia quais recursos ele gerencia e suas propriedades atuais. Este arquivo é crítico porque é assim que o Terraform sabe o que existe na sua infraestrutura real.

Importante: O arquivo de estado contém informações sensíveis (IDs de recursos, endereços IP e potencialmente senhas). Em ambientes de equipe, sempre armazene o estado remotamente (S3, Azure Blob, Terraform Cloud) e nunca faça commit dele no controle de versão.

O Fluxo de Trabalho Terraform

O fluxo de trabalho principal do Terraform consiste em três comandos:

1. terraform init

Inicializa o diretório de trabalho, baixa os providers e configura o backend:

terraform init

2. terraform plan

Cria um plano de execução mostrando o que o Terraform fará:

terraform plan

3. terraform apply

Aplica as mudanças para alcançar o estado desejado:

terraform apply

Para destruir toda a infraestrutura gerenciada:

terraform destroy

Exemplo Prático: Implantando uma Instância EC2

Crie um diretório de projeto:

mkdir terraform-demo && cd terraform-demo

Crie main.tf:

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
  required_version = ">= 1.7.0"
}

provider "aws" {
  region = var.aws_region
}

resource "aws_instance" "web" {
  ami           = var.ami_id
  instance_type = var.instance_type

  tags = {
    Name        = "${var.project_name}-web"
    Environment = var.environment
    ManagedBy   = "terraform"
  }
}

Crie variables.tf:

variable "aws_region" {
  description = "Região AWS para implantar recursos"
  type        = string
  default     = "us-east-1"
}

variable "ami_id" {
  description = "ID da AMI para a instância EC2"
  type        = string
  default     = "ami-0c55b159cbfafe1f0"
}

variable "instance_type" {
  description = "Tipo da instância EC2"
  type        = string
  default     = "t3.micro"
}

variable "project_name" {
  description = "Nome do projeto para tagging"
  type        = string
  default     = "knowledgexchange"
}

variable "environment" {
  description = "Ambiente de implantação"
  type        = string
  default     = "development"
}

Crie outputs.tf:

output "instance_id" {
  description = "ID da instância EC2"
  value       = aws_instance.web.id
}

output "public_ip" {
  description = "Endereço IP público da instância EC2"
  value       = aws_instance.web.public_ip
}

Execute o fluxo de trabalho:

# Inicializar o diretório de trabalho
terraform init

# Visualizar as mudanças
terraform plan

# Aplicar as mudanças
terraform apply

Melhores Práticas

  1. Sempre execute terraform plan antes de terraform apply para revisar as mudanças
  2. Use estado remoto com locking para colaboração em equipe
  3. Use módulos para organizar e reutilizar configurações
  4. Nunca faça commit de segredos nos seus arquivos Terraform
  5. Use workspaces ou diretórios separados para diferentes ambientes
  6. Fixe versões de providers para builds reproduzíveis
  7. Use terraform fmt para formatar seu código de forma consistente

Conclusão

O Terraform é uma ferramenta poderosa que traz os princípios da engenharia de software para o gerenciamento de infraestrutura. Ao definir sua infraestrutura como código, você ganha reprodutibilidade, colaboração e capacidades de automação que a configuração manual nunca pode alcançar.

O percurso de aprendizado vai de exemplos simples de recurso único a módulos complexos multi-provider que gerenciam ambientes de produção inteiros. Os conceitos e fluxos de trabalho cobertos neste guia fornecem a base que você precisa para começar a usar o Terraform de forma eficaz.