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 :Duser-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-1a, us-east-1b e us-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
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
Uma duvida que ficou no arquivo variavel.tf a variavel key_path"
ResponderExcluirnão achei essa refencia no site da terraform ou não soube procurar, mas não consigo gerar essa chave key_path", poderia ajudar?