首页 > 解决方案 > AWS Lambda 函数无法发送电子邮件

问题描述

我有一个简单的 AWS Lambda 函数,它使用 nodemailer 发送电子邮件。提供商是“Gmail”,具有:

  SMTP_SECURE: true,
  SMTP_PORT: 465

问题是 API 网关 URL 在 30456.58 毫秒后超时,504 网关超时。AWS 文档中明确提到它将在 30 秒后超时,这也是可以接受的。

当我直接从 AWS lambda 控制台调用 lambda 时,也会发生同样的事情。它也超时了。对我来说没有意义的事情

transporter.sendMail(mailOptions);

为什么这些行需要超过 30 秒?并且当 API 网关超时 lambda 也超时。我已经附加了来自所有流量的 VPC、子网和安全性,并且在 google 上也启用了不太安全的功能。

Cloudwatch 日志清楚地表明我的代码没有超出:

const info = await transporter.sendMail(mailOptions);

PS:在我的本地机器上,一切都像魅力一样,问题只出在云功能上。

以下是安全支出:

安全组出站规则:

安全组

Lambda 函数出站规则:

这将在 lambda 控制台中出现

标签: amazon-web-servicesaws-lambdanodesaws-api-gateway

解决方案


如果 AWS Lambda 函数连接到 VPC,则只有在 VPC 配置了NAT 网关NAT 实例的情况下,它才能获得 Internet 访问权限。

这是因为 Lambda 函数没有收到公共 IP。Lambda 函数应配置为使用私有子网,然后通过 NAT 网关或 NAT 实例访问 Internet。

Lambda 目的地

如果异步调用 Lambda 函数,另一种选择是配置触发另一个 Lambda 函数的Lambda 目标。第二个 Lambda 函数可以在 VPC“外部”并连接到 Internet。调用由 AWS 服务管理。

因此,流程将是:

Trigger --> Lambda 1 (does RDS stuff) --> Destination: Lambda 2 (does email stuff)

第一个 Lambda 函数可以将信息传递给第二个 Lambda 函数以包含在电子邮件中。

API 网关

另一种选择是将 Lambda 函数保留在 VPC“外部”,但让它调用 API Gateway 从 VPC“内部”检索信息。


推荐阅读