Uma introdução conceitual em IaaC com Terraform
Tags: devops, terraform, aws, beginners
Published: 2023-03-06 10:38:08

> **Disclaimer**: _A intenção do artigo é expor meu entendimento do assunto, não sou especialista. Pelo contrário, estou em fase de estudo, então me avisem se eu me equivocar em alguma explicação.

## Introdução
Na minha jornada de desenvolvedor, infra nunca foi um assunto que eu curti. Sempre achei chato esses detalhes de "baixo nível". Mas num cenário de mercado de trabalho cada vez mais acelerado e competitivo, as empresas estão buscando e exigindo que saibamos sobre todo o processo de desenvolvimento de software (talvez eu escreva sobre _code ownership_). Então vamos lá, entender de vez, esse tal de Terraform. 

## Por que usar Terraform?
Para disponibilizar e manter um produto, site ou plataforma digital, é necessária toda uma infraestrutura de máquinas virtuais, banco de dados, rede, entre outros recursos. Existem profissionais dedicados a cuidar de toda essa parte, que antigamente era toda feita manualmente.

Mas isso certamente não era algo muito prático de se fazer e gerenciar. Não é de hoje que a **infraestrutura** começou a ser pensada **como código**. O que faz todo sentido, pois é algo que nós profissionais de TI já estamos acostumados. Hoje existem diversas ferramentas para prover infraestrutura através de código, sendo o Terraform uma das mais usadas . 

## IaaC - Infrastructure as a Code
Vamos olhar o seguinte projeto de infraestrutura para um website e entender onde o Terraform entra:

![Arquitetura de um site estático usando Amazon AWS](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sqxmcvqubv819ig5oisb.png)

Caso queira se aprofundar praticando a criação dessa infra com Terraform, vou deixar a referência no final do artigo. 
Mas aqui eu não quero focar na sintaxe ou em detalhes de implementação do Terraform, eu quero conectar o código do Terraform com a arquitetura de uma infraestrutura. 

Explicando o projeto:
- A infraestrutura foi projetada dentro da cloud da Amazon: AWS. 
- O código encontra-se versionado no Github e de lá ele passa pelo pipeline de CI/CD que utiliza 2 serviços também da Amazon (CodePipeline e CodeBuild). Mas aqui poderia ser também um GitLab ou CircleCI por exemplo. 
- Como estamos falando de um site estático, no final do pipeline teremos um build com os arquivos do site que serão disponibilizados num bucket do S3 (serviço de armazenamento simples da Amazon). 
- Para disponibilizar esse site de forma rápida e com baixa latência, foi utilizado o serviço CloudFront da AWS junto de algumas configurações de certificados e políticas de acesso. 
- Por fim, foi utilizado o Route 53 como serviço de DNS que é a camada mais próxima do acesso externo ao site pelo browser. 

### Ok, mas onde entra o Terraform?

O Terraform vai nos ajudar a provisionar infraestrutura, isto é, na parte de **recursos** e **configurações** necessárias para disponibilizar esse site na internet. E aqui começa o paralelo entre o Terraform e uma infraestrutura física: vamos mapear e configurar `resources`. 
Por exemplo:
- O **bucket do S3** é um recurso que precisamos configurar, pois vamos guardar os arquivos de build do site dentro dele. 
- o **cloudfront** é um recurso que vamos configurar, pois através dele vamos disponibilizar o acesso aos estáticos no bucket com a maior rapidez possível. Também não queremos ninguém acessando o bucket diretamente, por questões de segurança. 
- O **Route 53** é um recurso que vamos utilizar para configurar DNS do site apontando para zonas e domínios seguros. 

## Principais blocos e comandos
Quando falamos de Terraform, estamos falando de código, então é esperado que tenhamos automatização e reutilização. Dessa forma, além do bloco `resource`, o terraform também possui outros blocos importantes como:
- `variable`- uso padrão de sempre.
- `output`- usado para obter informações pós criação de recursos e assim construir infraestrutura de forma dinâmica. 
- `data`- usado para obter informações de recursos externos. 
- `modules`- um dos blocos mais importantes do Terraform. Basicamente segue a mesma ideia geral em termos de programação: _evitar replicação de código através do reuso_. Com ele é possível tanto reutilizar módulos locais quanto módulos publicados externamente, trazendo mais facilidade, rapidez e flexibilidade na montagem da sua infraestrutura.

Por fim, o Terraform trabalha com poucos comandos, mas com muitas opções de customização. A ideia geral dos comandos é bem intuitiva: primeiro vamos inicializar o que for necessário, planejar o que vamos construir e aplicar de fato. Os respectivos comandos:

- `terraform init` (inicializa os arquivos do terraform e baixa módulos, caso especificados)
- `terraform plan` (mostra um resumo do que será executado, ótimo para validar suas mudanças antes de executar)
- `terraform apply` (executa o plano e cria a infraestrutura real)
- `terraform destroy` (bastante usada para estudo)

E outros comandos que gosto de usar são:
  - `terraform validate` (para validar seu código antes do plan)  
  - `terraform fmt`      (para formatação no padrão do Terraform) 

### Terraform State
Outro conceito incrível e importante do Terraform é o **state**. O arquivo `terraform.tfstate` mapeia e armazena o estado da sua infra de forma que seja possível recriá-la inteira, caso precise. Também é usado para melhorar a performance de escalabilidade, além de ser possível versioná-lo para manter um histórico de mudanças. 

##Conclusão##
Bom, pra quem chegou até aqui eu gostaria de agradecer e espero que tenham conseguido pelo menos criar uma imagem mental de como saímos de uma infraestrutura física (em nuvem na verdade) para entendê-la como código através do Terraform. Para mim foi meio abstrato no início, mas é só questão de exposição e um pouco de prática para ficar mais claro. Como desenvolvedor, acho importante sabermos entender o suficiente para dar manutenção num código Terraform. Acho que entender os conceitos e o paralelo com uma arquitetura de um projeto é um bom começo. 

Abaixo vou deixar alguns conteúdos para se aprofundarem, caso se interessem. 

##Referências##
Documentação oficial Terraform: https://developer.hashicorp.com/terraform

Curso fiz na Udemy e recomendo:
DevOps: AWS com Terraform Automatizando sua infraestrutura - Cleber Gasparoto

Artigo da arquitetura usada no exemplo:
https://medium.com/@zakariakhalaf/automate-your-static-website-deployment-on-aws-with-terraform-2419d91102cc

O que é uma infraestrutura como código?
https://www.redhat.com/pt-br/topics/automation/what-is-infrastructure-as-code-iac