Uso de AWS Lambda con Amazon SQS - AWS Lambda

Uso de AWS Lambda con Amazon SQS

Puede usar una función AWS Lambda para procesar mensajes en una cola Amazon Simple Queue Service (Amazon SQS). Las asignaciones de origen de eventos de Lambda admiten colas estándar y colas de primero en entrar, primero en salir (FIFO). Con Amazon SQS, puede descargar tareas de un componente de su aplicación enviándolas a una cola para, a continuación, procesarlas de forma asíncrona.

Lambda sondea la cola e invoca la función Lambda sincrónicamente con un evento que contenga mensajes de cola. Lambda lee los mensajes en lotes e invoca la función una vez por lote. Cuando la función procesa correctamente un lote, Lambda elimina sus mensajes de la cola. En el ejemplo siguiente se muestra un evento para un lote de dos mensajes.

ejemplo Evento de mensaje de Amazon SQS (cola estándar)

{ "Records": [ { "messageId": "059f36b4-87a3-44ab-83d2-661975830a7d", "receiptHandle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...", "body": "Test message.", "attributes": { "ApproximateReceiveCount": "1", "SentTimestamp": "1545082649183", "SenderId": "AIDAIENQZJOLO23YVJ4VO", "ApproximateFirstReceiveTimestamp": "1545082649185" }, "messageAttributes": {}, "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3", "eventSource": "aws:sqs", "eventSourceARN": "arn:aws:sqs:us-east-2:123456789012:my-queue", "awsRegion": "us-east-2" }, { "messageId": "2e1424d4-f796-459a-8184-9c92662be6da", "receiptHandle": "AQEBzWwaftRI0KuVm4tP+/7q1rGgNqicHq...", "body": "Test message.", "attributes": { "ApproximateReceiveCount": "1", "SentTimestamp": "1545082650636", "SenderId": "AIDAIENQZJOLO23YVJ4VO", "ApproximateFirstReceiveTimestamp": "1545082650649" }, "messageAttributes": {}, "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3", "eventSource": "aws:sqs", "eventSourceARN": "arn:aws:sqs:us-east-2:123456789012:my-queue", "awsRegion": "us-east-2" } ] }

De forma predeterminada, Lambda invoca su función tan pronto como los registros estén disponibles en la cola SQS. Lambda sondeará hasta 10 mensajes en su cola a la vez y enviará ese lote a la función. Para evitar invocar a la función con un número de registros pequeño, puede indicar al origen del evento que almacene en búfer registros hasta 5 minutos configurando una ventana de lote. Antes de invocar la función, Lambda continúa sondeando los mensajes de la cola estándar de SQS hasta que caduque la ventana de lotes, se alcance el límite de carga útil o se alcance el tamaño completo del lote.

Para las colas FIFO, los registros contienen atributos adicionales relacionados con la deduplicación y la secuenciación.

ejemplo Evento de mensaje de Amazon SQS (cola FIFO)

{ "Records": [ { "messageId": "11d6ee51-4cc7-4302-9e22-7cd8afdaadf5", "receiptHandle": "AQEBBX8nesZEXmkhsmZeyIE8iQAMig7qw...", "body": "Test message.", "attributes": { "ApproximateReceiveCount": "1", "SentTimestamp": "1573251510774", "SequenceNumber": "18849496460467696128", "MessageGroupId": "1", "SenderId": "AIDAIO23YVJENQZJOL4VO", "MessageDeduplicationId": "1", "ApproximateFirstReceiveTimestamp": "1573251510774" }, "messageAttributes": {}, "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3", "eventSource": "aws:sqs", "eventSourceARN": "arn:aws:sqs:us-east-2:123456789012:fifo.fifo", "awsRegion": "us-east-2" } ] }

Cuando Lambda lee un lote, los mensajes se mantienen en la cola, pero se ocultan durante el tiempo de espera de visibilidad de la cola. Cuando la función procesa correctamente un lote, Lambda elimina sus mensajes de la cola. Si la función se limita, devuelve un error o no responde, el mensaje se hace visible de nuevo. Todos los mensajes de un lote con errores volverán a la cola, por lo que el código de su función debe ser capaz de procesar el mismo mensaje varias veces sin efectos secundarios.

