【问题标题】:aws lambda cannot call webservice from another vpcaws lambda 无法从另一个 vpc 调用 web 服务
【发布时间】:2024-04-21 17:20:02
【问题描述】:

我们有一个在自定义 vpc 子网中配置的 aws lambda。 lambda 调用一个 webservice api 调用,它是另一个 vpc。 但是,调用没有通过导致对象错误。

如果给定本地网络服务端点,则相同的 lambda 可以工作。 我们可以从与 lambda 相同子网的 ec2 的浏览器调用 Web 服务。 它是一个 HTTPS 网络服务端点。检查LB中的访问日志。目标负载均衡器日志中没有 lambda 子网/IP 的负载均衡器访问日志。 但是对于从浏览器进行的调用,可以使用 ec2 IP 地址的日志。

我们需要检查 lambda 的任何设置吗? lambda 如何处理 HTTPS 证书? 是否有类似执行命令的跟踪器来检查调用在何处被阻塞?

以下是节点 js 中的 lambda 代码。有错误

  use strict;
  
  var soap = require('strong-soap').soap;   
  var aUrl = process.env.a_url;
  var bcUrl = process.env.b_url;

  //aUrl = https://first.second.example.com/test/SoapRecordings/Calculator.asmx?WSDL;
  //bUrl = https://first.second.example.com/Webservice/staging/Service.asmx?WSDL;
  

  var region = process.env.region;
  var secretName = process.env.secretName; 

  var aRequestArgs = {
      UserName: process.env.service_username,
      Password: process.env.service_password
  };
  
  exports.handler = (event, context, callback) => {  

       
  var options = {};
  console.log('Calling Service...\n');
  soap.createClient(aUrl, options, function(err, client) {
  
    var method = client['GetLocationData'];
    console.log('called GetLocationData service method\n');
    method(aRequestArgs, function(err, result, envelope, soapHeader) {
      if(err) {
          console.log('error: ' + err);
          return;
      }
      else 
      {

          console.log('Received response from GetLocationData(): \n');
          
          CallService(JSON.stringify(result));
      }
  });

  function CallService(LocData)
  {
     
    var bRequestArgs = {
        UserID: process.env.service_userid,
        Password: process.env.service_password,
        AuthorizationKey: process.env.service_authorizationkey,
        LocationData: LocData
    }; 
     
    console.log('Calling  Service...\n');
    options = {};
    soap.createClient(bUrl, options, function(err, client) {
    
      var service_method = client['UpdateLocationData'];
      console.log('called UpdateLocationData service method\n');
      
      service_method(bRequestArgs, function(err, result, envelope, soapHeader) {
        if(err) {
            console.log(' error: ' + err);
            return;
        }
        else 
        {
            console.log(' Response: \n' + JSON.stringify(result));
                            
        }
    });  
    });
     
  }
  
  });

 }; //exports.handler
  '''


error exception here :TLSSocket.socketErrorListener


'''
{"errorType":"TypeError","errorMessage":"Cannot read property 'GetRFCLocationData' of undefined","stack":["TypeError: Cannot read property 'GetLocationData' of undefined","    at /var/task/index.js:35:24","    at /var/task/node_modules/strong-soap/src/soap.js:54:5","    at /var/task/node_modules/strong-soap/src/soap.js:36:16","    at /var/task/node_modules/strong-soap/src/parser/wsdl.js:480:13","    at Request._callback (/var/task/node_modules/strong-soap/src/http.js:166:18)","    at self.callback (/var/task/node_modules/request/request.js:185:22)","    at Request.emit (events.js:375:28)","    at Request.onRequestError (/var/task/node_modules/request/request.js:877:8)","    at ClientRequest.emit (events.js:375:28)","    at TLSSocket.socketErrorListener (_http_client.js:475:9)"]}
END RequestId: b315720f-2294-449d-8337-35d9226b6615

【问题讨论】:

  • “导致对象错误” - 错误信息是什么?
  • 两个VPC如何连接?流量如何到达其他网络?
  • @Marcin 。该错误无法读取客户端的对象。看起来 webservice 没有响应。 {"errorType":"TypeError","errorMessage":"Cannot read property 'GetRLocationData' of undefined","stack":["TypeError: Cannot read property (events.js:375:28)"," at Request. onRequestError (/var/task/node_modules/request/request.js:877:8)"," 在 ClientRequest.emit (events.js:375:28)"," 在 TLSSocket.socketErrorListener (_http_client.js:475:9 )"]} END RequestId: b315720f-2294-449d-8337-35d9226b6615
  • @JohnRotenstein 我们有连接两个 VPC 的中转网关。
  • @Marcin 。问题已解决。似乎 lambda nodejs 没有证书来解密 https 调用。我们在 nodejs 中添加了 process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = 0 。它开始工作了。但是让我们没有朝那个方向思考的奇怪事情是我们的本地网络服务也在工作,它也是 HTTPS。!!现在需要看看如何用证书打包 nodejs 包。谢谢

标签: node.js amazon-web-services aws-lambda amazon-vpc


【解决方案1】:

问题已解决。似乎 lambda nodejs 没有证书来解密 HTTPS 调用。我们在 nodejs 中添加了 process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = 0 。它开始工作了。

【讨论】: