O Terraform é uma ferramenta de Infrastructure as Code (IaC) que permite definir e provisionar infraestrutura de forma declarativa, usando uma linguagem de configuração própria (HCL - HashiCorp Configuration Language). Com ele, você descreve o estado desejado dos seus recursos (máquinas virtuais, redes, bancos de dados, etc.) em arquivos de configuração, e o Terraform cuida de criar, atualizar ou destruir esses recursos nos provedores de nuvem (AWS, Azure, GCP) ou em outras plataformas, como Kubernetes.

Nesta aula, você vai entender os conceitos essenciais para começar a usar o Terraform: o que ele é, como funcionam os providers, a importância do arquivo de estado (state) e o fluxo de trabalho básico com os comandos init, plan e apply. Ao final, você estará apto a escrever seus primeiros arquivos de configuração e gerenciar infraestrutura de forma versionável e reproduzível.

O que é Terraform

O Terraform é uma ferramenta open-source criada pela HashiCorp em 2014. Ela permite que você defina sua infraestrutura como código, ou seja, em vez de criar recursos manualmente pelo console do provedor, você escreve arquivos de configuração que descrevem o que deseja. Essa abordagem traz benefícios como versionamento (você pode usar Git para controlar mudanças), revisão por pares (pull requests), automação e consistência.

O Terraform funciona com o conceito de plano de execução: ele compara o estado atual da infraestrutura com o estado desejado (definido nos seus arquivos) e gera um plano de alterações. Você pode revisar esse plano antes de aplicá-lo, o que dá segurança e previsibilidade. Além disso, o Terraform é agnóstico de provedor, ou seja, você pode usar os mesmos conceitos e fluxo de trabalho para gerenciar recursos em diferentes nuvens.

Um exemplo simples de configuração em HCL (a linguagem do Terraform) para criar uma instância EC2 na AWS:

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

resource "aws_instance" "exemplo" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t2.micro"
}

Nesse código, definimos o provider AWS e um recurso do tipo aws_instance com nome lógico exemplo. O Terraform interpreta isso e cria a instância quando você executa terraform apply.

Providers

Providers são plugins que permitem ao Terraform interagir com APIs de serviços externos, como provedores de nuvem (AWS, Azure, GCP), plataformas de orquestração (Kubernetes), serviços de DNS (Cloudflare), entre outros. Cada provider expõe um conjunto de recursos e fontes de dados que você pode usar nas suas configurações.

Os providers são distribuídos no Terraform Registry, e você os declara no seu código usando o bloco provider. Eles também podem ter opções de configuração, como região, credenciais, etc. Por exemplo, para usar o Azure, você precisa configurar o provider com sua assinatura e credenciais:

provider "azurerm" {
  features {}
  subscription_id = "sua-assinatura"
  client_id       = "seu-client-id"
  client_secret   = "seu-client-secret"
  tenant_id       = "seu-tenant-id"
}

É importante notar que, para cada provider, você precisa baixar o plugin correspondente. Isso é feito automaticamente pelo comando terraform init. Você também pode especificar a versão do provider no bloco required_providers dentro de terraform para garantir consistência:

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 4.0"
    }
  }
}

Essa prática é recomendada para evitar que mudanças de versão do provider quebrem sua infraestrutura.

Estado (state)

O estado é um arquivo (geralmente chamado terraform.tfstate) que mantém um registro de todos os recursos criados pelo Terraform. Ele mapeia o que está na sua configuração para o que existe no mundo real. O estado é crucial porque permite ao Terraform saber quais recursos gerenciar, quais atributos eles têm e como atualizá-los quando a configuração muda.

O arquivo de estado é armazenado localmente por padrão, mas em ambientes de equipe é recomendado usar um backend remoto, como AWS S3, Azure Storage, ou Terraform Cloud, para que todos compartilhem o mesmo estado e evitem conflitos. O estado também pode conter dados sensíveis, como senhas ou chaves, portanto deve ser protegido adequadamente.

Um exemplo de como configurar um backend remoto no S3:

terraform {
  backend "s3" {
    bucket = "meu-bucket-terraform"
    key    = "infra/terraform.tfstate"
    region = "us-east-1"
  }
}

Quando você executa terraform plan, o Terraform consulta o estado para entender o que já existe e calcular as diferenças. É por isso que é essencial manter o estado atualizado e nunca editá-lo manualmente.

Para inspecionar o estado, use o comando terraform state list ou terraform show.

Fluxo (init, plan, apply)

