Escalado basado en Amazon SQS - Amazon EC2 Auto Scaling

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Escalado basado en Amazon SQS

En esta sección se muestra cómo escalar su grupo de Auto Scaling en respuesta a los cambios en la carga del sistema en una cola de Amazon Simple Queue Service (Amazon SQS). Para obtener más información acerca de cómo puede utilizar Amazon SQS, consulteGuía para desarrolladores de Amazon Simple Queue Service.

Hay algunas situaciones en las que es posible que tenga que pensar en el escalado en respuesta a la actividad en una cola de Amazon SQS. Por ejemplo, supongamos que tiene una aplicación web que permite a los usuarios cargar imágenes y utilizarlas en línea. En este escenario, cada imagen requiere cambiar el tamaño y la codificación antes de poder publicarla. La aplicación se ejecuta en instancias EC2 de un grupo de Auto Scaling y está configurado para administrar las velocidades típicas de carga. Las instancias con error se terminan y se sustituyen para mantener los niveles de instancia actuales en todo momento. La aplicación coloca los datos de mapa de bits sin procesar de las imágenes en una cola para su procesamiento. Procesa las imágenes y, a continuación, publica las imágenes procesadas donde puedan verlas los usuarios. La arquitectura de este escenario funciona bien si el número de operaciones de carga de imágenes no varía con el tiempo. Sin embargo, si el número de cargas cambia con el tiempo, podría considerar la posibilidad de utilizar el escalado dinámico para escalar la capacidad del grupo de Auto Scaling.

Utilizar el seguimiento de destino con la métrica correcta

Si utiliza una política de escalado de seguimiento de destino basada en una métrica de cola de Amazon SQS personalizada, el escalado dinámico puede ajustarse a la curva de demanda de su aplicación de forma más eficaz. Para obtener más información sobre cómo elegir métricas para el seguimiento de destino, consulte Elección de métricas.

El problema con el uso de una métrica de CloudWatch de Amazon SQS comoApproximateNumberOfMessagesVisiblePara el seguimiento de destino es que el número de mensajes de la cola no tiene por qué cambiar en proporción al tamaño del grupo de Auto Scaling que procesa los mensajes de la cola. Eso se debe a que el número de mensajes de su cola de SQS no es el único factor que define el número de instancias necesarias. El número de instancias del grupo de Auto Scaling puede controlarse mediante varios factores, entre los que se incluyen el tiempo que se tarda en procesar un mensaje y la cantidad de latencia (retraso de la cola) aceptable.

La solución es utilizar una métrica de tareas pendientes por instancia con el valor de destino igual a las tareas pendientes aceptables por instancia que desea mantener. Puede calcular estos números como se indica a continuación:

  • Cargo atrasado por instancia: Para calcular su trabajo atrasado por instancia, comience con elApproximateNumberOfMessagesatributo de cola para determinar la longitud de la cola de SQS (número de mensajes disponibles para recuperación de la cola). Divida ese número por la capacidad de ejecución de la flota, que para un grupo de Auto Scaling es el número de instancias de la lista deInService, para obtener el trabajo atrasado por instancia.

  • Demasiado aceptable por instancia: Para calcular su valor objetivo, determine en primer lugar lo que la aplicación puede aceptar en términos de latencia. A continuación, deberá tomar el valor de latencia aceptable y dividirlo por el tiempo medio que una instancia EC2 tarda en procesar un mensaje.

Para ilustrarlo con un ejemplo, el ApproximateNumberOfMessages actual es 1500 y la capacidad de ejecución de la flota es 10. Si el tiempo de procesamiento medio es de 0,1 segundos para cada mensaje y la mayor latencia aceptable es de 10 segundos, el número de tareas pendientes aceptables por instancia es de 10/0,1, que equivale a 100. Esto significa que 100 es el valor de destino para su política de seguimiento de destino. Si la lista de tareas pendientes por instancia se encuentra actualmente en 150 (1500/10), su flota se amplia en cinco instancias para mantener la proporción con el valor de destino.

En los procedimientos siguientes se muestra cómo publicar la métrica personalizada y crear la política de escalado de seguimiento de destino que configura el grupo de Auto Scaling para escalar basándose en estos cálculos.

Existen tres puntos principales para esta configuración:

  • Un grupo de Auto Scaling para administrar las instancias EC2 para procesar mensajes de una cola de SQS.

  • Una métrica personalizada para enviar a Amazon CloudWatch que mide el número de mensajes de la cola por instancia EC2 en el grupo de Auto Scaling.

  • Una política de seguimiento de destino que configura su grupo de Auto Scaling para escalar basándose en la métrica personalizada y un valor de destino establecido. Las alarmas de CloudWatch invocan la política de escalado.

El siguiente diagrama ilustra la arquitectura de esta configuración.


                        Auto Scaling de Amazon EC2 utilizando el diagrama de arquitectura de colas

Limitaciones y requisitos previos

Para utilizar esta configuración, debe tener en cuenta las siguientes limitaciones:

  • Debe utilizar elAWS CLIo un SDK para publicar su métrica personalizada en CloudWatch. A continuación, puede monitorizar su métrica con la AWS Management Console.

  • Después de publicar la métrica personalizada, debe usar la herramientaAWS CLIo un SDK para crear una política de escalado de seguimiento de destino con una especificación de métrica personalizada.

Las siguientes secciones explican cómo usar la AWS CLI para las tareas que necesita realizar. Por ejemplo, para obtener datos de métrica que reflejen el uso actual de la cola, utilice elget-queue-attributescomando. Asegúrese de que ha instalado y configurado la CLI.

