Terraform com Módulos: Estrutura Limpa, Código Reutilizável
Introdução
O Terraform é uma ferramenta poderosa para a automação de infraestrutura como código, permitindo criar, gerenciar e versionar recursos de maneira eficiente em diversas plataformas de nuvem. À medida que seus projetos crescem, a complexidade da infraestrutura também tende a aumentar. Para garantir que o código permaneça limpo, reutilizável e fácil de manter, o uso de módulos no Terraform se torna essencial. Módulos permitem organizar e dividir a infraestrutura em componentes menores e independentes, o que facilita a reutilização e a escalabilidade de soluções. Neste post, vou mostrar como criei e utilizei módulos no Terraform para otimizar a infraestrutura de maneira mais eficaz.
Por que usar módulos no Terraform?
A utilização de módulos no Terraform oferece uma série de vantagens que vão desde a simplificação da gestão de recursos até o aumento da reutilização de código. Quando começamos a trabalhar com Terraform, é fácil criar um único arquivo com todas as configurações, mas à medida que a infraestrutura cresce, isso pode rapidamente se tornar desorganizado. Aqui estão alguns motivos pelos quais módulos são fundamentais:
-
Reutilização de código: Com módulos, é possível criar componentes que podem ser reutilizados em diferentes partes do seu projeto ou até mesmo em projetos distintos. Isso reduz a duplicação de código e facilita manutenções futuras.
-
Organização: Módulos permitem organizar seu código de forma modular, o que torna mais fácil entender e gerenciar diferentes partes da infraestrutura sem precisar vasculhar grandes arquivos de configuração.
-
Facilidade de manutenção: Ao organizar a configuração de um recurso ou conjunto de recursos em módulos, é possível atualizá-los ou corrigí-los sem impactar diretamente outras partes do projeto, o que torna a manutenção muito mais simples.
-
Escalabilidade: À medida que a infraestrutura cresce, a modularização permite que você expanda a solução de maneira mais controlada e com menos risco de erros, já que os módulos são independentes e bem definidos.
Estrutura de um módulo Terraform
Um módulo no Terraform é um conjunto de arquivos que contêm a configuração de um ou mais recursos. Ele funciona como um ‘bloco reutilizável’ de infraestrutura, permitindo que você use a mesma lógica em diferentes situações de forma simples. Um módulo pode ser local (armazenado no próprio repositório do projeto) ou remoto (hospedado em um repositório Git, por exemplo).
A estrutura básica de um módulo geralmente é composta pelos seguintes arquivos:
main.tf: É o arquivo principal onde você define os recursos que o módulo irá provisionar. Por exemplo, criação de uma instância EC2, um Nat Gateway, uma VPC, etc.
variables.tf: Define todas as variáveis que o módulo espera receber como entrada. Cada variável pode ter um tipo, descrição e um valor padrão.
outputs.tf: Define os valores que o módulo irá retornar após a execução. Isso é útil para expor informações como IDs de recursos, endereços IP, nomes de recursos, entre outros.
Aqui está um exemplo básico da estrutura de um módulo que provisiona uma Route Table:
1
2
3
4
5
/modulos
/route-table
├── main.tf
├── variables.tf
├── outputs.tf
Exemplo prático
Para exemplificar na prática o uso de módulos no Terraform. vamos utilizar como exemplo o repositório que criei no Github (https://github.com/ricardocisneiros/Terraform-VPC), que contém arquivos de modulos de uma infraestrutura de VPC na AWS.
Nesse exemplo, a criação da VPC é abstraída de um módulo reutilizável, permitindo que seja facilmente replicado ou adaptado para outros projetos ou ambientes.
1
2
3
4
5
6
7
8
9
Terraform/
├── Dev/
│ └── main.tf
│ └── vpc.tf
├── Modulos/
│ └── vpc/
│ ├── main.tf
│ ├── outputs.tf
│ └── variables.tf
Como funciona?
Dentro da pasta Modulos/vpc, temos o módulo responsável pela criação da VPC. Esse módulo recebe algumas variáveis, como o CIDR da VPC, o seu respectivo nome e outras variáveis.
Dentro de Dev/vpc.tf, vemos como o módulo é consumido:
1
2
3
4
5
6
7
8
9
10
11
module "vpc" {
source = "../Modulos/vpc"
name = "Vpc-Dev"
vpc_cidr = "192.168.18.0/23"
enable_ipv6 = true
tags = {
Ambiente = "Dev"
}
}
Já dentro de Dev/main.tf, o arquivo também define os blocos necessários para inicializar o projeto Terraform corretamente. Ele especifica a versão mínima do Terraform a ser usada (>= 1.3.0) e os provedores necessários, neste caso o aws, com a versão restrita 5.x (~> 5.0). Isso garante que o código seja executado com uma versão compatível, evitando problemas de incompatibilidade de recursos ou sintaxe.
O bloco provider “aws” define a região padrão onde os recursos serão provisionados — no exemplo, us-east-1. Esse parâmetro é essencial para que o Terraform saiba onde interagir com a AWS.
Essa configuração é uma etapa fundamental em qualquer projeto Terraform, pois garante que a execução do código aconteça de forma previsível e controlada.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
terraform {
required_version = ">= 1.3.0"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
provider "aws" {
region = "us-east-1"
}
Conclusão
O uso de módulos no Terraform transforma a maneira como lidamos com a infraestrutura como código. Eles não apenas ajudam a organizar e reutilizar recursos de maneira eficaz, mas também proporcionam maior flexibilidade e escalabilidade para seus projetos. Ao modularizar sua infraestrutura, você garante que o código se torne mais limpo, mais fácil de entender e, principalmente, mais fácil de manter. O uso de módulos pode melhorar consideravelmente a eficiência da sua equipe e reduzir os erros durante a implementação de novas infraestruturas. Se você ainda não começou a modularizar seus projetos Terraform, este é o momento certo para aproveitar todos os benefícios que essa abordagem pode oferecer.