Escalado y procesamiento

Para las colas estándar, Lambda utiliza el sondeo largo para sondear una cola hasta que se active. Cuando los mensajes están disponibles, Lambda lee hasta 5 lotes y los envía a su función. Si los mensajes siguen estando disponibles, Lambda aumenta el número de procesos que son lotes de lectura hasta 60 instancias más por minuto. El número máximo de lotes que se pueden procesar simultáneamente mediante un mapeo de origen de eventos es 1000.

Para colas FIFO, Lambda envía mensajes a su función en el orden en que los recibe. Cuando se envía un mensaje a una cola FIFO, se especifica un ID de grupo de mensajes. Amazon SQS garantiza que los mensajes del mismo grupo se entreguen a Lambda en orden. Lambda ordena los mensajes en grupos y envía sólo un lote a la vez por grupo. Si la función devuelve un error, todos los reintentos se realizan en los mensajes afectados antes de que Lambda reciba mensajes adicionales del mismo grupo.

Su función puede escalar simultáneamente al número de grupos de mensajes activos. Para obtener más información, consulte SQS FIFO como fuente de eventos en el blog de informática de AWS.

Configurar una cola para utilizarla con Lambda

Cree una cola de SQS estándar que sirva como origen de eventos para la función de Lambda. A continuación, configure la cola para dar tiempo a su función de Lambda a procesar cada lote de eventos—y para que Lambda vuelva a actuar en respuesta a los errores de limitación a medida que aumenta.

Para dar tiempo al tiempo de función a procesar cada lote de registros, configure el tiempo de espera de la visibilidad de la cola hasta al menos 6 veces el tiempo de espera que configure en su función. El tiempo adicional permitirá a Lambda volver a intentar realizar los procesos en caso de que la ejecución de la función se vea limitada debido al procesamiento de un lote anterior.

Si el procesamiento de un mensaje da error repetidas veces, Amazon SQS podrá enviar dicho mensaje a una cola de mensajes fallidos. Cuando su función devuelve un error, Lambda lo deja en la cola. Después de que se supera el tiempo de espera de visibilidad, Lambda recibe el mensaje de nuevo. Para enviar mensajes a una segunda cola después de recibir varias veces, configure una cola de mensajes fallidos en la cola de origen.

nota

Asegúrese de configurar la cola de mensajes fallidos en la cola de origen y no en la función de Lambda. La cola de mensajes fallidos que configure en una función se utiliza para la cola de invocación asíncrona de la función, no para las colas de origen de eventos.

Si la función devuelve un error o no puede invocarse porque está en la máxima simultaneidad, es posible que el procesado tenga éxito tras algunos intentos adicionales. Para dar a los mensajes una oportunidad mejor de ser procesados antes de enviarlos a la cola de mensajes fallidos, establezca el maxReceiveCount de la política de redirección de la cola de origen a como mínimo 5.

Permisos de rol de ejecución

Lambda necesita los permisos siguientes para poder administrar mensajes en la cola de Amazon SQS. Añada dichos permisos al rol de ejecución de su función.

Para obtener más información, consulte Rol de ejecución de AWS Lambda.

Configuración de una cola como origen de eventos

Cree un mapeo de origen de eventos para indicar a Lambda que envíe elementos desde una cola a una función de Lambda. Puede crear varios mapeos de orígenes de eventos para procesar elementos de varias colas con una sola función. Cuando Lambda invoca la función objetivo, el evento puede contener múltiples elementos, dependiendo del tamaño de lote máximo configurable.

Para configurar la función para leer de Amazon SQS en la consola de Lambda, cree un desencadenador de SQS.

Para crear un disparador

  1. Abra la Página de funciones en la consola de Lambda.

  2. Elija una función.

  3. En Function overview (Descripción general de la función), elija Add trigger (Agregar disparador).

  4. Elija un tipo de disparador.

  5. Configure las opciones necesarias y, a continuación, elija Add (Añadir).

Lambda admite las siguientes opciones para los orígenes de eventos de Amazon SQS.