Antes de comenzar, debe disponer de una cola de Amazon SQS. En las siguientes secciones se presupone que ya tiene una cola (estándar o FIFO), un grupo de Auto Scaling e instancias EC2 ejecutándose en la aplicación que utiliza la cola. Para obtener más información acerca de Amazon SQS, consulte laGuía para desarrolladores de Amazon Simple Queue Service.

Configurar el escalado basado en Amazon SQS

Paso 1: Crear una métrica personalizada de CloudWatch

Una métrica personalizada se define mediante un nombre de métrica y un espacio de nombres de su elección. Los espacios de nombres para métricas personalizadas no pueden empezar porAWS/. Para obtener más información acerca de la publicación de métricas personalizadas, consulte laPublicar métricas personalizadas de publicaciónen la secciónGuía del usuario de Amazon CloudWatch.

Siga este procedimiento para crear la métrica personalizada leyendo primero la información de su cuenta de AWS. A continuación, calcule las tareas pendientes para cada métrica de instancia, tal como se recomienda en una sección anterior. Por último, publique este número en CloudWatch con una periodicidad de un minuto. Siempre que sea posible, le recomendamos que cuando realizado el escalado basado en métricas, utilice una granularidad de un minuto para garantizar una respuesta más rápida a los cambios en la carga del sistema.

Para crear una métrica personalizada de CloudWatch

  1. Utilice el SQSget-queue-attributesPara obtener el número de mensajes en espera en la cola (ApproximateNumberOfMessages).

    aws sqs get-queue-attributes --queue-url https://sqs.region.amazonaws.com/123456789/MyQueue \ --attribute-names ApproximateNumberOfMessages
  2. Utilice el comando describe-auto-scaling-groups para obtener la capacidad de ejecución del grupo, que es el número de instancias que tienen el estado de ciclo de vida InService. Este comando devuelve las instancias de un grupo de Auto Scaling junto con su estado de ciclo de vida.

    aws autoscaling describe-auto-scaling-groups --auto-scaling-group-names my-asg
  3. Calcule las tareas pendientes por instancia dividiendo el número aproximado de mensajes disponibles para su recuperación de la cola por la capacidad de ejecución de la flota.

  4. Publique los resultados con un nivel de detalle de 1 minuto como una métrica personalizada de CloudWatch.

    A continuación se muestra un ejemplo de CLIput-metric-datacomando.

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

Una vez emitida la métrica deseada, los datos se envían a CloudWatch. La métrica aparece en la consola de CloudWatch. Puede acceder a ella iniciando sesión en elAWS Management Consoley navegar a la página CloudWatch. A continuación, puede ver la métrica desplazándose a la página de métricas o buscándola usando el campo de búsqueda. Para obtener información sobre cómo ver las métricas, consulte.Ver métricas disponiblesen laGuía del usuario de Amazon CloudWatch.

Paso 2: Crear una política de escalado de seguimiento de destino

Después de publicar la métrica personalizada, cree una política de escalado de seguimiento de destino con una especificación de métrica personalizada.

Para crear una política de escalado de seguimiento de destino

  1. Utilice el siguiente comando para especificar un valor de destino para su política de escalado en un archivo config.json del directorio principal.

    Para el TargetValue, calcule las tareas pendientes aceptables por cada métrica de instancia e introdúzcala aquí. Para calcular este número, decida un valor de latencia normal y divídalo por el tiempo medio que se tarda en procesar un mensaje.

    $ cat ~/config.json { "TargetValue":100, "CustomizedMetricSpecification":{ "MetricName":"MyBacklogPerInstance", "Namespace":"MyNamespace", "Dimensions":[ { "Name":"MyOptionalMetricDimensionName", "Value":"MyOptionalMetricDimensionValue" } ], "Statistic":"Average", "Unit":"None" } }
  2. Usarput-scaling-policy, junto con el comandoconfig.jsonque ha creado en el paso anterior, para crear la política de escalado.

    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

    Esto crea dos alarmas: una para el escalado ascendente y otra para el escalado descendente. También devuelve el Nombre de recurso de Amazon (ARN) de la política que se registra en CloudWatch, que CloudWatch utiliza para invocar el escalado siempre que la métrica se incumple.

Paso 3: Probar su política de escalado

Una vez que finalice la configuración, verifique que la política de escalado funcione. Puede probarla aumentando el número de mensajes en la cola de SQS y asegúrese después de que el grupo de Auto Scaling ha lanzado una instancia EC2 adicional. También puede probarla reduciendo el número de mensajes en la cola de SQS y asegurándose después de que el grupo de Auto Scaling ha terminado una instancia EC2.

Para probar la función de escalado descendente

  1. Siga los pasos deTutorial: Enviar un mensaje a una cola de Amazon SQSPara agregar mensajes a su cola. Asegúrese de que ha aumentado el número de mensajes en la cola de forma que las tareas pendientes por cada métrica de instancia supere el valor de destino.

    Este proceso puede tardar unos minutos hasta que los cambios activen la alarma de CloudWatch.

  2. Usardescribe-auto-scaling-groupsPara comprobar que el grupo ha lanzado una instancia.

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

Para probar la función de escalado descendente

  1. Siga los pasos deTutorial: Enviar un mensaje a una cola de Amazon SQSPara eliminar mensajes de la cola. Asegúrese de que ha disminuido el número de mensajes en la cola de forma que las tareas pendientes por cada métrica de instancia esté por debajo del valor de destino.

    Este proceso puede tardar unos minutos hasta que los cambios activen la alarma de CloudWatch.

  2. Usardescribe-auto-scaling-groupsPara verificar que el grupo ha terminado una instancia.

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