在进行HTTPs请求时出现“Error: getaddrinfo ENOTFOUND”错误。

19

以下是 AWS Lambda 函数的代码:

var https = require('https');
exports.handler = (event, context, callback) => {
    var params = {
        host: "bittrex.com",
        path: "/api/v1.1/public/getmarketsummaries"
    };
    var req = https.request(params, function(res) {
        var test = res.toString();
        console.log(JSON.parse(test));
        //console.log(JSON.parse(res.toString()));
    });
    req.end();
};

错误:getaddrinfo ENOTFOUND https://bittrex.com https://bittrex.com:443 at errnoException (dns.js:28:10) at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:76:26)

其他解决方案无效。


@MarkB,VPC是什么? - AmazingDayToday
5个回答

23

从主机名中移除 https://,因为已经在要求中指定了使用 https/SSL。


13

我修改了你的代码,使其在AWS Lambda Node.js 6.10中正常工作。我将Lambda超时设置为60秒进行测试。

最大的变化是添加了 "res.on('data', function(chunk) {}:" 和 "res.on('end', function() {}".

var https = require('https');
exports.handler = (event, context, callback) => {
    var params = {
        host: "bittrex.com",
        path: "/api/v1.1/public/getmarketsummaries"
    };
    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));
        });
    });
    req.end();
};

5

问题出在您的安全组上。看起来您的Lambda没有解析DNS的权限。请检查Lambda安全组是否启用了53端口的UDP和TCP。


2
Lambda默认没有安全组。只有在更改其网络配置以在您的VPC内运行时才会有一个安全组。 - cdimitroulas
2
默认情况下,它没有分配安全组,但是可以很容易地配置它在您的VPC和子网中运行,并分配安全组。 - Suken Shah

2

同时确保: Lambda 尝试连接可达主机。换句话说,确保该主机不是位于私有网络、VPN 或无法从外部访问的不可达网络。

(虽然平凡,但仍值得一提)


0

您的 Lambda 函数和主机必须在同一个 VPC 中,同时尝试为 Lambda 添加与主机相同的安全组。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接