Configurar escalabilidade baseada no Amazon SQS - Amazon EC2 Auto Scaling

Configurar escalabilidade baseada no Amazon SQS

O procedimento a seguir descreve como configurar a escalabilidade com base no Amazon SQS. Você aprenderá como criar uma métrica personalizada do CloudWatch, como configurar uma política de rastreamento de destino usando a AWS CLI e como testar sua configuração.

Antes de iniciar, certifique-se de que você tenha a AWS CLI instalada e configurada. Além disso, é necessário ter uma fila do Amazon SQS para usar. Nas tarefas a seguir, supõe-se que você já tenha uma fila (padrão ou FIFO), um grupo do Auto Scaling e instâncias do EC2 executando a aplicação que usa a fila.

Para obter mais informações sobre o Amazon SQS, consulte o Guia do desenvolvedor do Amazon Simple Queue Service.

Etapa 1: Criar uma métrica personalizada do CloudWatch

Uma métrica personalizada é definida usando um nome de métrica e um namespace de sua escolha. Namespaces para métricas personalizadas não podem começar com AWS/. Para obter mais informações sobre a publicação de métricas personalizadas, consulte o tópico Publicar métricas personalizadas no Manual do usuário do Amazon CloudWatch.

Siga este procedimento para criar a métrica personalizada lendo primeiro as informações da sua conta da AWS. Depois, calcule a métrica de backlog por instância, conforme recomendado em uma seção anterior. Por fim, publique esse número no CloudWatch a uma granularidade de 1 minuto. Sempre que possível, é altamente recomendável que você escale as métricas com uma granularidade de um minuto para garantir uma resposta mais rápida às alterações na carga do sistema.

Para criar uma métrica personalizada do CloudWatch (AWS CLI)
  1. Use o comando do SQS get-queue-attributes para obter o número de mensagens em espera na fila (ApproximateNumberOfMessages).

    aws sqs get-queue-attributes --queue-url https://sqs.region.amazonaws.com/123456789/MyQueue \ --attribute-names ApproximateNumberOfMessages
  2. Use o comando describe-auto-scaling-groups para obter a capacidade de execução do grupo, que é o número de instâncias no estado do ciclo de vida InService. Esse comando retorna as instâncias de um grupo do Auto Scaling juntamente com seu estado de ciclo de vida.

    aws autoscaling describe-auto-scaling-groups --auto-scaling-group-names my-asg
  3. Calcule o backlog por instância dividindo o número aproximado de mensagens disponíveis para recuperação da fila pela capacidade de execução do grupo.

  4. Criar um script que seja executado a cada minuto para recuperar o valor do backlog por instância e publicá-lo em uma métrica personalizada do CloudWatch. Ao publicar uma métrica personalizada, você especifica o nome da métrica, o espaço nominal, a unidade, o valor e zero ou mais dimensões. Uma dimensão consiste em um nome e um valor de dimensão.

    Para publicar sua métrica personalizada, substitua os valores do espaço reservado em itálico pelo nome da métrica preferida, pelo valor da métrica, por um namespace (desde que não comece com "AWS“) e pelas dimensões (opcional) e execute o seguinte comando put-metric-data.

    aws cloudwatch put-metric-data --metric-name MyBacklogPerInstance --namespace MyNamespace \ --unit None --value 20 --dimensions MyOptionalMetricDimensionName=MyOptionalMetricDimensionValue

Depois que sua aplicação estiver emitindo a métrica desejada, os dados serão enviados para o CloudWatch. A métrica é visível no console do CloudWatch. Você pode acessá-la fazendo login no Console de gerenciamento da AWS e navegando para a página do CloudWatch. Depois, visualize a métrica navegando até a página de métricas ou procurando-a usando a caixa de pesquisa. Para obter mais informações sobre visualização de métricas, consulte View available metrics (Visualizar métricas disponíveis) no Manual do usuário do Amazon CloudWatch.

Etapa 2: Criar uma política de escalabilidade com monitoramento do objetivo

A métrica que você criou agora pode ser adicionada a uma política de escalabilidade com rastreamento de destino.

Para criar uma política de escalabilidade com rastreamento do destino (AWS CLI)
  1. Use o comando cat a seguir para especificar um valor de destino para sua política de escalabilidade e uma especificação de métrica personalizada em um arquivo JSON chamado config.json em seu diretório inicial. Substitua cada espaço reservado para entrada do usuário por suas próprias informações. Para o TargetValue, calcule a métrica backlog aceitável por instância e insira-a aqui. Para calcular esse número, decida um valor de latência normal e divida-o pelo tempo médio necessário para processar uma mensagem, conforme descrito em uma seção anterior.

    Se você não especificou nenhuma dimensão para a métrica criada na etapa 1, não inclua nenhuma dimensão na especificação métrica personalizada.

    $ cat ~/config.json { "TargetValue":100, "CustomizedMetricSpecification":{ "MetricName":"MyBacklogPerInstance", "Namespace":"MyNamespace", "Dimensions":[ { "Name":"MyOptionalMetricDimensionName", "Value":"MyOptionalMetricDimensionValue" } ], "Statistic":"Average", "Unit":"None" } }
  2. Use o comando put-scaling-policy, juntamente com o arquivo config.json que você criou na etapa anterior, para criar sua política de escalabilidade.

    aws autoscaling put-scaling-policy --policy-name sqs100-target-tracking-scaling-policy \ --auto-scaling-group-name my-asg --policy-type TargetTrackingScaling \ --target-tracking-configuration file://~/config.json

    Isso cria dois alarmes: um para escalabilidade e outro para dimensionamento. Isso também retorna o nome do recurso da Amazon (ARN) da política registrada no CloudWatch que o CloudWatch usa para invocar a dimensionamento sempre que a métrica for violada.

Etapa 3: Testar sua política de escalabilidade

Depois que a configuração estiver concluída, verifique se a sua política de escalabilidade está funcionando. É possível testá-la aumentando o número de mensagens na fila do SQS e verificando se o grupo do Auto Scaling iniciou uma instância do EC2 adicional. Também é possível testá-la diminuindo o número de mensagens na fila do SQS e verificando se o grupo do Auto Scaling terminou uma instância do EC2.

Para testar a função de expansão
  1. Siga as etapas em Criar uma fila padrão do Amazon SQS e enviar uma mensagem ou Criar uma fila FIFO do Amazon SQS e enviar uma mensagem para adicionar mensagens à sua fila. Certifique-se de que você aumentou o número de mensagens na fila para que a métrica backlog por instância exceda o valor de destino.

    Pode levar alguns minutos para que as alterações invoquem o alarme.

  2. Use o comando describe-auto-scaling-groups para verificar se o grupo iniciou uma instância.

    aws autoscaling describe-auto-scaling-groups --auto-scaling-group-name my-asg
Para testar a função de redução
  1. Siga as etapas em Receber e excluir mensagens (console) para excluir mensagens da fila. Certifique-se de que você diminuiu o número de mensagens na fila para que a métrica backlog por instância não fique abaixo do valor de destino.

    Pode levar alguns minutos para que as alterações invoquem o alarme.

  2. Use o comando describe-auto-scaling-groups para verificar se o grupo terminou uma instância.

    aws autoscaling describe-auto-scaling-groups --auto-scaling-group-name my-asg