Aviso 1: Esse blog post provavelmente vai ser atualizado no futuro.
Aviso 2: Tentei adicionar o máximo de referências em português(Brasil), mas infelizmente a maior parte está escrita em inglês. Aviso 3: Esse blog post vai ser migrado para um repositório do Github, assim fica fácil mandarem sugestões :) https://edsoncelio.github.io/guia-rapido-terraform-ptbr/
Só pra recapitular, o que é o Terraform mesmo?
Baseado na definição da Hashicorp (em uma tradução literal):
O Terraform é uma ferramenta de infraestrutura como código criado pela Hashicorp que permite definir recursos locais e/ou em nuvem em arquivos de configuração legíveis por humanos que você pode versionar, reutilizar e compartilhar. Você pode então usar um fluxo de trabalho consistente para provisionar e gerenciar todo ciclo de vida da sua infraestrutura. A linguagem usada para escrever esses arquivos é o HCL (Hashicorp Configuration Language), mas também pode ser usado JSON.
Mais detalhes e a definição completa, você pode ver aqui.
Por onde começar?
É possível começar com os tutoriais oficiais na plataforma da Hashicorp, ao menos para casos de uso mais comuns (com provedores de nuvem) tem bastante coisa:
Também existem alguns cursos/tutoriais gratuitos no Youtube em português(Brasil), como:
Outras recomendações no Youtube, em inglês:
Learn Terraform (and AWS) by Building a Dev Environment vi FreeCodeCamp
Learn Terraform with Azure by Building a Dev Environment via FreeCodeCamp
E por último, e não menos importante, para quem gosta de livros, deixo a recomendação do Terraform Up & Running.
Agora que já sei usar (ao menos o básico), onde posso aprender as melhores práticas?
A forma de uso do Terraform muitas vezes varia de organização pra organização, mas existem alguns guias que valem a pena serem seguidos (ou ao menos adaptados para a criação de uma melhor prática interna):
Também existem algumas ferramentas/utilitários que ajudam a fazer o enforcement (garantia) dessas melhores práticas, como por exemplo:
Conftest: utilitário para escrever testes estruturados (políticas) usando o Open Policy Agent.
Pre-commit Terraform: git hook com alguns plugins para Terraform, ajudam a garantir que está tudo dentro do esperado antes do push para o repositório.
¹Valeu pelo lembrete desse link Pablo.
Aqui também é importante citar que existem dois grandes grupos em uma discussão infinita quando se fala em organização dos projetos no Terraform:
Recomendo ler sobre as duas opções e escolher a que traz mais benefícios para o seu cenário.
Se Terraform é infra como código, quais opções eu tenho para testar meu código?
O tópico testes de infraestrutura como código ainda tem muito a ser discutido/melhorado, mas até agora, as opções que temos disponíveis são:
Terratest: Framework de testes para Terraform, os testes devem ser escritos em Golang.
Kitchen Terraform: Plugins do Test Kitchen para testar código Terraform, testes devem ser escritos em Ruby.
Módulo Experimental de Testes: Recurso builtin experimental do Terraform que permite que os testes sejam escritos em HCL e executados com o comando
terraform test
.
Mais especificamente para AWS existe o localstack, que é basicamente um framework para simular algumas funcionalidades da AWS localmente.
Deixo aqui também um artigo bem interessante da Hashicorp sobre o assunto: https://www.hashicorp.com/blog/testing-hashicorp-terraform.
Existem ferramentas de segurança para fazer análise estática (ou algum outro tipo) do meu código Terraform?
Existem algumas ferramentas opensource que fazem análise estática e de erros de configuração no código e lint. As mais usadas:
tfsec: ferramenta para análise de código estático e erros de configuração em código Terraform.
checkov: ferramenta para análise de código estático de IaC (infra como código), serve também para CloudFormation, Kubernetes e outros.
tflint: Linter para Terraform, serve para avisar sobre problemas com sintaxe, erros nos principais provedores de nuvem, garantir boas práticas e outras coisas.
Algum material de referência relacionado a Terraform no pipeline de CI/CD?
Falando das plataformas de CI/CD mais usadas, todas tem workflows reutilizáveis para Terraform.
Uma outra abordagem é usar o Atlantis para automatizar a execução dos comandos via Pull Requests (Merge Requests).
E caso eu já tenha recursos criados (manualmente), consigo importar para código HCL?
Esse normalmente é um processo doloroso (dependendo da quantidade de recursos), mas existem alguns utilitários que podem ajudar nisso:
Terraformer: tem suporte para os maiores provedores de nuvem (GCP, AWS e Azure) e outros serviços (como PagerDuty).
Aztfy: importa especificamente recursos da Azure.
Comandos interessantes da CLI do Terraform
terraform console: abre uma CLI interativa pra validar expressões.
terraform graph: gera uma visualização da configuração ou de um
plan
.
Outras ferramentas que podem ser úteis
Infracost: Estimativas de custos nos Pull Requests.
Tfswitch: ferramenta de CLI pra gerenciar versões do Terraform.
Terraboard: dashboard web para inspecionar states do Terraform.
Terraform Visual: ferramenta para ter visualização interativa das mudanças em um
plan
.Terraform-docs²: utilitário para gerar documentação para os módulos Terraform.
K2tf³: utilitário para converter arquivos yaml do kubernetes para HCL.
IAM JSON para Terraform HCL³: utilitário para converter políticas IAM (AWS) em .json para HCL.
²: Valeu pelo lembrete Arielson
³: Valeu pelo lembrete Isac
Por agora é isso, provavelmente mais informações serão adicionadas no futuro :)