amazon-web-services - 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 函数出站规则:
解决方案
如果 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“内部”检索信息。
推荐阅读
- node.js - 尝试从 azure 函数中提取 azure key vault 时出错 - 值不能为空。参数名称:authKeyOrResourceToken
- ios - 使用“main”作为故事板失败,因为视图控制器不是主要故事板
- node.js - 如何让机器人发送直接消息给机器人在互服务器中没有它并且有他的 id 的人
- google-cloud-dataflow - Beam python sdk - save_main_session - DoFn 导入 - 最佳实践是什么?
- excel - 查找范围内所有匹配项的位置
- git - 为什么 git 源代码树中的两行相互交叉?
- ruby - Ruby 中的 DB2 安装
- cypress - 我如何通过测试我的应用程序来修复冻结柏树
- ios - 如何避免雷达图中 X 轴值和 Y 轴值重叠?
- c# - 如何将属性绑定到 WPF 中 UserControl 中的矩形样式