Escalado basado en Amazon SQS - Auto Scaling de Amazon EC2

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 el 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 sobre cómo utilizar Amazon SQS, consulte Guí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 que 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 operaciones de carga cambia con el tiempo, podría considerar la posibilidad de utilizar el escalado dinámico para escalar la capacidad de su grupo de Auto Scaling.

Uso del 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 una cola de Amazon SQS personalizada, el escalado dinámico puede ajustarse a la curva de demanda de la 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 como ApproximateNumberOfMessagesVisible para el seguimiento de destino es que el número de mensajes en la cola podría no cambiar en la misma proporción que el 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 depender de varios factores, como 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:

  • Lista de tareas pendientes por instancia: para determinar su lista de tareas pendientes por instancia, comience con el atributo de cola ApproximateNumberOfMessages 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 con el estado InService, para obtener las tareas pendientes por instancia.

  • Lista de tareas pendientes aceptables por instancia: para calcular su valor de destino, 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 que el escalado se realice en función de 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.


                        Amazon EC2 Auto ScalingDiagrama de arquitectura de uso de colas de

Limitaciones y requisitos previos

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

  • Debe utilizar la AWS CLI o un SDK de para publicar su métrica personalizada en CloudWatch. A continuación, puede monitorizar su métrica con la Consola de administración de AWS.

  • Después de publicar la métrica personalizada, debe utilizar la AWS CLI o un SDK de 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étricas que reflejen el uso actual de la cola, utilice el get-queue-attributes comando de SQS. Asegúrese de que ha instalado y configurado la CLI.

Antes de comenzar, debe tener 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 la Guía para desarrolladores de Amazon Simple Queue Service.

Configurar el escalado en función de Amazon SQS

Paso 1: Crear una métrica CloudWatch personalizada

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 por "AWS/". Para obtener más información acerca de la publicación de métricas personalizadas, consulte el tema Publicar métricas personalizadas en la Guí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 comando get-queue-attributes de SQS para 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 granularidad de un minuto como una métrica personalizada de CloudWatch.

    A continuación, se muestra un ejemplo de comando put-metric-data de la CLI.

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

Después de que la aplicación emita 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 la Consola de administración de AWS y desplazándose a la página de 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 de , consulte Ver métricas disponibles en la Guí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. Utilice el comando put-scaling-policy, junto con el archivo config.json 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 se interrumpa la métrica.

Paso 3: Probar la 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 descritos en Tutorial: Envío de un mensaje a una Amazon SQS cola de para añadir mensajes a la 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. Utilice el comando describe-auto-scaling-groups para 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 descritos en Tutorial: Envío de un mensaje a una Amazon SQS cola de para 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. Utilice el comando describe-auto-scaling-groups para comprobar que el grupo ha terminado una instancia.

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