【问题标题】:AWS Lambda: Error: getaddrinfo ENOTFOUND from apiAWS Lambda:错误:来自 api 的 getaddrinfo ENOTFOUND
【发布时间】:2018-07-25 18:24:52
【问题描述】:

我创建了以下代码,它从 S3 存储桶中获取一个 seralizedXmlFile 对象并将其推送到 api 服务。这将返回 FAIL 并显示日志

Error: getaddrinfo ENOTFOUND http://url
at errnoException (dns.js:28:10)
at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:76:26)

代码:

const AWS = require('aws-sdk');
const https = require('http');
var s3 = new AWS.S3();
var un;
var pw;
var seralizedXmlFile;

let index = function index(event, context, callback) {
 //for testing I have named the bucket and key   
var params = {
  Bucket: "bucket", //event.bucketName, 
  Key:  "personnelData_50112404_635705766849654385.xml" //event.fileName
};

s3.getObject(params, function(data, err) 
 {
   if (data) 
   {
       let seralizedXmlFile = err.Body.toString('utf-8'); // Use the encoding necessary
       console.log("objectData " + seralizedXmlFile);
   }   
 });

var ssm = new AWS.SSM({region: 'ap-southeast-2'});
var paramsx = {
  'Names' : ['/App/ServiceUsername', '/App/ServicePassword'],
  'WithDecryption' : true
};

ssm.getParameters(paramsx, function(err, data) {
  if (err) console.log(err, err.stack); // an error occurred
  else     {console.log('data: ' + JSON.stringify(data));           // successful response
  console.log('password: ' + data.Parameters[0].Value); 
  console.log('username: ' + data.Parameters[1].Value); 
  pw = data.Parameters[0].Value;
  un = data.Parameters[1].Value;
  }
   const req = https.request('http:/url/api/SyncPersonnelViaAwsApi/Get/5', (res) => {
                res.headers + 'Authorization: Basic ' + un + ':' + pw;
                let body = seralizedXmlFile;
        console.log('Status:', res.statusCode);
        console.log('Headers:', JSON.stringify(res.headers));
        res.setEncoding('utf8');
        res.on('data', (chunk) => body += chunk);
        res.on('end', () => {
            console.log('Successfully processed HTTPS response');

           console.log('returned res: ' + res);           
           callback(null, res);                  

        });
    });
    req.end();
});
};
exports.handler = index;

我关注了我在 AWS Lambda: Error: getaddrinfo ENOTFOUND 上找到的 Q 和 A

并将代码更改为

  var params = {
    host: "http://URL",
    path: "/api/SyncPersonnelViaAwsApi/Get/5"
};
var req = https.request(params, function(res) {
    let data = '';
    console.log('STATUS: ' + res.statusCode);
    res.setEncoding('utf8');
    res.on('data', function(chunk) {
        data += chunk;
    });
    res.on('end', function() {
        console.log("DONE");
        console.log(JSON.parse(data));

但再次触发相同的错误....有人知道问题是什么吗?

我还通过 POSTMAN 测试了 web 服务 api,所以我可以确认它正在工作

谢谢

【问题讨论】:

  • 这个外部站点是在 Internet 上还是在某个 VPC 中?因为您的 lambda 需要访问相同的权限。请看aws.amazon.com/premiumsupport/knowledge-center/…
  • 它是在 IIS 上发布的 API 解决方案,我会尝试你的建议
  • 在哪里将占位符字符串http://URL 更改为真实的东西? URL 部分显然是占位符,不是有效的主机名。

标签: javascript node.js https aws-lambda


【解决方案1】:

试试

host: "URL",

而不是

host: "http://URL",

另外,您正在使用 https 库,并且您的 URL 前缀是 http://,但我认为您可以/应该完全省略它。

【讨论】:

    【解决方案2】:

    错误:getaddrinfo ENOTFOUND http://url

    表示客户端无法连接到给定地址。请尝试指定不带 http 的主机:

    var params = {
        host: "URL",
        path: "/api/SyncPersonnelViaAwsApi/Get/5"
    };
    

    【讨论】:

      猜你喜欢
      • 2021-08-10
      • 2016-09-20
      • 2017-12-30
      • 2017-10-16
      • 2022-11-10
      • 2018-03-03
      • 1970-01-01
      • 2014-10-20
      • 2018-05-24
      相关资源
      最近更新 更多