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.