O blog da AWS
Como configurar o Amazon EC2 Auto Scaling com base na utilização da memória através do CloudWatch Agent
Através do Amazon EC2 Auto Scaling é possível ajustar dinamicamente a quantidade de instâncias do Amazon EC2, permitindo que uma aplicação tenha o menor custo possível, mas ainda assim mantendo a performance adequada.
Nativamente, o Auto Scaling pode ser configurado baseando-se em métricas de CPU, rede e no número de requisições de um Application Load Balancer. Porém, para configurá-lo utilizando o percentual de consumo de memória, é necessária uma métrica customizada do Amazon CloudWatch.
Visão Geral da Solução
Para coletar e enviar o consumo de memória a uma métrica customizada do CloudWatch, utilizaremos o CloudWatch Agent. Ele será instalado durante a inicialização das instâncias através do User Data do EC2. A configuração será disponibilizada de forma centralizada por meio de um parâmetro do AWS Systems Manager.
No Auto Scaling Group criaremos duas Policies utilizando a métrica customizada. Na primeira, será adicionada uma nova instância quando o valor dessa métrica for superior a 80%; e a segunda, que removerá uma instância se o valor for menor do que 30%.
Pré-requisitos
Para realizar a configuração deste tutorial, é necessário que você possua em seu ambiente uma VPC com ao menos uma Subnet com acesso a Internet.
Criar um Parâmetro no Parameter Store
- Navegue até o console do AWS Systems Manager
- No painel de navegação, selecione Parameter Store e clique no botão Create parameter
- Insira no campo Name o valor /asg-mem-ec2/config
- Selecione em Type como sendo do formato String
- Insira no campo Value o conteúdo abaixo e clique no botão Create parameter
Criar Role no IAM
1. Navegue até o console do AWS IAM
2. No painel de navegação, selecione Roles e clique no botão Create role
3. Selecione EC2 como sendo o serviço que utilizará a role e clique em Next: Permissions
4. Selecione as seguintes policies:
- CloudWatchAgentServerPolicy
- AmazonSSMManagedInstanceCore
5. Avance até seção Review e insira no campo Role name o valor ROLE-MEM-ASG e clique em Create role
Criar Launch Configuration no EC2
1. Navegue até o console do AWS EC2
2. No painel de navegação selecione Launch Configurations, e clique no botão Create launch configuration
3. Em Choose AMI selecione a imagem mais recente do Amazon Linux
4. Em Choose Instance Type mantenha as configurações padrões
5. Em Create Launch Configuration
a. Insira no campo Name o valor LC-MEM-ASG
b. Em IAM role selecione a role ROLE-MEM-ASG
c. Expanda a seção Advanced Details e preencha o User data com o conteúdo abaixo
#!/bin/bash cd /tmp wget https://s3.amazonaws.com/amazoncloudwatch-agent/amazon_linux/amd64/latest/amazon-cloudwatch-agent.rpm sudo rpm -U ./amazon-cloudwatch-agent.rpm sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c ssm:/asg-mem-ec2/config -s |
6. Em Configure Security Group selecione a Security Group de sua preferência
7. Avance até aba Review, confira os dados e clique em Create launch configuration
8. Em Choose an existing key pair selecione Proceed without a key pair, confirme a caixa de verificação logo abaixo e clique em Create launch configuration
Criar Auto Scaling Group no EC2
1. Navegue até o console do AWS EC2
2. No painel de navegação selecione Auto Scaling Groups, e clique no botão Create Auto Scaling Groups
3. Selecione o Launch Configuration LC-MEM-ASG criado na seção anterior e clique em Next Step
4. Em Create Auto Scaling Group
a. Insira no campo Group Name o valor ASG-MEM-ASG
b. Em Group size mantenha o valor 1
c. Em Network e Subnet selecione a VPC e subnets de sua preferência
5. Em Configure scaling policies
a. Selecione Use scaling policies to adjust the capacity of this group
b. Em Scale between insira os valores 1 e 2
c. Em Scale Group Size clique no link Scale the Auto Scaling group using step or simple scaling policies
d. Em Increase Group Size
i. Insira no campo Name o valor AddInstance
ii. Clique no link Create a simple scaling policy
iii. Insira em Take the action o valores Add 1 capacity units
e. Em Decrease Group Size
i. Insira no campo Name o valor RemoveInstance
ii. Clique no link Create a simple scaling policy
iii. Insira em Take the action os valores Remove 1 capacity units
6. Em Configure Tags
a. Insira em Key o valor Name
b. Insira em Value o valor INSTANCE-MEM-ASG
c. Mantenha Tag New Instances selecionado
Criar Alarme de Memória Alta no CloudWatch
Nota: Após a conclusão da etapa anterior, pode levar cerca de 5 minutos até que a métrica criada apareça no CloudWatch
1. Navegue até o console do AWS CloudWatch
2. No painel de navegação selecione Alarms, e clique no botão Create alarm
3. Clique em Select metric
a. Em Custom Namespaces clique em CWAgent
b. Em Metrics clique em AutoScalingGroupName
c. Selecione o Auto Scaling Group ASG-MEM-ASG
d. Finalize clicando no botão Select metric
4. Em Metric altere Period para 1 minute
5. Em Define the alarm condition selecione Greater
6. Em Conditions insira no campo then… o valor 80 e clique em Next
7. Em Notifications clique no botão Remove
8. Em Auto scaling action
a. Clique em Add Auto Scaling Action
b. Em Select a group selecione o Auto Scaling Group ASG-MEM-ASG
c. Em Take the following action… selecione AddInstance
d. Clique em Next
9. Insira em Alarm name o valor HighMemoryAlarm-MEM-ASG
10. Confira os dados e clique no botão Create alarm
Criar Alarme de Memória Baixa no CloudWatch
1. Navegue até o console do AWS CloudWatch
2. No painel de navegação selecione Alarms, e clique no botão Create alarm
3. Clique em Select metric
a. Em Custom Namespaces clique em CWAgent
b. Em Metrics clique em AutoScalingGroupName
c. Selecione o Auto Scaling Group ASG-MEM-ASG
d. Finalize clicando no botão Select metric
4. Em Metric altere Period para 1 minute
5. Em Define the alarm condition selecione Lower
6. Em Conditions insira no campo then… o valor 30 e clique em Next
7. Em Notifications clique no botão Remove
8. Em Auto scaling action
a. Clique em Add Auto Scaling Action
b. Em Select a group selecione o Auto Scaling Group ASG-MEM-ASG
c. Em Take the following action… selecione RemoveInstance
d. Clique em Next
9. Insira em Alarm name o valor LowMemoryAlarm-MEM-ASG
10. Confira os dados e clique no botão Create alarm
Testando o Auto Scaling
1. Navegue até o console do AWS Systems Manager
2. No painel de navegação selecione Session Manager, e clique no botão Start session
3. Selecione a instância INSTANCE-MEM-ASG e clique em Start session
4. Na sessão de terminal aberta execute os seguintes comandos
sudo amazon-linux-extras install epel -y sudo yum install stress -y stress -m 3 –vm-keep -t 600 |
Verificando os resultados
1. Navegue até o console do AWS CloudWatch
2. No painel de navegação selecione Metrics
3. Na aba All metrics
a. Clique no Custom Namespaces CWAgent
b. Em Metrics clique em AutoScalingGroupName
c. Marque a caixa de seleção do Auto Scaling Group ASG-MEM-ASG
4. Na aba Graphed metrics altere o valor de Period de 5 Minutes para 1 minute
5. Depois de 15 minutos você deve visualizar um gráfico com as seguintes características:
Na primeira seção do gráfico, vemos o consumo total de memória do Auto Scaling Group constante por volta de 10%, até quando o comando stress é executado ocasionando um pico que se estabiliza próximo a 90%.
Isso faz com que o alarme HighMemoryAlarm-MEM-ASG adicione uma nova instância no Auto Scaling Group e o valor do gráfico se estabilize por volta de 50%, conforme visto na segunda seção.
Na terceira e última seção do gráfico vemos duas quedas, a primeira causada quando o comando stress é terminado após 10 minutos de execução, e a segunda pela remoção de uma das instâncias do Auto Scaling Group através do alarme LowMemoryAlarm-MEM-ASG.
Além disso, você pode acompanhar o histórico de ações do Auto Scaling Group clicando na aba Activity History, conforme exibido na imagem abaixo.
Conclusão
Nesse blog post, descrevemos as instruções detalhadas da configuração do Amazon EC2 Auto Scaling, para suportar aplicações que primariamente dependem do uso de memória. Para coletar a métrica aplicada na configuração, nós utilizamos o CloudWatch Agent.
Para saber mais sobre outras métricas coletadas pelo CloudWatch Agent, visite Metrics Collected by the CloudWatch Agent.
Nota: Para evitar cobranças futuras, lembre-se de excluir todos os recursos criados.
Sobre o Autor
Thiago Pádua
Arquiteto de Soluções da AWS, atua com o desenvolvimento e apoio aos parceiros do Setor Público. Trabalhou anteriormente com desenvolvimento de software e integração de sistemas, principalmente na indústria de Telecomunicações. Tem um interesse especial em arquitetura de microserviços, serverless e containers.