Terraform
Table of Contents
Terraform é uma ferramenta de Infraestrutura como código que ajuda a provisionar a infraestrutura em Cloud ou OSS. Usa recursos com de configurações “human-readable”, faciliarando a criaçaõ da configuração.
Esse estudo será feito com a leitura da documentação e videos do: Youtube RocketSeat Udemy Alura LinuxTips
Terraform#
Terraform funciona usando Providers, são como Plugins que possui funções especificas para se comunicar com a API do Destino (AWS, Azure, Docker, …). Para ver a lista de todos, basta acessar o Terraform Registry.
A base do Terraform é:
. Escrever: Define quais os recursos serão usados para a sua infraestrutura.
. Planejar: Verifica se a infraestrutura está de acordo com o que foi definido.
. Aplicar: Aplica as alterações necessárias para a infraestrutura.
Controle da infraestrtutura#
Terraform gera planos de execução, que são uma prévia das alterações que serão aplicadas na infraestrutura. Esses planos são gerados a partir do arquivo de configuração HCL (HashiCorp Configuration Language) e são usados para garantir que as alterações serão aplicadas corretamente e de forma segura.
E para manter todo o controle, usa o state file que mantém a verdade da infra.
Mudanças automatizadas#
Terraform possui arquivos de configuração Declarativos, ou seja, ele informa como a infraestrutura será, não precisando se preocupar com o passo a passo da construção.
Padronização de configurações#
Terraform mantem um suporte a componentes de configuração que são reutilizaveis, chamados de Módulos.
Casos de uso#
O Terraform é extremamente versátil e pode ser aplicado em diversos cenários para gerenciar infraestrutura. Alguns casos de uso comuns incluem:
- Provisionamento de Infraestrutura em Nuvem: Criar e gerenciar máquinas virtuais, redes, bancos de dados, balanceadores de carga e outros recursos em provedores como AWS, Azure, Google Cloud Platform.
- Gerenciamento de Kubernetes: Provisionar clusters Kubernetes e seus componentes, como nós, namespaces e serviços.
- Infraestrutura On-Premise: Automatizar a configuração de servidores físicos e virtuais em data centers privados.
- Ambientes de Desenvolvimento e Teste: Rapidamente provisionar e desprovisionar ambientes isolados para desenvolvimento, teste e homologação.
- Recuperação de Desastres (DR): Definir e provisionar infraestrutura de recuperação de desastres de forma automatizada, garantindo a consistência entre o ambiente primário e o de DR.
- Observabilidade:
- Configuração de Ferramentas de Monitoramento: Provisionar e configurar instâncias de ferramentas de monitoramento como Prometheus, Grafana, ELK Stack (Elasticsearch, Logstash, Kibana) em diferentes ambientes.
- Gerenciamento de Alertas e Notificações: Definir e gerenciar regras de alerta e canais de notificação (e-mail, Slack, PagerDuty) para sistemas de monitoramento.
- Provisionamento de Agentes de Coleta de Dados: Automatizar a implantação de agentes de monitoramento (e.g., CloudWatch Agent, Datadog Agent, Prometheus Node Exporter) em servidores e contêineres.
- Criação de Dashboards e Visualizações: Embora o conteúdo dos dashboards seja geralmente configurado dentro da ferramenta de observabilidade, o Terraform pode provisionar a infraestrutura subjacente para hospedar esses dashboards e, em alguns casos, até mesmo importar configurações de dashboards via APIs.
IaC#
Infrastructure as Code é o que define o Terraform, ter o poder de montar scripts automatizando a criação de infraestruturas de T.I. sem que precise fazer manualmente.
. Scope: Identifique qual será a insfraestrutura do seu projeto.
. Author: Escreva a configuralçai que define a infraestrutura.
. Initialize: Instale o providers necessários pro Terraform funionar.
. Plan: Visualize as modificações que seram aplicadas pelo Terraform.
. Apply: Execute a modificação/criação da sua infraestrutura.
Não foi necessárioa abrir portal da Cloud, arquivo de configuração de aplicação, etc. Bastou dizer ao Terraform o que você espera que tenha na sua infraestrutura e deixe que ele faça o resto.
Instalação#
A instalação do Terraform é simples, a documentação é bem direta e simples de entender.
> sudo apt-get update && sudo apt-get install -y gnupg software-properties-common
> wget -O- https://apt.releases.hashicorp.com/gpg | \
> gpg --dearmor | \
> sudo tee /usr/share/keyrings/hashicorp-archive-keyring.gpg > /dev/null
> echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(grep -oP '(?<=UBUNTU_CODENAME=).*' /etc/os-release || lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
> sudo apt update
> sudo apt-get install terraform
Construindo minha primeira infraestrutura#
O Terraform possui alguns componentes pro seu funcionamento, vamos começar com o “main.tf”.
A construção da infra com o Terraform é feita dentro de um diretório próprio daquela infraestrutura. Dentro desse diretório, vai conter o “main.tf”.

Assim como em algumas linguagens de programação, o main vai ser da onde o Terraform vai partir, vai entender como você quer seu ambiente.
Estrutura do main.tf#

Bloco Terraform#
É onde as configurações do Terraform são declaradas, como por exemplo, a versão do Terraform que será utilizada, o provider que será utilizado, entre outros.
Providers#
Providers são os componentes que permitem que o Terraform interaja com os serviços externos, como por exemplo, o AWS, Azure, Google Cloud, entre outros. No arquivo de configuração do Terraform, tem um block especifico em que informamos qual providers vamos utilizar, podendo até informar mais de um provider no mesmo arquivo.
Resources#
É o bloco em que definimos quais seram os componentes da nossa infraestrutura, o que vai conter e dependendo do provider, podendo ter mais de bloco.
Comandos básicos#
Estes são os comandos que você usará 90% do tempo ao gerenciar sua infraestrutura.
| Comando | Descrição |
|---|---|
terraform init | Inicializa o diretório. Baixa os providers (AWS, Azure, GCP) e configura o backend. |
terraform plan | Cria um plano de execução. Mostra quais recursos serão criados, alterados ou destruídos sem aplicar nada ainda. |
terraform apply | Executa as mudanças. Aplica as configurações no provedor de nuvem. (Geralmente pede confirmação yes). |
terraform destroy | Remove tudo. Destrói todos os recursos gerenciados por aquele arquivo de configuração. |
Comandos de Utilidade e Qualidade#
Para manter seu código limpo e validar se tudo está correto antes de rodar.
terraform validate: Verifica se a sintaxe dos arquivos.tfestá correta e se a lógica interna faz sentido.terraform fmt: Formata automaticamente o seu código para seguir os padrões estéticos do Terraform (ajusta identação, espaços, etc).terraform show: Exibe o estado atual da sua infraestrutura (o que está rodando agora) de forma legível.terraform output: Lista todas as variáveis de saída que você definiu (como IPs de instâncias ou DNS de Load Balancers).
Dicas Rápidas#
- Auto-aprovação: Se quiser rodar o apply sem precisar digitar “yes”, use:
terraform apply -auto-approve - Variáveis: Para passar um arquivo de variáveis específico:
terraform plan -var-file="prod.tfvars" - Ajuda: Qualquer dúvida sobre um comando, digite:
terraform <comando> --help
Variáveis#
As variáveis são componentes muito úteis para evitar repetição de valores e tornar o código mais flexível. Elas permitem que você defina valores que podem ser usados em vários lugares do seu arquivo de configuração, tornando-o mais fácil de manter e atualizar. Para usar no Terraform, você pode criar um arquivo separado e colocar suas variáveis com a estrutura:
variable "container_name" {
description = "Value of the name for the Docker container"
type = string
default = "ExampleNginxContainer"
}
E nisso ós mudamos no main.tf:
resource "docker_container" "nginx" {
image = docker_image.nginx.image_id
- name = "tutorial"
+ name = var.container_name
ports {
internal = 80
external = 8080
}
}
Outputs#
Essas “Outputs” (ou Output Values) no Terraform são equivalentes ao return de uma função em programação.
Quando você cria uma infraestrutura (um servidor, um banco de dados ou um container Docker), o Terraform gera muitas informações técnicas. O Output serve para você filtrar e exibir apenas o que é importante para você ou para outros sistemas.
- Exibir informações úteis: Em vez de procurar no meio de logs gigantes, você define um output para mostrar o IP público de uma máquina ou a URL de um Load Balancer logo após o comando
apply. - Compartilhar dados: Se você usa módulos, um módulo pode “exportar” uma informação (como o ID de uma rede) para que outro módulo a utilize.
- Integração: Você pode rodar um script externo que lê esses valores do Terraform para configurar uma aplicação.
Como se declara?#
Cria um arquivo outputs.tf com um bloco parecido com este:
output "container_id" {
description = "ID do container Docker"
value = docker_container.nginx.id
}
output "container_id": É o nome que você dá à “variável de saída”.value: É o valor real que você quer extrair do recurso criado (neste caso, o ID do container).
- Ao final do
terraform apply: O Terraform imprime automaticamente todos os outputs definidos no terminal. - Com o comando
terraform output: Se você já aplicou a configuração e quer ver os valores novamente sem rodar tudo de novo, basta digitar esse comando na pasta do projeto.