AWS Lambda调用偶发EPROTO错误排查请求(Node.js环境)
AWS Lambda偶发Runtime.UnhandledPromiseRejection: Error: write EPROTO错误排查
- 使用Node.js 14版本的AWS Lambda函数,近期每周偶发一次调用错误,怀疑与Lambda超时或MongoDB连接有关,但无法确定
- 多数情况下调用正常,已升级Node.js到16版本,问题仍存在
- 核心错误信息:
Runtime.UnhandledPromiseRejection: Error: write EPROTO
错误日志
2022-12-19T14:30:40.715Z 2a5e8a43-a315-40e2-a151-97b6630d9d95 ERROR Unhandled Promise Rejection { "errorType": "Runtime.UnhandledPromiseRejection", "errorMessage": "Error: write EPROTO", "reason": { "errorType": "Error", "errorMessage": "write EPROTO", "code": "EPROTO", "errno": -71, "syscall": "write", "$metadata": { "attempts": 1, "totalRetryDelay": 0 }, "stack": [ "Error: write EPROTO", " at WriteWrap.onWriteComplete [as oncomplete] (internal/stream_base_commons.js:94:16)" ] }, "promise": {}, "stack": [ "Runtime.UnhandledPromiseRejection: Error: write EPROTO", " at process.<anonymous> (/var/runtime/index.js:35:15)", " at process.emit (events.js:400:28)", " at process.emit (domain.js:475:12)", " at processPromiseRejections (internal/process/promises.js:245:33)", " at processTicksAndRejections (internal/process/task_queues.js:96:32)" ] }
函数代码
const repository = new CustomerRepository(); export const getCustomers: any = middlewareBuilder(async (event, _context) => { try { logger.info('getCustomer start'); const customers = await repository.findAllCustomers(); // get data from db logger.info({ message: ' fetch all customers ', additionalInfo: customers }); logger.info('getCustomer end '); return httpResult(200, customers); } catch (error) { logger.error('error ' + error); throw error; } });
排查方向建议
MongoDB连接管理
- Lambda执行环境会被复用,若
CustomerRepository中的MongoDB连接未做状态校验,可能出现闲置超时的无效连接,写入时触发EPROTO错误。需检查连接池配置,设置合理的连接超时、闲置超时参数,每次调用前验证连接有效性,无效则重建连接。 - 确认MongoDB端的连接数限制,排查是否因并发连接超限导致的连接中断。
- Lambda执行环境会被复用,若
网络与SSL配置
- EPROTO属于TCP/SSL层错误,可能是Lambda与MongoDB之间的网络波动、SSL证书兼容性问题。检查MongoDB的SSL证书是否有效,确保Lambda信任该证书;若Lambda部署在VPC内,检查安全组、NACL规则是否允许持续网络连接,排查偶发的网络中断情况。
- 临时延长Lambda超时时间,排除因业务逻辑执行时间接近超时阈值导致的异常。
Promise异常捕获
- 错误提示
UnhandledPromiseRejection,需确认middlewareBuilder内部是否存在未捕获的Promise异常,或findAllCustomers方法中是否有未被try/catch覆盖的异步逻辑。确保所有异步操作的异常都被正确捕获处理。
- 错误提示
依赖版本适配
- 检查MongoDB驱动版本,部分旧版本驱动在Node.js 16环境下可能存在兼容性bug,尝试升级到最新稳定版驱动,修复已知的TCP连接问题。
内容的提问来源于stack exchange,提问作者Natan Yalo Fcado
相关产品推荐
相关产品推荐

