Node.js Serverless Lambda环境下AWS SES发邮件遇端点请求超时
解决Lambda中使用AWS SES发送邮件时的端点超时问题
可能的原因及对应解决方案
1. Lambda网络配置限制(最常见原因)
如果你的Lambda函数部署在私有VPC中,默认无法直接访问AWS SES这类公共服务端点。本地运行正常是因为本地网络可直接访问互联网,而Lambda在VPC私有子网内没有出站访问权限。
解决方法:
- 给Lambda所在私有子网配置NAT网关,让Lambda通过NAT网关访问互联网(进而访问SES公共端点)。
- 或者在VPC中创建SES的VPC端点(仅支持部分区域),直接在VPC内访问SES服务,无需走互联网。
2. Lambda超时时间设置过短
Lambda默认超时时间为3秒,SES发送邮件的请求可能需要更长处理时间,直接触发超时。
解决方法:
- 进入Lambda控制台,找到目标函数,在「配置」→「常规配置」中,将超时时间调整为10秒或更长(比如15秒)。
3. Promise使用错误导致异步阻塞
你的sendMails函数中,Promise写法存在问题:混用async executor与回调函数,会导致异步流程无法正确触发,可能引发阻塞。
修改后的sendMails函数(改用AWS SDK原生Promise版本):
async function sendMails(data) { const params = { Destination: { ToAddresses: [data.to], }, Message: { Body: { Html: { Charset: 'UTF-8', Data: data.text, }, }, Subject: { Charset: 'UTF-8', Data: data.subject }, }, Source: '*******', // 确保此处为已验证的SES发件地址 }; const SES1 = new AWS.SES({ region: "us-east-1" }); try { await SES1.sendEmail(params).promise(); return [{ message: "Mail Send Successfully", StatusCode: 1 }]; } catch (err) { return [{ message: err.message, StatusCode: 0 }]; } }
4. 区域配置不一致
全局AWS配置区域为us-east-2,但SES实例使用us-east-1,虽不直接导致超时,但可能引发潜在服务访问问题。建议统一区域,或确保SES所在区域的端点可正常访问。
5. IAM角色权限缺失
确保Lambda执行角色拥有ses:SendEmail或ses:SendRawEmail权限,示例权限策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ses:SendEmail", "Resource": "*" } ] }
验证步骤
- 优先调整Lambda超时时间,测试是否仍超时。
- 检查Lambda是否在私有VPC中,若在则配置NAT网关或VPC端点。
- 修改
sendMails函数的Promise写法,避免回调与await混用。 - 确认IAM角色权限正确,且SES发件地址已完成验证。
内容的提问来源于stack exchange,提问作者Bhadresh
相关产品推荐
相关产品推荐

