es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Las funciones Lambda no envían registros de error correctos al correo electrónico proporcionado.

He creado esta función lambda (lambda1) que me notificará sobre los errores que ocurran en otra lambda (Lambda2). Aquí está el código de la lambda1 que enviará notificaciones por correo electrónico:

console.log("Cargando función");
var AWS = require("aws-sdk");

exports.handler = function(event, context) {
    var eventText = JSON.stringify(event, null);
    console.log("Evento recibido:", eventText);
    var sns = new AWS.SNS();
    var params = {
        Message: JSON.stringify(eventText), 
        Subject: "Esta es una notificación de error en las lambdas",
        TopicArn: "arn:aws:sns:ejemplo/ejemplo"
    };
    sns.publish(params, context.done);
};

Los registros de error generados por lambda2 son los siguientes:

Este es un mensaje de DEBUG de muestra..
Este es un mensaje de INFO de muestra.. !!
Este es un mensaje de ERROR de muestra...

Estos registros anteriores desencadenarán mi lambda1 y me enviarán estos registros por correo electrónico. Pero en lugar de enviarme los mismos registros generados por lambda2, lambda1 me envió los siguientes registros:

"{\"awslogs\":{\"data\":\"H4sIAAAAAAAAADWQy27CMBBFfyVYXZLGz4mdXaSmbECVSFaFqHKIoZHyQIkpQoh/7wDtaDa+M75Hd66kc9NkD664HB1JyFtapF+rLM/TRUbmZDj3bkSZCS50HANViqHcDofFOJyOOInseYpa21W1jdw4DuPC4Rfrm/6wfKjP9dyPzna4zylnEeMRo9HmZZkWWV6UauekBKiBsr20oCthKlnHxnEtdi6+W0ynatqNzdE3Q//etN6NE0k2ZHV5Pkj5oGQ/rvf3wZU0NcIEKCUMFZwqwYBxg3CtY264VCBAMyk5k0ZoLMW4As2NkjxGoG/wMN52mJGBMEyImBpQcv5/MLTfZOv1x7rc+nuokPGQ0YLRRKmEmldQ4hMnFqgGZ8OK6jrEcCrUGmgo98pUYIACxFtffDdTgG2DCYmtCx7GwR/pFSuYzbY9uZW3X8lHDk6xAQAA\"}}"

¿Cómo puedo obtener los mismos registros exactos que generó lambda2?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema con la función lambda1 proporcionada es que está enviando la variable eventText, que contiene la versión en cadena de caracteres del objeto de evento completo, incluidos los registros de AWS CloudWatch en formato base64. Por lo tanto, lambda1 está enviando los registros de CloudWatch en un formato comprimido y codificado en lugar de los registros reales generados por lambda2.

    Para obtener exactamente los mismos registros generados por lambda2, es necesario modificar la función lambda1 para extraer los registros relevantes del objeto de evento y enviarlos en un formato legible. Podemos utilizar la API de AWS CloudWatch Logs para lograr esto.

    Aquí está el código actualizado de la función lambda1:

    console.log("Cargando función");
    var AWS = require("aws-sdk");
    
    exports.handler = async function(event, context) {
        var cwlogs = new AWS.CloudWatchLogs();
        var params = {
            logGroupName: "/aws/lambda/Lambda2", // Reemplazar con el nombre del grupo de registros para lambda2
            filterPattern: "ERROR",
            startTime: new Date(Date.now() - 600000), // Obtener los registros generados en los últimos 10 minutos
            endTime: new Date()
        };
    
        try {
            var logs = await cwlogs.filterLogEvents(params).promise();
            var logText = logs.events.map(event => event.message).join("\n");
            console.log("Registros obtenidos:", logText);
    
            var sns = new AWS.SNS();
            var snsParams = {
                Message: logText,
                Subject: "Notificación de error de Lambda2",
                TopicArn: "arn:aws:sns:ejemplo/ejemplo"
            };
            await sns.publish(snsParams).promise();
        } catch (err) {
            console.error(err, err.stack);
        }
    };
    

    La función actualizada utiliza el servicio CloudWatchLogs para recuperar los registros del grupo de registros asociado con lambda2. Filtra los registros según el patrón “ERROR” y el intervalo de tiempo en el que se generaron los registros. Luego extrae la propiedad de mensaje de cada evento de registro y los concatena en una sola cadena con saltos de línea utilizando el método join. Por último, envía los registros extraídos en un formato legible como parámetro de Mensaje del método SNS.publish().

    Asegúrese de reemplazar los valores logGroupName y TopicArn con los valores apropiados para su caso de uso.

    Con esta función lambda1 actualizada, debería recibir exactamente los mismos registros generados por lambda2 en un formato legible.

Comments are closed.