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 ficheiros
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 ficheiro 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 ficheiro 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 ficheiro 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 ficheiro de configuração da infraestrutura com o ficheiro
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 ficheiro principal onde temos toda a nossa infraestrutura
declarada em seu formato próprio. Podemos ter um segundo ficheiro que é onde
fica armazenada as váriaveis de configuração dos recursos como nome do recurso,
região do recurso e afins, mas este ficheiro é opcional.
Caso você
opte por ter um ficheiro a parte com todas as variáveis de configuração, não é
necessário se preocupar em como o terraform vai ler esse ficheiro de
configuração, pois ele faz de forma automatica durante sua execução, bastando
apenas estar no mesmo diretório do que o ficheiro principal.
Ficheiro 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 ficheiro 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.
Ficheiro 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 ficheiro
onde fica as variáveis de configuração e seus respectivos valores no qual serão
utilizados pelo ficheiro principal que em nosso caso é o main.tf
Sempre que
definimos um ficheiro de variáveis de configuração, acessamos essas variáveis
utilizando o seguinte padrão:
var.nomedavariavel
No ficheiro
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 ficheiros
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 ficheiro. 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 ficheiros 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 ficheiro 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 ficheiro
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 ficheiro “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 ficheiro
“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 ficheiro e comparar com o ficheiro “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 ficheiro 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 ficheiro “terraform.tfstate” foi atualizado com as informações
de exclusão dos recursos.
Terraform
fmt
Para realizar a
identação do código do ficheiro 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 ficheiro que contém todo o histórico de
modificações da sua infraestrutura.
No exemplo
acima o ficheiro de versionamento está localmente em nossa máquina, porém para
uma maior segurança, podemos armazenar esse ficheiro 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

Nenhum comentário:
Postar um comentário