Gestión de errores para un origen de eventos de SQS en Lambda
Para gestionar los errores relacionados con un origen de eventos de SQS, Lambda utiliza automáticamente una estrategia de reintento con una estrategia de retroceso. También puede personalizar el comportamiento de la gestión de errores si configura la asignación de orígenes de eventos de SQS para que devuelva respuestas parciales por lotes.
Estrategia de retroceso para invocaciones fallidas
Cuando se produce un error en una invocación, Lambda intenta volver a intentar la invocación mientras implementa una estrategia de retraso. La estrategia de retroceso difiere ligeramente en función de si Lambda encontró el error debido a un error en el código de la función o a una limitación.
-
Si el código de la función provocó el error, Lambda dejará de procesar y volver a intentar la invocación. Mientras tanto, Lambda reduce de manera gradual el volumen de simultaneidad asignada a su asignación de orígenes de eventos de Amazon SQS. Cuando se agote el tiempo de espera de visibilidad de la cola, el mensaje volverá a aparecer en la cola.
-
Si la invocación falla debido a la limitación, Lambda retrocede gradualmente los reintentos reduciendo la cantidad de simultaneidad asignada a la asignación de orígenes de eventos de Amazon SQS. Lambda sigue reintentando enviar el mensaje hasta que la marca de tiempo del mensaje supere el tiempo límite de visibilidad de la cola, momento en el que Lambda descarta el mensaje.
Implementación de respuestas parciales por lotes
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 procesados con éxito en un lote con errores, puede configurar la asignación de orígenes de eventos para que solo se vean de nuevo los mensajes fallidos. Esto se denomina respuesta parcial por lotes. Para activar las respuestas parciales por lotes, especifique ReportBatchItemFailures en la acción FunctionResponseTypes cuando configure la asignación de orígenes de eventos. 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.
nota
La utilidad de procesador de lotes
Cuando ReportBatchItemFailures está activado, Lambda no reduce verticalmente el sondeo de mensajes cuando fallan las invocaciones de las funciones. Utilice ReportBatchItemFailures, si espera que algunos mensajes fallen y no quiere que esos errores afecten a la velocidad de procesamiento de los mensajes.
nota
Tenga en cuenta las siguientes consideraciones al utilizar las respuestas parciales por lotes:
-
Si la función genera una excepción, todo el lote se considera un error completo.
-
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.
Para activar los informes parciales por lotes
-
Revise las Prácticas recomendadas para implementar las respuestas parciales por lotes.
-
Ejecute el siguiente comando para activar
ReportBatchItemFailurespara la función. Para recuperar el UUID de la asignación de orígenes de eventos, ejecute el comando list-event-source-mappings de la AWS CLI.aws lambda update-event-source-mapping \ --uuid"a1b2c3d4-5678-90ab-cdef-11111EXAMPLE"\ --function-response-types"ReportBatchItemFailures" -
Actualice el código de la función para detectar todas las excepciones y devolver los mensajes fallidos en una respuesta JSON
batchItemFailures. La respuestabatchItemFailuresdebe incluir una lista de ID de mensajes, como valores JSONitemIdentifier.Supongamos que tiene un lote de cinco mensajes con ID de mensaje
id1,id2,id3,id4yid5. Su función procesa correctamenteid1,id3yid5. Para hacer que los mensajesid2yid4sean de nuevo visibles en la cola, la función debe devolver la siguiente respuesta:{ "batchItemFailures": [ { "itemIdentifier": "id2" }, { "itemIdentifier": "id4" } ] }Estos son algunos ejemplos de código de función que devuelven la lista de IDs de mensajes fallidos del lote:
Si los eventos fallidos no vuelven a la cola, consulte ¿Cómo soluciono los problemas de la función de Lambda SQS ReportBatchItemFailures?
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
batchItemFailuresvacía -
Una lista
batchItemFailuresnula -
Una
EventResponsevacía -
Una
EventResponsenula
Lambda trata un lote como un error completo si la función devuelve cualquiera de los siguientes elementos:
-
Respuesta JSON no válida
-
Una cadena
itemIdentifiervacía -
Una nula
itemIdentifier -
Un
itemIdentifiercon un mal nombre de clave -
Un valor
itemIdentifiercon 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.
-
NumberOfMessagesDeletedrealiza 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. -
ApproximateAgeOfOldestMessagehace 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.
Uso de Powertools para el procesador por lotes de AWS Lambda
La utilidad de procesamiento por lotes de Powertools para AWS Lambda gestiona de manera automática la lógica de respuesta parcial de los lotes, lo que reduce la complejidad de implementar la notificación de fallas en los lotes. Estos son algunos ejemplos del uso del procesador por lotes:
- Python
-
nota
Para ver ejemplos completos e instrucciones de configuración, consulte la documentación del procesador por lotes
. Procesamiento de mensajes de Amazon SQS con el procesador por lotes de AWS Lambda.
import json from aws_lambda_powertools import Logger from aws_lambda_powertools.utilities.batch import BatchProcessor, EventType, process_partial_response from aws_lambda_powertools.utilities.data_classes import SQSEvent from aws_lambda_powertools.utilities.typing import LambdaContext processor = BatchProcessor(event_type=EventType.SQS) logger = Logger() def record_handler(record): logger.info(record) # Your business logic here # Raise an exception to mark this record as failed def lambda_handler(event, context: LambdaContext): return process_partial_response( event=event, record_handler=record_handler, processor=processor, context=context ) - TypeScript
-
nota
Para ver ejemplos completos e instrucciones de configuración, consulte la documentación del procesador por lotes
. Procesamiento de mensajes de Amazon SQS con el procesador por lotes de AWS Lambda.
import { BatchProcessor, EventType, processPartialResponse } from '@aws-lambda-powertools/batch'; import { Logger } from '@aws-lambda-powertools/logger'; import type { SQSEvent, Context } from 'aws-lambda'; const processor = new BatchProcessor(EventType.SQS); const logger = new Logger(); const recordHandler = async (record: any): Promise<void> => { logger.info('Processing record', { record }); // Your business logic here // Throw an error to mark this record as failed }; export const handler = async (event: SQSEvent, context: Context) => { return processPartialResponse(event, recordHandler, processor, { context, }); };