Provisionamento de recursos com o Terraform

Renicius Pagotto Fostaini
9 min readJun 3, 2021

--

No tema de hoje, vamos falar um pouco sobre Terraform e como ela tem ajudado as empresas na criação automatizada de toda a infraestrutura necessária de uma aplicação.

Infraestutura como código (Infrastructure as Code ou Infra as Code)

Antes de entrarmos nos conhecimentos de Terraform, é necessário entender como funciona o IaC (Infra as Code) afinal, o Terraform é uma ferramenta que nos auxilia nessa prática.

Infraestrutura como código nada mais é do que ter toda a infraestrutura da sua aplicação a nível de código, entenda por infraestrutura como VMs, Banco de Dados, Mensageria, Storage e tantos outros serviços necessários e essências para o funcionamento de uma aplicação.

Terraform

Para explicar um pouco do que é o Terraform, temos abaixo um trecho retirado e traduzido do site oficial.

Terraform é uma ferramenta para criar, alterar e criar versões de infraestrutura com segurança e eficiência. Terraform pode gerenciar provedores de serviços existentes e populares, bem como soluções internas personalizadas.

Os arquivos de configuração descrevem para o Terraform os componentes necessários para executar um único aplicativo ou todo o seu datacenter. Terraform gera um plano de execução que descreve o que fará para atingir o estado desejado e, em seguida, o executa para construir a infraestrutura descrita. Conforme a configuração muda, o Terraform é capaz de determinar o que mudou e criar planos de execução incrementais que podem ser aplicados.

A infraestrutura que o Terraform pode gerenciar inclui componentes de baixo nível, como instâncias de computação, armazenamento e rede, bem como componentes de alto nível, como entradas de DNS, recursos de SaaS etc.

Para maiores informações: Introduction — Terraform by HashiCorp

Benefícios

Vamos falar um pouco sobre alguns benefícios de utilizar uma ferramenta IoC como o Terraform

Prevenção de erros de configuração
Muitas vezes, nós deparamos com a necessidade de criar um recurso em algum provedor de nuvem (AWS, Azure, Google…), e realizamos isso de modo manual seguindo uma sequência de passos, com isso podemos esquecer de configurar alguma informação que era vital para nossa aplicação. Com uma ferramenta de IoC como o Terraform, você escreve toda a insfraestrutura necessária da sua aplicação através de código, uma única vez e pode reaproveitar para diversos outros contextos, eliminando processos manuais e possíveis erros de configuração.

Fácil colaboração
Todo o time pode facilmente colaborar com o código da infraestrutura, ou seja, conforme for necessitando de novos recursos para o funcionamento da sua aplicação, o desenvolvedor pode adicionar esse recurso no arquivo de código da infraestrutura.

Documentação da Infraestrura
Todos os recursos necessários para o funcionamento daquele software como um todo ou daquele pequeno microsserviço está no arquivo de código da infraestrutura, logo, você tem uma documentação de tudo o que precisa estar provisionado para a sua aplicação funcionar.

Variedade de Provedores
Terraform trabalha com IaaS, Paas e Faas em diversos provedores de nuvem

Inteligência no Provisionamento
O Terraform possui um arquivo vital para seu funcionamento onde fica guardado todo o histórico de criação, modificação e exclusão de recursos da infraestrutura da sua aplicação, portanto, na sua execução ele compara o que o desenvolvedor escreveu no arquivo de configuração da infraestrutura com o arquivo onde fica guardado o estado atual da sua aplicação para assim poder tomar a decisão de criar, modificar ou excluir algum tipo de recurso.

Instalando o Terraform

Para a instalação do Terraform em nossa máquina local, utilize o link abaixo
Download Terraform — Terraform by HashiCorp

Ao longo desse post, vamos trabalhar com Terraform voltado para o ambiente Azure e para isso utilizaremos o Azure CLI como meio para que o Terraform consiga acessar e provisionar recursos no Azure
Install the Azure CLI | Microsoft Docs

Para configuração do seu Azure CLI para uso no Terraform, segue link
Azure Provider: Authenticating via the Azure CLI | Guides | hashicorp/azurerm | Terraform Registry

