当从 Lambda 函数 运行 时从 Mailchimp Transactional 获取超时

Getting timeout from Mailchimp Transactional when running from Lambda function

我正在尝试使用 Node 和无服务器框架通过 Mailchimp Transactional/Mandrill 发送电子邮件。

我可以在本地正常发送电子邮件(使用 serverless-offline),但是当我将该功能部署到我们的暂存环境时,在尝试连接到 API.

我的代码是:

const mailchimp = require('@mailchimp/mailchimp_transactional')(MAILCHIMP_TRANSACTIONAL_KEY);

async function sendEmail(addressee, subject, body) {
    const message = {
      from_email: 'ouremail@example.com',
      subject,
      text: body,
      to: [
        {
          email: addressee,
          type: 'to',
        },
      ],
    };
    const response = await mailchimp.messages.send({ message });
    return response;
}

我的 Lambda 设置为 60 秒超时,我从 Mailchimp 返回的错误是:

Response from Mailchimp:  Error: timeout of 30000ms exceeded

在我看来,要么是 Mailchimp 以某种方式阻止了来自 Lambda IP 的流量,要么是 AWS 不让流量连接到邮件 API。

我试过直接使用 fetch 调用 API 而不是使用 npm 模块,但仍然返回类似的错误(尽管在 html 格式中很奇怪):

Mailchimp send email failed:  "<html><body><h1>408 Request Time-out</h1>\nYour browser didn't send a complete request in time.\n</body></html>\n\n"

是否有我遗漏的任何 AWS 权限,或我忽略的 Mailchimp Transactional/Mandrill 配置?

我在使用 Mailchimp 的营销 API 时遇到了同样的问题,并通过通过 NAT 网关路由流量解决了这个问题。这样做可以让 VPC 内的 lambda 函数访问外部服务。

我是如何做到这一点的简短版本:

  • 在您的 VPC 中创建一个新子网
  • 为刚刚创建的新子网创建一个新路由 table,并确保新子网正在使用这个新路由 table
  • 创建一个新的 NAT 网关
  • 让新路由 table 将所有出站流量 (0.0.0.0/0) 指向该 NAT 网关
  • 让与 NAT 网关关联的子网将所有出站流量指向互联网网关(这通常在 AWS 填充默认 VPC 时已经创建)

您可以在此 link 找到更多信息:https://aws.amazon.com/premiumsupport/knowledge-center/internet-access-lambda-function/