Construindo um ambiente escalável com o Azure Virtual Machine Scale Sets através do Terraform

Iluiz Sousa
6 min readMar 28, 2021

--

No último post que fiz , comentei sobre as vantagens de se adotar infraestrutura como código no dia a dia do profissional de infraestrutura.

A ideia do post de hoje, é tirar um pouco as coisas do campo das ideias e trazer para a prática!

Algumas considerações…

O objetivo principal é demonstrar como podemos introduzir infraestrutura como código na nossa rotina usando o Terraform, no entanto, não abordaremos aqui detalhes profundos do Terraform, como melhores práticas e afins.

Desejo que após o post você possa compreender o horizonte de possibilidades que a Infra como código pode trazer e que de fato possa dar os seus primeiros passos

Chega de conversa e vamos logo ao cenário!

Imagine que você recebeu a demanda de conceber a infraestrutura de uma aplicação que tem por característica um volume de acesso alto, porém em períodos sazonais. Segue um exemplo de topologia para este cenário.

Topologia do cenário proposto

Vamos ver como podemos provisionar este cenário com o Terraform utilizando o serviço de Virtual Machine Scale Sets da Azure.

Enfim, o Terraform.

Vamos lá, alguns requisitos para você poder utilizar o Terraform:

→ Ter uma conta em algum Cloud Provider ou uma Stack Privada para poder provisionar os recursos. Aqui você encontra a lista dos providers compatíveis com o Terraform.

→ Possuir o binário do Terraform instalado em sua máquina. O processo de instalação do Terraform é bem tranquilo em várias plataformas. Consulte aqui para mais detalhes.

Funcionamento elementar do Terraform:

Funcionamento elementar do Terraform

Basicamente o binário do Terraform irá ler os arquivos que possuem a extensão .tf , procurando primeiramente pela declaração do provider que será utilizado, no caso utilizarei o provider da Azure, o azurerm. Uma vez que o provider foi identificado será o iniciado download dos plugins necessários para a comunicação do Terraform com a API do provider. Por fim, o recurso declarado nos arquivos .tf será provisionado.

Todo recurso provisionado mediante a interação do Terraform com o provider é salvo num arquivo de estado (tfstate), que por sua vez possui toda a situação da sua infraestrutura.

Claro, esse é o caminho feliz, o Terraform utiliza HCL como linguagem de programação. Eu recomendo fortemente você dar uma olhada na Página da Hashicorp referente ao Terraform para obter mais detalhes.

Configurando o Provider.

Bom a partir daqui irei por a mão na massa de fato. Vou criar uma pasta chamada scaleset-terraform-demo. Dentro dessa pasta, criarei um arquivo chamado provider.tf para declaração do provider.

provider.tf

Observação importante: evite colocar informações sensíveis em hardcode no seu arquivo de declaração. Qualquer pessoa com acesso a essas informações poderá provisionar recursos na sua conta.

Provisionando a infraestrutura:

Para provisionar a infraestrutura do nosso cenário, preciso minimamente dos seguintes recursos: Grupo de recursos, Virtual Network, Subnet, Network Security Group, Public IP, Loadbalancer, Imagem das nossas VMS, Virtual Machine Scale Set.

Bom, vamos ao código:

No mesmo diretório onde criei o arquivo de provider (scaleset-terraform-demo), criarei os arquivos main.tf, variables.tf e output.tf.

No arquivo main.tf irei criar todos os recursos listados acima. Isso não é uma regra a nomenclatura dos arquivos declarativos do Terraform é da sua escolha, os arquivos só precisam estar numa extensão .tf.

Grupo de recursos:

grupo de recursos

Notem que para o argumento location estou usando uma variável. O uso de variáveis é uma boa prática, pois pode tornar seu código mais dinâmico. Numa possível manutenção do código não se faz necessário alterar diretamente o bloco do recurso, basta alterar a variável.

Para declarar a variável, no arquivo variable.tf fiz o seguinte:

declaração da variável location

Pronto! Agora tenho a minha variável location devidamente setada. Mais detalhes sobre variáveis você pode encontrar aqui.

Provisionando o ambiente de Rede:

Configuração da Vnet, Subnet e Network Security Group

Reparem que para a estrutura de rede eu iniciei o bloco de configuração com “data” ao invés de ‘”resource. No dia a dia dificilmente você irá criar uma Virtual network para cada demanda que surge, nesse caso o Terraform permite consumir ou ler recursos já existentes através do bloco de configuração do tipo data.

Provisionando o ip publico:

Bloco de configuração do IP publico

Provisionando o Loadbalancer:

Bloco de configuração do Loadbalancer

O Loadbalancer é um recurso que possui configurações adicionais como regras de inbound, backend pool e listenters. Vou defini-las abaixo através de outros blocos de recurso.

Configurações adicionais do LoadBalancer

Informando a imagem que será usada para as VMs:

Provisionando o Virtual Machine Scale sets:

Agora preciso passar uma métrica para o serviço de virtual machine scale sets, no caso utilizarei uma métrica de CPU, no entanto a Azure permite configurar outras métricas para o treshold do scale sets como memória, requisições, dentre outras.

regra de scale up

Esse bloco de configuração é grande, por isso irei separa-lo em duas imagens. Reparem que na imagem acima estou definindo a regra de scale up do ambiente. Agora precisamos passar a regra de scale down:

regra de scale down

Para finalizar irei configurar um Output. Isso permite que o Terraform exporte uma determinada informação de um recurso provisionado. Para essa demo irei exportar o IP do loadbalancer e também o domain label para que eu possa acessar a aplicação via DNS name. Essa configuração será feita no arquivo de output.tf

Exportando valores

Vamos rodar !!

Para poder rodar, testar e entregar tudo o que foi codificado no diretório onde estão os arquivos .tf tenho que rodar os seguintes comandos:

terraform init: inicialização do backend, arquivo de estado e download dos plugins do provider.

saída do terraform init

terraform plan: Visualização dos recursos que serão provisionados, ou seja, o plano de provisionamento.

saída do terraform plan

terraform apply: Após confirmação (yes), o proviosionamento de fato da infraestrutura no cloud provider.

saída do terraform apply e outputs

Agora irei checar se os meus recursos foram de fato provisionados na e também se meu aplicativo já pode ser acessado via internet conforme estabeleci nas regras do Loadbalancer.

Console de gerenciamento da Azure

Aplicação:

Pagina default do webserver

Basicamente era isso que queria mostrar nesse post. Sei que existem alguns pontos a serem melhores explorados do Terraform, como a utilização de recursos dinâmicos, funções, loops dentre outros, porém se eu fosse abordar tudo isso nesse mesmo post ficaria muito pesado.

Claro que em um ambiente real existem mais detalhes a serem implementados, mas como disse no inicio do post a ideia principal aqui é assimilar como uma demanda pode ser assimilada e codificada via Terraform.

Se esse post te ajudar de alguma forma, ou tiver alguma sugestão de melhoria deixe-me saber!

Até a próxima.

--

--

Iluiz Sousa
Iluiz Sousa

Written by Iluiz Sousa

Tentando me tornar o que chamam de engenheiro DevOps.

No responses yet