OpenTofu na AWS: do Zero à Infraestrutura Real
Autor: Andrew Ramires

1.3 Deep Dive nos Blocos do OpenTofu

Este material complementa a fase 1 com quatro conceitos que aparecem cedo em qualquer projeto com OpenTofu.

⚡ Visão rápida: esta etapa aprofunda os blocos e componentes que mais aparecem em projetos reais: provider, módulo, provisioner e backend.
🧠 Mergulho profundo
Documentação oficial:
Abrir documentação de provider no OpenTofu
Abrir documentação de module no OpenTofu
Abrir documentação de provisioner no OpenTofu
Abrir documentação de backend no OpenTofu

1.3.1 O que é provider

Provider é o componente que permite ao OpenTofu conversar com uma nuvem, API ou sistema externo.

É por meio do provider que o OpenTofu consegue criar, consultar, alterar e remover recursos.

Exemplos comuns:

  • provider aws para recursos da AWS;
  • provider azurerm para recursos do Azure;
  • provider google para recursos do Google Cloud;
  • outros providers para SaaS, DNS, Kubernetes e muitos outros serviços.

Em termos práticos, sem provider o OpenTofu não sabe como gerenciar o sistema de destino.

Sempre que você adicionar um provider novo, ou alterar a configuração de providers do projeto, execute:

tofu init -reconfigure

Esse passo faz o OpenTofu reconfigurar o diretório de trabalho para o novo conjunto de providers.

1.3.2 O que é module

Module é uma forma de agrupar recursos relacionados dentro de um diretório.

Todo projeto OpenTofu já começa com um módulo, chamado de root module, que é o diretório principal onde você executa os comandos.

Quando você separa código em outros diretórios e passa a reutilizar essa estrutura, você está trabalhando com módulos.

Na prática, essa separação por diretórios é a forma padrão de modularizar projetos em OpenTofu.

Esses módulos podem ser:

  • locais, criados dentro do próprio repositório;
  • internos, feitos por colegas de trabalho ou pela equipe da empresa;
  • externos, publicados pela comunidade em registries públicos ou privados.

Módulos são úteis para reaproveitar padrões como:

  • rede;
  • grupos de segurança;
  • máquinas virtuais;
  • bancos de dados;
  • conjuntos de permissões.

Mesmo assim, no começo do curso vamos manter a estrutura simples e evitar modularização precoce sem necessidade.

1.3.3 O que é provisioner

Provisioner é um recurso usado para executar ações adicionais em uma máquina local ou remota durante a criação ou destruição de um recurso.

Exemplos comuns:

  • rodar um comando local com local-exec;
  • copiar arquivos;
  • executar comandos remotos em uma instância recém-criada.

Ele existe para casos específicos, mas deve ser usado com cuidado.

De forma geral, provisioners aumentam a complexidade e fogem um pouco do modelo declarativo do OpenTofu, então o ideal é tratá-los como exceção e não como padrão.

1.3.4 O que é backend

Backend é o mecanismo usado pelo OpenTofu para armazenar o state.

De forma simplificada, muita gente trata o backend como o “banco de dados” do projeto no OpenTofu.

O state é o registro do que o OpenTofu entende que está sob gerenciamento. Durante plan e apply, ele usa esse estado junto com a configuração e com a leitura atual da nuvem ou do sistema gerenciado para decidir o que precisa mudar.

Esse backend pode salvar o state em diferentes lugares, por exemplo:

  • localmente em arquivo;
  • em armazenamento remoto;
  • em serviços compartilhados por equipes.

Em projetos com colaboração entre várias pessoas, a recomendação é manter o state em um local externo e compartilhado, porque isso melhora a consistência do trabalho em equipe.

Neste curso, vamos manter tudo localmente por praticidade, para reduzir a complexidade inicial e focar no aprendizado dos conceitos.

🧠 Mergulho profundo
Referências oficiais do OpenTofu:
Abrir documentação geral do OpenTofu
Abrir documentação da linguagem do OpenTofu
Abrir documentação de configuração de providers
Abrir visão geral de módulos
Abrir documentação de chamada de módulos
Abrir documentação de provisioners
Abrir documentação de backend e armazenamento de state
Abrir documentação de configuração de backend