Opciones de origen de eventos

  • SQS queue (Cola de SQS): la cola de Amazon SQS desde la que leer registros.

  • Tamaño del lote – Número de registros que se enviarán a la función en cada lote. Para una cola estándar, esto puede ser de hasta 10.000 registros. Para una cola FIFO, el máximo es 10. Para un tamaño de lote superior a 10, también debe establecer el parámetro MaximumBatchingWindowInSeconds en al menos 1 segundo. Lambda pasa todos los registros del lote a la función en una sola llamada, siempre y cuando el tamaño total de los eventos no exceda el límite de carga útil para la invocación síncrona (6 MB).

    Lambda y Amazon SQS generan metadatos para cada registro. Estos metadatos adicionales se cuentan como el tamaño total de la carga útil y pueden hacer que el número total de registros enviados en un lote sea inferior al tamaño del lote configurado. Los campos de metadatos enviados por Amazon SQS puede tener una longitud variable. Para obtener más información acerca de los campos de metadatos de Amazon SQS, consulte la documentación ReceiveMessage en la Referencia de la API de Amazon Simple Queue Service.

  • Batch window (Ventana de lote) – especifique la cantidad de tiempo máxima para recopilar registros antes de invocar la función, en segundos. Únicamente aplicable a colas estándar.

    Si utiliza una ventana por lotes superior a 0 segundos, debe tener en cuenta el tiempo de procesamiento aumentado en el tiempo de espera de visibilidad de la cola. Establezca el tiempo de espera de visibilidad de la cola en 6 veces el tiempo de espera de la función, más el valor de MaximumBatchingWindowInSeconds. Esto permite tiempo para que su función Lambda procese cada lote de eventos y vuelva a intentarlo en caso de un error de limitación.

    Lambda procesa hasta 5 lotes a la vez. Esto significa que hay un máximo de 5 trabajadores disponibles para lotes y procesar mensajes en paralelo en cualquier momento. Cada trabajador mostrará una Lambda invocación distinta para su lote actual de mensajes.

  • Enabled (Habilitado): establecer en true para habilitar la asignación de origen de eventos. Establecer en false para detener el procesamiento de registros.

nota

Amazon SQS tiene una capa gratuita permanente para las solicitudes. Más allá de la capa gratuita, Amazon SQS cobra por cada millón de solicitudes. Mientras el mapeo de origen de eventos está activa, Lambda realiza solicitudes a la cola para obtener elementos. Para obtener más información sobre precios, consulte precios de Amazon Simple Queue Service.

Para administrar la configuración de origen de evento más tarde, elija el desencadenador en el diseñador.

Configure el tiempo de espera de la función para que disponga de tiempo suficiente para procesar todo un lote de elementos. Si elementos tardan mucho tiempo en procesarse, elija un tamaño de lote más pequeño. Un tamaño de lote amplio puede mejorar la eficiencia para cargas de trabajo que son muy rápidas o tienen mucha administración. Sin embargo, si la función devuelve un error, todos los elementos del lote vuelven a la cola. Si configura la simultaneidad reservada en la función, establezca al menos 5 ejecuciones simultáneas para reducir la posibilidad de errores de límite cuando Lambda invoque la función. Para eliminar la posibilidad de errores de limitación, establezca el valor de concurrencia reservada en 1000, que es el número máximo de ejecuciones simultáneas para un origen de Amazon SQS eventos.

API de mapeo de origen de eventos

Para administrar un origen de eventos con la AWS CLI o el SDK de AWS, puede utilizar las siguientes operaciones de la API:

En el ejemplo siguiente se utiliza AWS CLI para asignar una función denominada my-function a una cola Amazon SQS especificada por su nombre de recurso de Amazon (ARN), con un tamaño de lote de 5 y una ventana de lote de 60 segundos.

aws lambda create-event-source-mapping --function-name my-function --batch-size 5 \ --maximum-batching-window-in-seconds 60 \ --event-source-arn arn:aws:sqs:us-east-2:123456789012:my-queue

Debería ver los siguientes datos de salida:

{ "UUID": "2b733gdc-8ac3-cdf5-af3a-1827b3b11284", "BatchSize": 5, "MaximumBatchingWindowInSeconds": 60, "EventSourceArn": "arn:aws:sqs:us-east-2:123456789012:my-queue", "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function", "LastModified": 1541139209.351, "State": "Creating", "StateTransitionReason": "USER_INITIATED" }