Uso de Lambda con Amazon SQS - AWS Lambda

Uso de Lambda con Amazon SQS

Puede utilizar una función de Lambda para procesar mensajes en una cola de Amazon Simple Queue Service (Amazon SQS). Los mapeos de fuente de eventos de Lambda son compatibles con las colas estándar y las 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 su función de Lambda sincrónicamente con un evento que contiene mensajes de cola. Lambda lee 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 sondea hasta 10 mensajes en su cola a la vez y envía 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 el sondeo de los mensajes de la cola estándar de SQS hasta que caduque la ventana de lotes, se alcance la cuota de tamaño de carga de invocaciones o se alcance el tamaño de lote máximo configurado.

nota

Si utiliza un intervalo de lote y la cola de SQS contiene muy poco tráfico, Lambda puede esperar hasta 20 segundos antes de invocar la función. Esto sucederá incluso si establece un intervalo de lote inferior a 20 segundos.

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 de 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. De forma predeterminada, si la función detecta un error al procesar un lote, todos los mensajes de ese lote se vuelven a ver en la cola. Por este motivo, el código de su función debe ser capaz de procesar el mismo mensaje varias veces sin efectos secundarios no deseados. Puede modificar este comportamiento de reprocesamiento si incluye errores de elementos por lotes en la respuesta de la función.

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 cinco 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 una asignación de origen de eventos puede procesar simultáneamente es 1 000.

Para colas FIFO, Lambda envía mensajes a su función en el orden en que los recibe. Cuando envíe un mensaje a una cola FIFO, especifique 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 solo un lote a la vez para un grupo. Si la función devuelve un error, esta realiza todos los reintentos 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 que sirva como fuente 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 controlada a medida que escala verticalmente.

Para permitir que su función tenga tiempo para procesar cada lote de registros, establezca el tiempo de espera de visibilidad de la cola de origen hasta al menos seis 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 función se vea limitada debido al procesamiento de un lote anterior.

Si su función no puede procesar un mensaje en repetidas ocasiones, 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.

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 Functions (Funciones) en la consola de Lambda.

  2. Elija el nombre de una función.

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

  4. Elija el tipo de desencadenador SQS.

  5. Configure las opciones requeridas y luego elija Add (Agregar).

Lambda admite las siguientes opciones para las fuentes de eventos de Amazon SQS.

Opciones de origen de eventos

  • 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, puede tratarse 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 a 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 la cuota de tamaño de carga de invocaciones para la invocación síncrona (6 MB).

    Tanto Lambda como Amazon SQS generan metadatos por 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 que Amazon SQS envía pueden tener una longitud variable. Para obtener más información acerca de los campos de metadatos de Amazon SQS, consulte la documentación de operación de la API ReceiveMessage en la Referencia de la API de Amazon Simple Queue Service.

  • Ventana de lote: la cantidad de tiempo máxima para recopilar registros antes de invocar la función, en segundos. Esto se aplica únicamente a las 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. Recomendamos establecer el tiempo de espera de visibilidad de la cola en seis veces el tiempo de espera de la función, más el valor de MaximumBatchingWindowInSeconds. Esto permite tiempo para que su función de Lambda procese cada lote de eventos y vuelva a intentarlo en caso de un error de limitación.

    nota

    Si la ventana de lote es mayor que 0 y (batch window) + (function timeout) > (queue visibility timeout), el tiempo de espera de visibilidad real de la cola será (batch window) + (function timeout) + 30s.

    Lambda procesa hasta cinco lotes a la vez. Esto significa que hay un máximo de cinco trabajadores disponibles para lotes y procesar mensajes en paralelo en cualquier momento. 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 una asignación de origen de eventos puede procesar simultáneamente es 1 000. Para obtener más información, consulte Escalado y procesamiento .

  • Enabled (Habilitado): el estado de la asignación de origen de eventos. 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 un nivel gratuito permanente para las solicitudes. Más allá del nivel gratuito, Amazon SQS cobra por cada millón de solicitudes. Mientras el mapeo de fuente 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 SQS.

Para administrar la configuración de origen de eventos más tarde, en la consola Lambda, elija el desencadenador SQS 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 cinco ejecuciones simultáneas para reducir la posibilidad de errores de limitación controlada cuando Lambda invoque la función. Para eliminar la posibilidad de errores de limitación, establezca el valor de simultaneidad reservada en 1 000, que es el número máximo de ejecuciones simultáneas para un origen de eventos de Amazon SQS.

API de mapeo de origen de eventos

Para administrar un origen de eventos con la AWS Command Line Interface (AWS CLI) o SDK de AWS, puede utilizar las siguientes operaciones de la API:

En el ejemplo siguiente se utiliza AWS CLI para mapear 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" }

Informes de fallos de artículos de lote

Cuando la función Lambda detecta un error al procesar un lote, todos los mensajes de ese lote se vuelven a ver en la cola de forma predeterminada, incluidos los mensajes que Lambda procesó correctamente. Como resultado, la función puede terminar procesando el mismo mensaje varias veces.

