aws ses.SendEmail не вызывается из лямбда-функции

#node.js #amazon-web-services #aws-lambda

#node.js #amazon-веб-сервисы #aws-lambda

Вопрос:

Моя лямбда-функция, написанная в node.js довольно просто. Lambda вызывается, когда в dynamo db появляется новая запись, затем я хочу просмотреть каждую запись и отправить электронное письмо. По какой-то причине я не могу понять, почему ses.Функция SendEmail никогда не вызывается. Я поместил в нее журналы, но в журналах ничего не отображается. Я запутал электронную почту только для целей вопроса (я использую фактическую правильную электронную почту на aws).

 console.log('Loading function');
var aws = require('aws-sdk');
var ses = new aws.SES({region: 'eu-west-2'});
//var nodemailer = require('nodemailer');

exports.handler = async (event, context, callback) => {
    //console.log('Received event:', JSON.stringify(event, null, 2));
    event.Records.forEach((record) => {
        if(record.eventName == 'INSERT')
        {
            console.log(record.eventID);
            console.log(record.eventName);
            console.log('DynamoDB Record: %j', record.dynamodb);
            
            var params = {
            Destination: {
                ToAddresses: ["test@***.com"]
            },
            Message: {
                Body: {
                    Text: { Data: "Test"
                        
                    }
                    
                },
                
                Subject: { Data: "Test Email"
                    
                }
            },
            Source: "info@***.com"
        };
        
        console.log("About to send email");
            ses.sendEmail(params, function (err, data) {
            
            console.log("inside email"); // not logging
            if (err) {
                console.log(err);
                context.fail(err);
            } else {
                
                console.log(data);
                context.succeed(event);
            }
        });
        }
    });
    
    //return `Successfully processed ${event.Records.length} records.`;
    
};
  

Комментарии:

1. Не смешивайте и не сопоставляйте асинхронность и обратные вызовы, выберите один или другой. Предполагая, что ваш цикл действительно выполняется (например, console.log("About to send email"); печатает), попробуйте что-то вроде этого: await ses.sendEmail(params).promise(); вместо этого обратного вызова. И вам не нужно использовать context ни то, ни другое, так как при возникновении ошибки это вызовет исключение, и функция завершится сбоем. Просто заметил, что вы также делаете это в неасинхронном цикле forEach, возможно, вам потребуется реструктурировать его для использования await.

2. Спасибо, я объединил свою лямбду отправки электронной почты с шаблоном для запуска dynamo, следовательно, она была асинхронной. Теперь работает так, как ожидалось, ценю вашу помощь.