【问题标题】:Lambda function not executing http.getLambda 函数未执行 http.get
【发布时间】:2017-02-17 14:13:12
【问题描述】:

我有一个函数,在本地测试时运行良好,但通过 AWS Lambda 运行时似乎没有执行 HTTP 获取。 代码如下:

function makeAPIRequest(path, responseControl, callback) {

    var responseString = '';
    console.log("Executing makeAPIRequest to " + apiSettings.host + " and path " + path);
    var options = {
        host: apiSettings.host,
        path: path,
        method: 'GET',
        headers: {
            'X-Auth-Token': apiSettings.token
        }
    };
    http.get(options, function (res) {
        console.log('Status Code: ' + res.statusCode);
        if (res.statusCode != 200) {
            callback(new Error("Non 200 Response"));
        }
        res.on('data', function (data) {
            responseString += data;
        });
        res.on('end', function () {
            console.log('http end function hit...');
            callback(null, responseString);
        });
    }).on('error', function (e) {
        console.log("Communications error: " + e.message);
        callback(new Error(e.message));
    });
}

我最初使用 request npm 包编写它,但失败了,所以我退回到 vanilla http.get,但似乎都没有执行。在 Lambda 的日志输出中,我可以看到以下输出:

console.log("Executing makeAPIRequest to " + apiSettings.host + " and path " + path);

传入正确的主机和路径,但是

console.log('Status Code: ' + res.statusCode);

从不输出到屏幕。没有记录任何错误,并且我访问的 API 端点报告了 API 请求的数量,但这并没有改变,所以我认为甚至没有发出请求。

有没有人让 Lambda 进行 http 调用,如果有,对我不在这里做什么有什么想法吗?

谢谢

编辑:验证在 lambda 的高级设置部分中设置了“无 vpc”

【问题讨论】:

  • 您的 lambda 表达式是否以超时结束?它的超时设置是什么?
  • 我刚刚检查了您的代码的稍微简化的版本是否适合我。您还有哪些其他回调可能会阻止 http.get() 的处理程序启动?
  • 感谢 Leon,你带领我走上了正确的道路。原来是 JavaScript 的意大利面条代码在处理我的回调时存在问题,因此 Lambda 函数没有“等待”响应。

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


【解决方案1】:

我每隔几天就会在这里看到这个问题的一些变化。几乎在所有情况下,都是因为您将 Lambda 函数放置在 VPC 中。 Lambda 函数不会在 VPC 内获得分配给它们的公共 IP 地址,因此它们无权访问 VPC 之外的任何内容。这会导致对 VPC 外部资源的网络调用像您所描述的那样挂起。

解决方案是将 Lambda 函数移到 VPC 之外,或者将 NAT 网关添加到您的 VPC。

【讨论】:

  • 刚刚登录并将其设置为 'No VPC' ,据我了解,默认情况下应该允许互联网访问。对吗?
  • 是的,没错。那么您要访问的 API 在哪里?它是暴露在互联网上的东西吗?
  • 是的,您可以在此处查看示例响应:api.football-data.org/v1/competitions/?season=2016
  • 那应该可以了。接下来,我将尝试将调用包装在 try/catch 中,以查看是否引发了一些异常。
  • 添加了try/catch,输出没有区别。仍然没有响应,并且 catch 函数没有触发......
猜你喜欢
  • 2017-11-22
  • 2015-08-09
  • 1970-01-01
  • 1970-01-01
  • 2020-02-07
  • 2016-10-16
  • 2021-05-26
  • 2021-11-15
  • 1970-01-01
相关资源
最近更新 更多