Node.js Lambda函数发起HTTP POST请求时出现socket hang up错误排查
AWS Lambda调用第三方API出现ECONNRESET错误排查
我用Node.js编写了一个AWS Lambda函数,通过CloudWatch Cron事件每分钟触发一次第三方API,但调用时出现ECONNRESET错误,该逻辑在本地Node.js环境运行正常。
错误日志
START RequestId: 54d90c9d-0a5b-4e5e-a26a-857d9bb6dd4e Version: $LATEST 2022-08-29T11:11:59.112Z 54d90c9d-0a5b-4e5e-a26a-857d9bb6dd4e ERROR Error: socket hang up at connResetException (node:internal/errors:692:14) at TLSSocket.socketOnEnd (node:_http_client:478:23) at TLSSocket.emit (node:events:539:35) at endReadableNT (node:internal/streams/readable:1345:12) at processTicksAndRejections (node:internal/process/task_queues:83:21) { code: 'ECONNRESET' }
Lambda函数代码
const https = require('https'); exports.handler = async (event) => { var postData = JSON.stringify({ "client_id": "abnbfye9-qtfnf1cj-abhrhzfyf7-m2tup-6x9kk2kc5688", "client_secret": "fpghfh329-polk80s-ye043465p1yy-45hxnfd874z06", "inTime": new Date(), "outTime": new Date() }); var options = { hostname: 'example.com', path: '/api/updateDataLambda', method: 'POST', port: 443, // 👈️ replace with 80 for HTTP requests headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiJ0ekpFTlNxcDJXeXh4YlNGbSIsImFjY2Vzc1Rva2VuRXhwIjp7ImRhdGUiOiIyMDIyLTA5LTI4IiwidGltZSI6IjA2OjIwOjQ1IiwidGltZVN0YW1wIjoxNjY0MzQ2MDQ1NjQ2LCJnbXQiOiIrMDAwMCJ9LCJyZWZyZXNoVG9rZW5FeHAiOnsiZGF0ZSI6IjIwMjItMDktMjgiLCJ0aW1lIjoiMDY6MjA6NDUiLCJ0aW1lU3RhbXAiOjE2NjQzNDYwNDU2NDYsImdtdCI6IiswMDAwIn0sImlhdCI6MTY2MTc1NDA0NSwiZXhwIjoxNjYxNzU0MTA1fQ.g1e5S15Q1qxB5_s4j3LFfFf6spU8gwgBUyVNLVuWNWk' } }; var req = https.request(options, (res) => { console.log('statusCode:', res.statusCode); console.log('headers:', res.headers); res.on('data', (d) => { process.stdout.write(d); }); }); req.on('error', (e) => { console.error(e); }); req.write(postData); req.end(); const response = { statusCode: 200, body: JSON.stringify('Hello from Lambda!'), }; return response; };
问题原因及修复方案
1. Lambda进程提前终止(核心问题)
你的Lambda是async函数,但https.request采用回调式异步逻辑,函数在发送请求后直接返回了响应,导致Lambda进程被立即终止,此时HTTP请求还未完成,从而触发socket hang up错误。本地运行时进程不会自动终止,所以请求能正常完成。
修复代码:将https.request包装为Promise,等待请求完全结束后再返回响应:
const https = require('https'); exports.handler = async (event) => { return new Promise((resolve, reject) => { var postData = JSON.stringify({ "client_id": "abnbfye9-qtfnf1cj-abhrhzfyf7-m2tup-6x9kk2kc5688", "client_secret": "fpghfh329-polk80s-ye043465p1yy-45hxnfd874z06", "inTime": new Date(), "outTime": new Date() }); var options = { hostname: 'example.com', path: '/api/updateDataLambda', method: 'POST', port: 443, headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiJ0ekpFTlNxcDJXeXh4YlNGbSIsImFjY2Vzc1Rva2VuRXhwIjp7ImRhdGUiOiIyMDIyLTA5LTI4IiwidGltZSI6IjA2OjIwOjQ1IiwidGltZVN0YW1wIjoxNjY0MzQ2MDQ1NjQ2LCJnbXQiOiIrMDAwMCJ9LCJyZWZyZXNoVG9rZW5FeHAiOnsiZGF0ZSI6IjIwMjItMDktMjgiLCJ0aW1lIjoiMDY6MjA6NDUiLCJ0aW1lU3RhbXAiOjE2NjQzNDYwNDU2NDYsImdtdCI6IiswMDAwIn0sImlhdCI6MTY2MTc1NDA0NSwiZXhwIjoxNjYxNzU0MTA1fQ.g1e5S15Q1qxB5_s4j3LFfFf6spU8gwgBUyVNLVuWNWk' } }; var req = https.request(options, (res) => { console.log('statusCode:', res.statusCode); console.log('headers:', res.headers); let responseBody = ''; res.on('data', (d) => { responseBody += d; }); res.on('end', () => { resolve({ statusCode: res.statusCode, body: JSON.stringify({ message: 'Request completed', apiResponse: responseBody }) }); }); }); req.on('error', (e) => { console.error(e); reject({ statusCode: 500, body: JSON.stringify({error: e.message}) }); }); req.write(postData); req.end(); }); };
2. 其他可能的排查方向
- VPC配置限制:如果Lambda配置了VPC,需确认安全组和网络ACL允许出站访问第三方API的443端口;若Lambda在私有子网,必须配置NAT网关才能访问公网API。
- 第三方API限流:第三方可能对Lambda的IP进行了限流,本地IP与Lambda IP不同,导致本地正常、Lambda被拦截。可联系第三方确认规则,或给Lambda配置弹性IP。
- Lambda超时设置:Lambda默认超时3秒,若第三方API响应过慢,会导致连接中断。可在控制台将超时时间调整至合理范围(最长15分钟)。
内容的提问来源于stack exchange,提问作者StormTrooper
相关产品推荐
相关产品推荐

