问题描述
我有一个简单的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:在我的本地计算机上,一切都像一个超级按钮,问题仅在于云功能。
这是安全支出:
安全组出站规则:
Lambda函数出站规则:
解决方法
如果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的“内部”检索信息。