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

  1. Navegue até o console do AWS Systems Manager
  2. No painel de navegação, selecione Parameter Store e clique no botão Create parameter
  3. Insira no campo Name o valor /asg-mem-ec2/config
  4. Selecione em Type como sendo do formato String
  5. Insira no campo Value o conteúdo abaixo e clique no botão Create parameter
{
        "agent": {
                "metrics_collection_interval": 60,
                "run_as_user": "root"
        },
        "metrics": {
                "append_dimensions": {
                        "AutoScalingGroupName": "${aws:AutoScalingGroupName}",
                        "ImageId": "${aws:ImageId}",
                        "InstanceId": "${aws:InstanceId}",
                        "InstanceType": "${aws:InstanceType}"
                },
                "metrics_collected": {  
                        "mem": {
                                "measurement": [
                                        "mem_used_percent"
                                ],
                                "metrics_collection_interval": 10
                        }
                },
                "aggregation_dimensions" : [["AutoScalingGroupName"], ["InstanceId", "InstanceType"],[]]
        }
}

 

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.