一尘不染

为什么此HTTP请求在AWS Lambda上不起作用?

node.js

我开始使用AWS
Lambda,并且尝试从处理程序功能请求外部服务。根据,HTTP请求应该可以正常工作,而且我还没有找到其他说明的文档。(实际上,人们已经发布了使用TwilioAPI发送SMS的代码。)

我的处理程序代码是:

var http = require('http');

exports.handler = function(event, context) {
  console.log('start request to ' + event.url)
  http.get(event.url, function(res) {
    console.log("Got response: " + res.statusCode);
  }).on('error', function(e) {
    console.log("Got error: " + e.message);
  });

  console.log('end request to ' + event.url)
  context.done(null);
}

我在CloudWatch日志中看到以下4行:

2015-02-11 07:38:06 UTC START RequestId: eb19c89d-b1c0-11e4-bceb-d310b88d37e2
2015-02-11 07:38:06 UTC eb19c89d-b1c0-11e4-bceb-d310b88d37e2 start request to http://www.google.com
2015-02-11 07:38:06 UTC eb19c89d-b1c0-11e4-bceb-d310b88d37e2 end request to http://www.google.com
2015-02-11 07:38:06 UTC END RequestId: eb19c89d-b1c0-11e4-bceb-d310b88d37e2

我希望在那里有另一行:

2015-02-11 07:38:06 UTC eb19c89d-b1c0-11e4-bceb-d310b88d37e2 Got response: 302

但这是缺失的。如果我使用的是本机上节点中没有处理程序包装的基本部分,则代码将按预期工作。

inputfile.txt我使用的是用于invoke-async调用是这样的:

{
   "url":"http://www.google.com"
}

似乎处理程序代码中执行请求的部分被完全跳过了。我从请求库开始,然后回到使用Plain
http创建一个最小示例。我还尝试请求我控制的服务的URL以检查日志,并且没有任何请求进入。

我完全迷住了。 节点和/或AWS Lambda不会执行HTTP请求有什么原因吗?


阅读 336

收藏
2020-07-07

共1个答案

一尘不染

当然,我误会了这个问题。正如AWS自己所说的那样

对于那些在Lambda中首次遇到nodejs的人来说,一个常见的错误是忘记了回调是异步执行的,而context.done()当您确实要等待另一个回调(例如S3.PUT操作)完成时,则调用
原始处理程序,从而强制执行该函数因工作不完整而终止。

context.done在请求的任何回调被触发之前,我正在调用way,导致我的函数提前终止。

工作代码是这样的:

var http = require('http');

exports.handler = function(event, context) {
  console.log('start request to ' + event.url)
  http.get(event.url, function(res) {
    console.log("Got response: " + res.statusCode);
    context.succeed();
  }).on('error', function(e) {
    console.log("Got error: " + e.message);
    context.done(null, 'FAILURE');
  });

  console.log('end request to ' + event.url);
}

更新: 从2017年开始,AWS已弃用旧的Nodejs
0.10,现在仅提供新的4.3运行时(应更新旧功能)。该运行时对处理程序函数进行了一些更改。现在,新处理程序具有3个参数。

function(event, context, callback)

虽然你仍然会发现succeeddonefail上下文参数,AWS建议使用的callback功能,而不是或null默认情况下返回。

callback(new Error('failure')) // to return error
callback(null, 'success msg') // to return ok

完整的文档可以在http://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-
handler.html中找到

2020-07-07