Provider

Um provider nada mais é do que o provedor de serviços cloud em que você irá utilizar em suas aplicações, nesse caso, estamos utilizando o Azure, mas existem outros vários providers suportados como AWS, Google Cloud.

Você pode consultar a lista completa de providers disponíveis nesses endereços:
Browse Providers | Terraform Registry
Provider Documentation — Terraform by HashiCorp

Funcionamento

O terraform é composto por uma arquivo principal onde temos toda a nossa infraestrutura declarada em seu formato próprio. Podemos ter um segundo arquivo que é onde fica armazenada as váriaveis de configuração dos recursos como nome do recurso, região do recurso e afins, mas este arquivo é opcional.

Caso você opte por ter um arquivo a parte com todas as variáveis de configuração, não é necessário se preocupar em como o terraform vai ler esse arquivo de configuração, pois ele faz de forma automatica durante sua execução, bastando apenas estar no mesmo diretório do que o arquivo principal.

Arquivo main.tf

terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "=2.46.0"
}
}
}
provider "azurerm" {
features {}
}
resource "azurerm_resource_group" "main" {
name = var.resource_group_name
location = var.resource_group_location
}
resource "azurerm_app_service_plan" "main" {
name = var.app_service_plan_name
location = azurerm_resource_group.main.location
resource_group_name = azurerm_resource_group.main.name
sku {
tier = "Basic"
size = "F1"
}
}
resource "azurerm_app_service" "main" {
name = var.app_service_name
location = azurerm_resource_group.main.location
resource_group_name = azurerm_resource_group.main.name
app_service_plan_id = azurerm_app_service_plan.main.id
}

Acima temos o arquivo de configuração de recursos do Terraform, perceba que no ínicio, mais precisamente nos dois primeiros itens, declaramos o nosso provedor e sua versão de utilização. No restante do documento, declaramos os recursos que necessitam ser provisionados como um Resource Group e um App Service.

Perceba que a localização dos recursos Service Plan e App Service segue a mesma localização do Resource Group, isso é possível pois podemos utilizar declarações de recursos como váriáveis que retornam valores em tempo de execução.

Outro ponto importante é que eu estou definindo no Service Plan, mais precisamente na declaração sku, qual a camada de preço vai ser utilizada. No tier informamos a camada e no size informamos a instância dentro daquela camada, em nosso caso, utilizaremos a camada básica com a instância F1, que é a instancia gratuita.

Arquivo variables.tf

variable "resource_group_name" {
type = string
default = "PagottoTerraformMedium"
}
variable "resource_group_location" {
type = string
default = "Brazil South"
}
variable "app_service_plan_name" {
type = string
default = "pagotto-terraform-plan"
}
variable "app_service_name" {
type = string
default = "pagotto-terraform-appservice"
}

É o arquivo onde fica as variáveis de configuração e seus respectivos valores no qual serão utilizados pelo arquivo principal que em nosso caso é o main.tf

Sempre que definimos um arquivo de variáveis de configuração, acessamos essas variáveis utilizando o seguinte padrão:

var.nomedavariavel

No arquivo principal main.tf demonstrado acima, quando declaramos o Resource Group, perceba que em seu nome, utilizamos uma váriável que está no variables.tf

Para mais informações sobre variáveis de configuração, consulte
Input Variables — Configuration Language — Terraform by HashiCorp

A imagem abaixo mostra como fica a organização dos arquivos

Comandos

Agora vamos abordar alguns comandos básicos e essenciais para o funcionamento do Terraform.

Terraform Init
Esse é o primeiro comando que utilizamos na execução do Terraform sendo responsável por iniciar a execução do nosso arquivo. Nesse passo é verificado o provider que será utilizado e realizado todos os downloads das dependências necessárias.

Caso você opte por modificar o provider, esse comando necessita ser executado novamente para realizar o download dos componentes necessários daquele novo provider.

terraform init

Essa é uma imagem de como ficaria os dois arquivos antes de rodar comando acima.

