Почему я не могу отправить электронное письмо SendGrid из лямбда-функции?

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

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

Вопрос:

Я изо всех сил пытаюсь понять, почему мой Lambda не отправляет это сообщение Sendgrid.

Когда я вызываю Lambda, я получаю console.log 1,2,3 в таком порядке, а также null из вызова Sendgrid. Обратные вызовы Sendgrid promise никогда не вызываются. Есть идеи, почему?

 "use strict";

const sendgrid = require('@sendgrid/mail');

sendgrid.setApiKey('xxxxxxxxx');

module.exports.scan = async (event, context, onComplete) => {
  console.log('1');

  await (() => {
    console.log('2');
    sendgrid.send({
      to: 'xxxxxxx',
      from: 'xxxxxxxxx',
      subject: 'Sending with SendGrid is Fun',
      text: 'and easy to do anywhere, even with Node.js',
      html: '<strong>and easy to do anywhere, even with Node.js</strong>',
    })
    .then(() => {
      console.log('cool');
      onComplete(null, "successfully updated form next_scheduled")
    })
    .catch(error => {
      console.log('error');

      //Log friendly error
      console.error(error.toString());

      //Extract error msg
      const {message, code, response} = error;

      //Extract response msg
      const {headers, body} = response;

      onComplete(error, "failed to updated form next_scheduled")
    });
  })();

  console.log('3');
};
  

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

1. Вы проверили свой пользовательский интерфейс / панель управления SendGrid SendGrid на app.sendgrid.com чтобы посмотреть, появится ли там что-нибудь? Мне не бросается в глаза, что в вашем коде что-то не так, хотя я бы исправил это, если вы этого не сделали, на всякий случай.

2. Я воссоздал ваш код с помощью простого асинхронного метода вместо вызова send (), и он работает, как ожидалось. Код прямо сейчас немного сложен для чтения из-за сочетания функций async / await, цепочек обещаний и немедленных функций. Я бы предложил определить функцию async как реальную функцию и преобразовать все в async / await и try / catch, чтобы упростить отладку

3. Спасибо за ввод, код, который я предоставил, является упрощенной версией производственного кода. Я думаю, что на самом деле это может быть проблема со связью. Лямбда находится внутри VPC

4. Я согласен с @bwest. Вы не можете … или, по крайней мере, не должны … смешайте асинхронную функцию с обратным вызовом Lambda (который вы назвали onComplete ). Проблемы со связью не объясняют, ни один из запускаемых обратных вызовов sendgrid — вы должны перехватить ошибку. Но я возвращаю эту асинхронную функцию, а не возвращаю обещание, и в этот момент Lambda, скорее всего, называет вещи «выполненными».

5. @ShaneDaSilva Смогли ли вы найти решение этой проблемы? Я столкнулся с аналогичной проблемой, когда мой клиент sendgrid может отправлять почту при локальном запуске, но не работает на AWS Lambda. Оно просто застревает в части sgMail.Send().