Para evitar el reprocesamiento de todos los mensajes de un lote con errores, puede configurar la asignación de origen de eventos para que solo se vean de nuevo los mensajes fallidos. Para ello, al configurar la asignación de origen de eventos, incluya el valor ReportBatchItemFailures en la lista FunctionResponseTypes. Esto permite que la función devuelva un éxito parcial, lo que puede ayudar a reducir el número de reintentos innecesarios en los registros.

Sintaxis del informe

Después de incluir ReportBatchItemFailures en la configuración de la asignación de origen de eventos, puede devolver una lista de los ID de mensaje fallidos en la respuesta de la función. Supongamos que tiene un lote de cinco mensajes con ID de mensaje id1, id2, id3, id4 y id5. Su función procesa correctamente id1, id3 y id5. Para hacer que los mensajes id2 y id4 sean de nuevo visibles en la cola, la sintaxis de la respuesta debe ser similar a la siguiente:

{ "batchItemFailures": [ { "itemIdentifier": "id2" }, { "itemIdentifier": "id4" } ] }

Para devolver la lista de ID de mensaje fallidos en el lote, puede utilizar un objeto de clase SQSBatchResponse o crear su propia clase personalizada. A continuación, se muestra un ejemplo de una respuesta que utiliza el objeto SQSBatchResponse.

import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; import com.amazonaws.services.lambda.runtime.events.SQSEvent; import com.amazonaws.services.lambda.runtime.events.SQSBatchResponse; import java.util.ArrayList; import java.util.List; public class ProcessSQSMessageBatch implements RequestHandler<SQSEvent, SQSBatchResponse> { @Override public SQSBatchResponse handleRequest(SQSEvent sqsEvent, Context context) { List<SQSBatchResponse.BatchItemFailure> batchItemFailures = new ArrayList<SQSBatchResponse.BatchItemFailure>(); String messageId = ""; for (SQSEvent.SQSMessage message : sqsEvent.getRecords()) { try { //process your message messageId = message.getMessageId(); } catch (Exception e) { //Add failed message identifier to the batchItemFailures list batchItemFailures.add(new SQSBatchResponse.BatchItemFailure(messageId)); } } return new SQSBatchResponse(batchItemFailures); } }

Para utilizar esta característica, la función debe manejar los errores correctamente. Haga que su lógica de funciones detecte todas las excepciones e informe de los mensajes que provoquen un fallo en batchItemFailures en la respuesta de su función. Si la función genera una excepción, todo el lote se considera un error completo.

nota

Si utiliza esta característica con una cola FIFO, la función debe dejar de procesar los mensajes después del primer error y devolver todos los mensajes fallidos y sin procesar en batchItemFailures. Esto ayuda a preservar el orden de los mensajes en la cola.

Condiciones de éxito y fracaso

Lambda trata un lote como un éxito completo si la función devuelve cualquiera de los siguientes elementos:

  • Una lista batchItemFailures vacía

  • Una lista batchItemFailures nula

  • Un EventResponse vacío

  • Un EventResponse nulo

Lambda trata un lote como un error completo si la función devuelve cualquiera de los siguientes elementos:

  • Respuesta JSON no válida

  • Una itemIdentifier cadena vacía

  • Un itemIdentifier nulo

  • Un itemIdentifier con un mal nombre de clave

  • Un valor itemIdentifier con un ID de mensaje que no existe

Métricas de CloudWatch

Para determinar si la función informa correctamente de los errores de elementos por lotes, puede monitorear las métricas Amazon SQS NumberOfMessagesDeleted y ApproximateAgeOfOldestMessage en Amazon CloudWatch.

  • NumberOfMessagesDeleted realiza un seguimiento del número de mensajes eliminados de la cola. Si cae a 0, es una señal de que la respuesta de la función no está devolviendo correctamente los mensajes fallidos.

  • ApproximateAgeOfOldestMessage hace un seguimiento de cuánto tiempo ha permanecido el mensaje más antiguo en la cola. Un aumento brusco de esta métrica puede indicar que la función no está devolviendo correctamente los mensajes fallidos.

Parámetros de configuración de Amazon SQS

Todos los tipos de fuente de eventos Lambda comparten las mismas operaciones CreateEventSourceMapping y UpdateEventSourceMapping de la API Sin embargo, solo algunos de los parámetros se aplican a Amazon SQS.

Parámetros de fuente de eventos que se aplican a Amazon SQS
Parámetro Obligatorio Valor predeterminado Notas

BatchSize

N

10

Para colas estándar, el máximo es 10 000. Para colas FIFO, el máximo es 10.

Habilitado

N

true

EventSourceArn

Y

El ARN del flujo de datos o un consumidor de flujos

FunctionName

Y

FunctionResponseTypes

N

Para permitir que la función informe de errores específicos de un lote, incluya el valor ReportBatchItemFailures en FunctionResponseTypes. Para obtener más información, consulte Informes de fallos de artículos de lote .

MaximumBatchingWindowInSeconds

N

0