Após rodar o comando acima, perceba que é realizado o download das dependências necessárias do provider em especifico, para o terraform conseguir executar os próximos passos.

Terraform Plan
Nesse comando, o Terraform irá ler todo o arquivo de recursos (main.tf) e criará um plano de execução, ou seja, o Terraform irá gerar um novo documento contendo quais recursos precisam ser criados, modificados ou removidos.

Nessa etapa o terraform não executará nenhum tipo de ação no provedor de nuvem.

terraform plan -out="main.tfplan"

Na imagem acima, executamos o comando mencionado acima e perceba que foi criado um novo arquivo com o nome main.tfplan que funciona como um passo a passo que o Terraform utilizará para a criação de recursos no provedor de nuvem.

Ao final desse comando, é exibido a quantidade de recursos que vão ser criados (3 to add), a quantidade de recursos que vão ser atualizados (0 to change) e a quantidade de recursos que vão ser excluídos (0 to destroy).

Terraform Apply
Esse é o comando responsável por aplicar realmente o plano de execução gerado no passo anterior, ou seja, ele vai acessar sua conta no provedor de nuvem e provisionará todos os recursos que foi definido.

terraform apply "main.tfplan"

Perceba que ele cria um arquivo “terraform.tfstate” que é responsável por manter todo o histórico de recursos em seu provedor e que será utilizado pelo terraform para a criação de novos recursos e também principalmente para alteração de recursos.

O arquivo “terraform.tfstate” portanto tem um papel fundamental para toda a evolução da sua infraestrutura, pois é nele que está contido todo o histórico de provisionamento da sua infraestrutura e o próprio terraform em futuras ações, irá ler esse arquivo e comparar com o arquivo “main.tf” para definir o que precisa ser adicionado, alterado ou deletado.

Uma importante observação é que a exclusão desse aquivo pode trazer grandes problemas no funcionamento do terraform, uma vez que o próprio terraform não terá mais acesso ao arquivo de estado da sua infraestrutura, pois foi deletado e com isso, ele não sabe o que está provisionado ou não em sua infraestrutura, causando muitos conflitos de recursos e erros de funcionamento.

A imagem abaixo, mostra os recursos provisionados no Azure, após a execusão do comando apply

Terraform Destroy
Esse comando é responsável por excluir todos os recursos presentes no plano de execução gerado pelo comando “terraform plan”

terraform destroy

Na imagem acima, executamos o comando destroy e todos os recursos foram excluídos do nosso provedor conforme mostra a imagem abaixo.

Importante salientar que o arquivo “terraform.tfstate” foi atualizado com as informações de exclusão dos recursos.

Terraform fmt
Para realizar a identação do código do arquivo do terraform, basta executar o seguinte comando

terraform fmt

Para conhecer outros comandos, acesse esse link:
Terraform CLI Documentation — Terraform by HashiCorp

Versionamento (terraform.tfstate)

Como dito anteriormente, o versionamento é essencial para o correto funcionamento do terraform, pois é através dele que o terraform tem a inteligência necessária para saber quais recursos serão criados, atualizados ou excluídos em nossa infraestrutura.

O versionamento é feito através de um arquivo que contém todo o histórico de modificações da sua infraestrutura.

No exemplo acima o arquivo de versionamento está localmente em nossa máquina, porém para uma maior segurança, podemos armazenar esse arquivo em algum Storage de algum provedor de nuvem (AWS S3, Azure Blob Storage, Google Cloud Storage, entre outros).

Conclusão

Como vimos acima, o terraform é uma excelente e poderosa ferramenta que nos auxilia na criação, alteração e exclusão de recursos nos provedores de serviços através de código, evitando a necessidade de provisionamento manual através do portal do provedor.
Podemos combinar o terraform com as pipelines de CI / CD das nossas aplicações com o objetivo de provisionar toda a infraestrutura antes do deploy da aplicação, potencializando a velocidade de entrega de novos produtos uma vez que toda a nossa infraestrutura também estará automatizada.

Gostou do assunto? Ficou com alguma dúvida? Deixe nos comentários

Até mais!

Referências

Terraform by HashiCorp

--

--