Post

Terraform com Módulos: Estrutura Limpa, Código Reutilizável

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:

  1. 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.

  2. 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.

  3. 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.

  4. 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.

Esta postagem está licenciada sob CC BY 4.0 pelo autor.

Trending Tags