Realizando Deploy de Auto Scaling Groups e Elastic Load Balancers na AWS com Terraform

Share:


Mais um post maneiro da serie de Terraform.
Se você não viu o anterior, onde abordamos a criação de um ambiente contendo instâncias EC2 em Load Balancer, da uma passada lá que tá legal!

Dessa vez vamos um pouco mais a fundo, onde vamos replicar o conhecimento do post anterior, porém adicionando um pouco de esteróides, onde vamos deixar a mestra estrutura em Multi-AZ e com Auto Scaling da aplicação.

Confira o projeto no Github 


Estrutura do Projeto

Nosso projeto é bem simples, vai contar com dois arquivos de configuração e um arquivo de bootstrap que vai conter as instruções para a configuração do nosso server.

.
├── README.md
├── main.tf
├── user-data
│   └── bootstrap.sh
└── variables.tf


Arquitetura da nossa Stack 

Nosso projeto irá contar com as seguintes features:

  • Elastic Load Balancer (ELB) 
  • Auto Scaling Group com Launch Configuration 
  • Instâncias em Multi-AZ
  • Scaling Policy para Up e Down 



variables.tf

Vamos começar criando nosso arquivo de configurações que irá armazenar nossas variáveis que vamos replicar para o resto do nosso projeto.  Vamos usar bem poucas, sendo elas o key_path, que irá armazenar um caminho local para a chave pública que iremos importar para dentro das instâncias para fazer conexões SSH você deverá alterar aqui, senão sua aplicação vai ficar incessível pra você, a region que irá armazenar somente a região da AWS que iremos realizar o deploy da nossa arquitetura, ami que irá armazenar o id do AMI que vamos usar de base para nosso projetos, nesse caso estaremos utilizando a versão mais recente da distribuição Amazon Linux e finalimente o instance_type que irá armazenar a classe da instância que iremos utilizar de base, nesse caso estaremos utilizando uma das menores possíveis para uso general, uma t2.micro. Modifiquem a vontade :D


user-data/bootstrap.sh

Dentro da pasta user-data, vamos ter um arquivo chamado bootstrap.sh, onde vamos utilizar o mesmo como script de inicialização das nossas instâncias. Ele é bem simples. Vamos instalar o apache e modificar o index do servidor pra exibir uma mensagem aleatória.



main.tf

Nosso arquivo main é um pouco mais longo que o normal. Nele vamos configurar o restante da arquitetura da nossa aplicação. Elé é bem maior que o anterior, e nele vamos utilizar todas as variábeis que criamos anteriormente. A nossa missão aqui é simples

* Criar um Launch Configuration 
* Vincular nosso Launch Configuration em um Auto Scaling Group
* Colocar nosso Scaling de instâncias em Multi-AZ
* Criar um Load Balancer escutando a porta 80 
* Vincular nosso Auto Scaling Group ao Load Balancer
* Criar uma Policy para Scale UP das máquinas
* Criar uma Policy para Scale Down das máquinas

Vamos criar 2 security groups, um para as nossas instâncias diretamentamente chamado websg e outro para o nosso ELB chamado elbsg, onde vamos liberar somente a porta 80. Vamos criar uma regra para liberar o acesso SSH também.

Nosso Launch Configuration vai se chamar webcluster, onde vamos utilizar nossa AMI do Amazon Linux, anexar nosso Security Group e apontar nosso user-data, onde ditamos o script inicial de inicilização das nossas máquinas.

No nosso Auto Scaling Group que vamos chamar de scalegroup, vamos fazer referência ao nosso Launch Configuration e definir as availability zones como us-east-1aus-east-1bus-east-1c. Desta forma podemos ter alguns níves de alta disponibilidade caso alguma zona específica da Virginia venha a apresentar algum problema.

Vamos definir nossas métricas de Scale Up e Scale Down da seguinte forma:

* Sempre que a média de processamento do nosso Auto Scaling Group ficar acima de 60% durante 2 checagens com intervalo de 2 minutos entre elas, vamos subir uma nova instância.
* Sempre que a média de processamento do nosso Auto Scaling Group ficar abaixo de 10% durante 2 checagens com intervalos de 2 minutos entre elas, vamos matar uma instância.



Deploy da nossa Stack

Vamos iniciar o provider do Terraform. Para a instalação, você pode consultar o inicio deste ultimo artigo sobre Terraform.

terraform init


Agora vamos executar o apply das nossas configurações para fazer o deploy da nossa infraestrutura

terraform apply



No final do script iremos ter o output do DNS do nosso ELB criado.

Conferindo o Deploy

No painel de EC2, podemos verificar na aba de Instances, Load Balancers, Launch Configurations e Target Groups conferir toda a nossa Stack de pé.

 



Testando 

Vamos acessar o DNS do nosso Load Balancer para verificar o deploy da nossa instância.



Testando o Scaling 

Existem várias formas de testar métricas de Auto Scaling. Quando se trata de scaling por overhead de processamento, uma delas é utilizando a ferramenta Stress, velha amiga aqui do blog.

Conectando na nossa instância via SSH, vamos fazer a instalação da mesma via o gerenciador de pacotes.


sudo yum install -y stress


Vamos realizar o stress para forçar os cores da nossa instância. Como nossa classe de instância só possui 1 core, vou utilizar o parametro 1. Adapte aqui conforme o necessário. Além disso vou criar 2 processo de stress de memória da máquina. Vou monitorar a eficiência do teste junto a ferramenta htop.

stress -c 1 --vm 2



Vamos aguardar alguns minutos pra ver se nosso Scale UP está funcionando conforme deveria.
Após nossos checks de processamento comprovarem que nosso Auto Scaling Group realmente precisa de uma instância a mais,  ela automaticamente irá ser iniciada.



Destruindo nosso ambiente

Agora chegou a hora da parte mais legal do Terraform, o comando destroy, onde vamos apagar todas as configurações criadas no apply.


terraform destroy


Espero ter ajudado!  :D


Um comentário:

  1. Uma duvida que ficou no arquivo variavel.tf a variavel key_path"

    não achei essa refencia no site da terraform ou não soube procurar, mas não consigo gerar essa chave key_path", poderia ajudar?

    ResponderExcluir