Amazon : Autoscaling via CLI

as-basic-diagram

O Auto Scaling é um recurso da Amazon que permite configurar a escalabilidade e a capacidade de sua instância.

Ferramenta é bastante útil quando se trata de ambientes que apresentam variâncias de consumo de uso por hora , dia ou semana.

A Amazon AWS não cobra nada pelo uso do Auto Scaling, somente é paga a taxa pelo uso do Amazon CloudWatch (que monitora o desempenho de suas instâncias EC2) e o valor pelas instâncias EC2 que são acrescentadas a sua VCP quando há picos de demanda. Quanta a estas instâncias há uma ressalva: Mesmo que uma instância seja iniciada por uma análise do Amazon CloudWatch por digamos 10 minutos e depois seja desligada, ainda assim você será cobrado por 1 hora integral pelo uso dessa Spot Instance.

1) Requisitos :

https://aws.amazon.com/pt/cli/

Em meu notebook por ser Unix estou usando o comando pip para instalar :

Captura de Tela 2015-10-24 às 13.38.23

Após Instalar configure suas credenciais com o comando aws configure :

AWSConfigure

2) Criando AMI para AutoScaling:

O Auto Scaling irá lançar e remover instâncias automaticamente para você, mas irá precisar de uma Amazon Machine Image para funcionar como ponto de partida para lançar novas instâncias.

Para isso será criado uma AMI “Amazon Image Instances” para funcionar como ponto de partida para as novas instâncias .

Criei a ami fajlinux da minha instância Apache :

aws ec2 create-image --instance-id i-c903d82b --name "fajlinux-image"

Captura de Tela 2015-10-25 às 19.33.14

3) Criando uma Launch configuration :

aws autoscaling create-launch-configuration --launch-configuration-name <Nome do launch configuration> --image-id <ID da Imagem>  --instance-type <Tipo da instancia> 

Captura de Tela 2015-10-25 às 19.35.07

4) Configurando o Autoscaling :

aws autoscaling create-auto-scaling-group --auto-scaling-group-name <Nome da ASG> --launch-configuration-name <Nome da Launch Configuration> --load-balancer <NOME DO LB>  --min-size 1 --max-size 3 --vpc-zone-identifier <SUBNET DA INSTANCIA> 

Captura de Tela 2015-10-25 às 17.18.54

Obs : Caso queira saber mais detalhes sobre o load balancer na Amazon , criei este post sobre a configuração do Load Balancer :

http://fajlinux.com.br/cloud/aws-configurando-o-elastic-load-balancer/

Podemos ver as instâncias criadas no console :

Captura de Tela 2015-10-25 às 17.31.21

5) Testes de auto scaling :

Ao terminar todas as instâncias dentro do console da Amazon , foi criado uma instância automaticamente , pois conforme definido na regra foi configurado o mínimo de 1 servidor para ser mantido “–min-size 1” .

Captura de Tela 2015-10-25 às 17.54.40

6) Criando regras baseados em alarmes :

6.1) Definindo quando incrementar o grupo :

Criaremos a regra para aumentar 1 instância no grupo de acordo com sua capacidade.

aws autoscaling put-scaling-policy --auto-scaling-group-name fajlinux-scaling  --policy-name ScaleUp --scaling-adjustment 1 --adjustment-type ChangeInCapacity

Captura de Tela 2015-10-25 às 18.51.06

Para remover uma instância de acordo com sua capacidade

aws autoscaling put-scaling-policy --policy-name ScaleDown --auto-scaling-group-name fajlinux-scaling --scaling-adjustment -1 --adjustment-type ChangeInCapacity

Captura de Tela 2015-10-25 às 18.56.34

OBS : Guarde a saída de cada comando para configurarmos os alarmes.

6.2) Definindo alarmes no CloudWatch para incrementar o ASG :

Criaremos o alarme chamado AddCapacity que a cada dois períodos de 60 segundos, ou seja, a cada 2 minutos, onde caso a porcentagem de CPU esteja superior à 50% ele irá utilizar a regra de ScaleIn criada anteriormente para subir novas instâncias no auto scaling group fajlinux-scaling.

aws cloudwatch put-metric-alarm --alarm-name AddCapacity --metric-name CPUUtilization --namespace AWS/EC2  --statistic Average --period 60 --threshold 50  --comparison-operator GreaterThanOrEqualToThreshold --dimensions "Name=AutoScalingGroupName,Value=fajlinux-scaling" --evaluation-periods 2 --alarm-actions "arn:aws:autoscaling:sa-east-1:390180848832:scalingPolicy:f7ebe475-b80e-473c-a3d2-9a4844eeb656:autoScalingGroupName/fajlinux-scaling:policyName/ScaleUp"

No exemplo abaixo estamos removendo a instância caso ela se mantenha com 40% de CPU no período de 120 segundos.

aws cloudwatch put-metric-alarm --alarm-name RemoveCapacity --metric-name CPUUtilization --namespace AWS/EC2  --statistic Average --period 60 --threshold 40 --comparison-operator LessThanOrEqualToThreshold --dimensions "Name=AutoScalingGroupName,Value=fajlinux-scaling" --evaluation-periods 2 --alarm-actions "arn:aws:autoscaling:sa-east-1:390180848832:scalingPolicy:d991ef22-bc50-45b6-9177-bd352a2b8417:autoScalingGroupName/fajlinux-scaling:policyName/ScaleDown"

Obs : No parâmetro –alarm-actions usamos a saída do comando das regras de definições .

Segue abaixo a tela do cloud watch com os alarmes criados :

Captura de Tela 2015-10-25 às 19.09.46

7) Testes Finais :

Salve o script cpuhigh.sh

#!/bin/bash
for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20; do while : ; do : ; done & done

Rode acompanhando a vm para ver o seu desempenho

sh cpuhigh.sh

Após a execução do script acompanhando o desempenho podemos observar que uma instância foi criada automaticamente e deixando o pool com os 3 hosts conforme definimos na tag “–max-size 3” no passo 4 :

Captura de Tela 2015-10-25 às 20.57.48

Se encontra também disponível no balanceamento :

Captura de Tela 2015-10-25 às 21.02.07

As instâncias também se mantém ativas no balanceamento :

Captura de Tela 2015-10-25 às 21.09.24

Depois a carga de CPU foi normalizada a instância criada foi removida :

Captura de Tela 2015-10-25 às 21.15.33

Gráfico de consumo :

Captura de Tela 2015-10-25 às 21.16.24