Aplicación de ejemplo de procesamiento de errores para AWS Lambda - AWS Lambda

Aplicación de ejemplo de procesamiento de errores para AWS Lambda

La aplicación de ejemplo de procesamiento de errores demuestra el uso de AWS Lambda para controlar los eventos procedentes de una suscripción de Amazon CloudWatch Logs. CloudWatch Logs le permite invocar una función de Lambda cuando una entrada de registro coincide con un patrón. La suscripción de esta aplicación monitoriza las entradas del grupo de registros de una función que contienen la palabra ERROR. Como respuesta, invoca una función de Lambda de procesamiento. La función de procesamiento recupera el flujo de registros y los datos de rastreo completos de la solicitud que ha provocado el error y los almacena para su uso posterior.

El código de la función está disponible en los siguientes archivos:

Puede implementar el ejemplo en unos minutos con la AWS CLI y con AWS CloudFormation. Para descargarlo, configurarlo e implementarlo en su cuenta, siga las instrucciones del archivo README.

Arquitectura y estructura de eventos

La aplicación de ejemplo utiliza los siguientes servicios de AWS.

  • AWS Lambda: ejecuta el código de la función, envía los registros de CloudWatch Logs y envía los datos de rastreo a X-Ray.

  • Amazon CloudWatch Logs: recopila los registros e invoca una función cuando una entrada de registro coincide con un patrón de filtro.

  • AWS X-Ray: recopila datos de rastreo, indexa los rastros para las búsquedas y genera un mapa de servicio.

  • Amazon Simple Storage Service (Amazon S3): almacena los artefactos de implementación y la salida de la aplicación.

Se aplican cargos estándar por cada servicio.

Una función de Lambda en la aplicación genera errores de forma aleatoria. Cuando CloudWatch Logs detecta la palabra ERROR en los registros de la función, envía un evento a la función de procesamiento para su procesamiento.

ejemplo evento de mensaje de CloudWatch Logs

{ "awslogs": { "data": "H4sIAAAAAAAAAHWQT0/DMAzFv0vEkbLYcdJkt4qVXmCDteIAm1DbZKjS+kdpB0Jo350MhsQFyVLsZ+unl/fJWjeO5asrPgbH5..." } }

Una vez descodificados, los datos contienen información sobre el evento del registro. La función utiliza estos detalles para identificar el flujo de registros y analiza el mensaje del registro para obtener el ID de la solicitud que ha provocado el error.

ejemplo datos de eventos de CloudWatch Logs descodificados

{ "messageType": "DATA_MESSAGE", "owner": "123456789012", "logGroup": "/aws/lambda/lambda-error-processor-randomerror-1GD4SSDNACNP4", "logStream": "2019/04/04/[$LATEST]63311769a9d742f19cedf8d2e38995b9", "subscriptionFilters": [ "lambda-error-processor-subscription-15OPDVQ59CG07" ], "logEvents": [ { "id": "34664632210239891980253245280462376874059932423703429141", "timestamp": 1554415868243, "message": "2019-04-04T22:11:08.243Z\t1d2c1444-efd1-43ec-b16e-8fb2d37508b8\tERROR\n" } ] }

La función de procesamiento utiliza la información del evento de CloudWatch Logs para descargar el flujo de registros y el rastro de X-Ray completos para una solicitud que ha provocado un error. Almacena ambos en un bucket de Amazon S3. Para permitir que finalicen el flujo de registros y tiempo de rastreo, la función espera un breve periodo de tiempo antes de acceder a los datos.

Instrumentación con AWS X-Ray

La aplicación utiliza AWS X-Ray para rastrear las invocaciones de la función y las llamadas que realizan las funciones a los servicios de AWS. X-Ray utiliza los datos de rastreo que recibe de las funciones para crear un mapa de servicio que ayuda a identificar errores. El siguiente mapa de servicio muestra la función de generación de errores aleatorios para algunas solicitudes. También muestra la función de procesamiento que llama a X-Ray, CloudWatch Logs y Amazon S3.

Las dos funciones de Node.js están configuradas para el rastreo activo en la plantilla y se instrumentan con el SDK de AWS X-Ray para Node.js en el código. Con el rastreo activo, las etiquetas Lambda añaden un encabezado de rastreo a las solicitudes entrantes y envían un rastro con los datos de tiempo a X-Ray. Además, la función de generación de errores aleatorios utiliza el SDK de X-Ray para registrar el ID de la solicitud y la información del usuario en las anotaciones. Las anotaciones se asocian al rastro y se pueden utilizar para localizar el rastro de una solicitud específica.

La función de procesamiento obtiene el ID de la solicitud del evento de CloudWatch Logs y utiliza el AWS SDK for JavaScript para buscar dicha solicitud en X-Ray. Utiliza los clientes del SDK de AWS, instrumentados con el SDK de X-Ray, para descargar el rastro y el flujo de registros. A continuación, los almacena en el bucket de salida. El SDK de X-Ray registra estas llamadas, que aparecen como subsegmentos en el rastro.

Plantilla de AWS CloudFormation y recursos adicionales

La aplicación se implementa en dos módulos Node.js y se implementa con una plantilla de AWS CloudFormation y scripts de shell. La plantilla crea la función de procesamiento, la función de generación de errores aleatorios y los siguientes recursos complementarios.

  • Rol de ejecución: rol de IAM que concede a las funciones permiso para tener acceso a otros servicios de AWS.

  • Función iniciadora: función adicional que invoca la función de generación de errores aleatorios para crear un grupo de registros.

  • Recurso personalizado: recurso personalizado de AWS CloudFormation que invoca la función iniciadora durante la implementación para asegurarse de que el grupo de registros existe.

  • Suscripción a CloudWatch Logs: suscripción al flujo de registros que activa la función de procesamiento cuando se registra la palabra ERROR.

  • Política basada en recursos: instrucción de permisos para la función de procesamiento que permite a CloudWatch Logs invocarla.

  • Bucket de Amazon S3: ubicación de almacenamiento para la salida de la función de procesamiento.

Consulte la plantilla de aplicación en GitHub.

Para solucionar una limitación de la integración de Lambda con AWS CloudFormation, la plantilla crea una función adicional que se ejecuta durante las implementaciones. Todas las funciones de Lambda vienen con un grupo de registros de CloudWatch Logs que almacena la salida de sus ejecuciones. Sin embargo, el grupo de registros no se crea hasta que la función se invoca por primera vez.

Para crear la suscripción, que depende de la existencia del grupo de registros, la aplicación utiliza una tercera función de Lambda para invocar la función de generación de errores aleatorios. La plantilla incluye el código de la función iniciadora insertado. Un recurso de AWS CloudFormation personalizado la llama durante la implementación. Las propiedades DependsOn permiten asegurarse de que el flujo de registros y la política basada en recursos se han creado antes de la suscripción.