AWS Lambda函数无法发送电子邮件

问题描述

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

  SMTP_SECURE: true,SMTP_PORT: 465

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

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

transporter.sendMail(mailOptions);

为什么这些行花费超过30秒?以及API网关超时时lambda也超时。我已经连接了VPC,子网和具有来自所有人的流量的安全性,并且在google上启用的安全性也较低。

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

const info = await transporter.sendMail(mailOptions);

PS:在我的本地计算机上,一切都像一个超级按钮,问题仅在于云功能

这是安全支出:

安全组出站规则:

security group

Lambda函数出站规则:

this is coming in lambda console

解决方法

如果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网关从VPC的“内部”检索信息。