O fluxo de trabalho básico do Terraform envolve três comandos principais: init, plan e apply. Eles formam o ciclo de vida de uma configuração.

1. terraform init - Inicializa o diretório de trabalho, baixando os plugins dos providers e configurando o backend. É o primeiro comando a ser executado após escrever sua configuração. Ele também inicializa módulos e cria o diretório .terraform.

terraform init

2. terraform plan - Cria um plano de execução, mostrando exatamente quais ações o Terraform tomará (criar, modificar, destruir recursos). É uma etapa de validação que permite revisar antes de aplicar. O plano é exibido na tela e pode ser salvo em um arquivo com -out=plano.tfplan.

terraform plan

3. terraform apply - Aplica o plano, ou seja, executa as mudanças necessárias para alcançar o estado desejado. Por padrão, ele pede confirmação antes de prosseguir, mas você pode usar -auto-approve para pular a confirmação em ambientes automatizados.

terraform apply

Além desses, os comandos terraform destroy (para remover todos os recursos gerenciados) e terraform fmt (para formatar o código) são úteis. O fluxo completo é: escrever a configuração, init, plan, revisar, apply.

Um exemplo de saída do terraform plan mostrando que criará uma instância:

Terraform will perform the following actions:

  # aws_instance.exemplo will be created
  + resource "aws_instance" "exemplo" {
      + ami                          = "ami-0c55b159cbfafe1f0"
      + instance_type                = "t2.micro"
      + ...
    }

Plan: 1 to add, 0 to change, 0 to destroy.

Boas práticas

Ao usar Terraform, adote boas práticas para manter a infraestrutura saudável:

  • Versionamento de configuração: guarde seus arquivos .tf em Git para rastrear mudanças.
  • Uso de módulos: encapsule trechos reutilizáveis de configuração em módulos para facilitar manutenção.
  • Backend remoto: use um backend remoto para o estado em projetos de equipe.
  • Proteção de dados sensíveis: use variáveis de ambiente ou secret managers para credenciais, nunca coloque segredos no código.
  • Formatar e validar: execute terraform fmt e terraform validate regularmente.

Referências

Exercícios

  1. Qual é a finalidade do comando terraform init? Explique o que ele faz e quando deve ser executado.

✓ Resposta: O comando terraform init inicializa o diretório de trabalho, baixando os plugins dos providers necessários, configurando o backend e preparando o ambiente. Deve ser executado sempre que você clonar um repositório com configuração Terraform ou alterar os providers/backend.
  • O que é o arquivo de estado (terraform.tfstate) e por que é importante? Cite um risco de não gerenciá-lo adequadamente.
  • ✓ Resposta: O arquivo de estado é o registro dos recursos gerenciados pelo Terraform. Ele é importante porque permite ao Terraform saber o que já existe, comparar com a configuração e planejar mudanças. Se não for gerenciado (ex.: não usar backend remoto), pode haver conflitos em trabalho em equipe ou perda de sincronização, levando a recursos órfãos ou duplicados.
  • Escreva um bloco de configuração HCL que defina o provider AWS e crie um bucket S3 chamado "meu-bucket-exemplo-123".
  • ✓ Resposta:
    provider "aws" {
      region = "us-east-1"
    }
    
    resource "aws_s3_bucket" "exemplo" {
      bucket = "meu-bucket-exemplo-123"
      acl    = "private"
    }
    
  • Qual a diferença entre terraform plan e terraform apply? Por que é recomendado executar o plan antes do apply?
  • ✓ Resposta: terraform plan mostra o plano de alterações sem executar nada, permitindo revisar o que será criado, modificado ou destruído. terraform apply executa as mudanças. Executar o plan antes evita surpresas e permite validar se as alterações estão corretas, especialmente em ambientes de produção.
  • Cite duas boas práticas ao usar Terraform em um time de desenvolvimento.
  • ✓ Resposta: Duas boas práticas são: (1) usar um backend remoto para o estado, como S3 ou Terraform Cloud, para que todos compartilhem o mesmo estado e evitem conflitos; (2) versionar os arquivos de configuração (.tf) no Git para permitir revisão e rastreabilidade das mudanças.

    Observações finais

    O Terraform é uma ferramenta poderosa que transforma a forma como gerenciamos infraestrutura. Dominar os conceitos de providers, estado e o fluxo básico é o primeiro passo para automatizar ambientes complexos. A prática com exemplos reais, como criar instâncias, buckets e redes, é essencial para consolidar o aprendizado. Nas próximas aulas, você explorará recursos avançados, como módulos, variáveis e provisionamento de ambientes completos.