You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 13:09:29