Isso aconteceu no meu laboratório de estudo, com uma base de módulos que veio de um ambiente corporativo. Tirei nomes, contas e qualquer dado sensível.
01 / O COMEÇO
Era só usar os módulos. Ainda bem que eu li antes.
A ideia era simples: pegar os módulos que já existiam e montar o ambiente de estudo em cima deles. EKS, banco, filas, pipeline. Tudo pronto, era só chamar.
Só que módulo herdado é como carro usado. Por fora parece ótimo. Antes de pegar a estrada, vale abrir o capô. Resolvi ler os 41, um por um, antes de criar qualquer coisa nova.
A REGRA QUE EU SEGUINão construo nada em cima de código que eu não entendi.
02 / O QUE ACHEI
Os problemas não estavam escondidos. Estavam no arquivo.
Não precisei de ferramenta especial para achar a maior parte. Bastou abrir os arquivos com calma.
Senha em texto puro
Senha de banco escrita direto no tfvars, indo para o Git junto com o resto.
Chave fixa no pipeline
Access key da AWS guardada como secret, valendo para sempre.
Módulo que nunca rodou
Uma Lambda que dependia de uma biblioteca que nunca foi empacotada. Do jeito que estava, não tinha como funcionar.
Versão bagunçada
Tags sem padrão (com e sem "v"), módulos sem release e lock file dentro de módulo reutilizável.
Teve até um detalhe que só apareceu quando fui publicar: um módulo de ECR com uma chave} faltando no fim do outputs.tf. A versão 1.0.0 simplesmente não funcionava. Corrigi e saiu a 1.1.0.
03 / DANDO NOTA
Uma nota para cada módulo deixou a conversa objetiva.
Para não ficar no "acho que está ruim", dei uma nota de 0 a 10 para cada módulo, olhando sempre as mesmas coisas: segurança, se funciona, se tem versão, se tem documentação e se dá para reutilizar.
modulos_auditados: 41
nota_media: 5.6
bons: 4
precisam_de_ajuste: 29
criticos: 8 # senha exposta, quebrado ou sem usoCom a nota na mão, a prioridade ficou óbvia: primeiro os críticos, depois o resto. E ninguém precisa confiar na minha opinião, porque o critério está escrito.
04 / AS QUATRO ONDAS
Arrumar tudo de uma vez quebra tudo de uma vez.
Em vez de um PR gigante, separei o trabalho em quatro ondas. Cada uma com um objetivo só, e a próxima só começava quando a anterior estava no ar.
Limpar
Apaguei o que estava vazio ou só tinha README, arquivei o módulo que não funcionava e duplicava outro, e tirei lock file e arquivo temporário de dentro dos módulos.
Proteger
Segurança passou a ser o padrão, não uma opção que alguém precisa lembrar de ligar:
- Senha de banco gerenciada pela própria AWS no Secrets Manager, nunca no código.
- Bucket S3 com versionamento, criptografia e HTTPS obrigatório.
- EC2 e nós do EKS com IMDSv2 obrigatório e disco criptografado.
- Filas e tópicos criptografados por padrão.
- Login dos pipelines por OIDC, aceitando só a branch certa.
Versionar
Todo módulo ganhou release seguindo SemVer, e as stacks passaram a apontar para uma versão fixa. Assim uma mudança no módulo não chega de surpresa em quem está usando.
# antes: pega o que estiver na main hoje
source = "git::https://github.com/minha-org/module-vpc.git"
# depois: versão fixa, atualizada de propósito
source = "git::https://github.com/minha-org/module-vpc.git?ref=v1.2.2"Padronizar
Esta ainda está em andamento: CI em cada módulo com terraform fmt,validate, tflint e scan de segurança, além de README e exemplo de uso em todos.
05 / A PROVA
Módulo bom é módulo que sobe uma aplicação de verdade.
Para provar que a base aguentava, criei um app piloto e fiz o deploy usando só os módulos revisados. Nada passou de primeira, e foi aí que a auditoria se pagou: cada erro virou um ajuste no módulo, não um remendo no projeto.
- 01
Workflow não encontrado
O repositório de workflows é privado e precisava liberar o acesso para a organização.
- 02
AWS recusando o login
O GitHub tinha mudado o formato do token OIDC. Ajustei o módulo para aceitar o formato novo.
- 03
Scanner barrando a imagem
O Trivy achou vulnerabilidades na imagem base. Ajustei a imagem até passar limpa.
06 / RESULTADO
Uma base em que dá para confiar.
Nenhuma senha no código a AWS gera e guarda as senhas de banco.
Nenhuma chave fixa no pipeline o login na AWS é por OIDC.
Tudo versionado cada stack sabe exatamente qual versão de cada módulo usa.
Segurança como padrão criptografia, HTTPS e IMDSv2 ligados sem ninguém precisar lembrar.
App de verdade no ar o piloto subiu usando só módulos revisados.
07 / APRENDIZADOS
O que eu levo dessa.
Duas lições ficaram. A primeira: confira as variáveis do módulo na tag que você está usando, não na main. Já perdi tempo com uma variável que existia na main mas ainda não existia na versão que a stack usava.
A segunda: terraform validate não lê o .tfvars. Ele confere a sintaxe, mas erro de valor só aparece no plan. Por isso o plan sempre vem antes do apply, e alguém sempre lê o plan.
william@devops:~$ echo $LESSON_LEARNED
"Módulo herdado é carro usado: antes de pegar a estrada, abre o capô."