即使在向API网关发送响应后,AWS Lambda也会在后台运行

时间:2017-06-21 06:43:48

标签: node.js aws-lambda aws-api-gateway

我已经通过网络进行了搜索,但没有找到如何使此功能获得成功的解决方案。需要帮助。

我的要求是:如果我触发在node.js中编写的aws lambda函数并且使用aws-serverless-express模块​​必须快速将响应发送回API网关,但仍然不应该退出并仍然在后端,我们可以看到云监视日志。它必须是异步的。

代码段是:

    app.get('/check', function(req, res){
     method.invoke(req)
     res.status(200).send('success')
   })

我做了这样的检查,但是lambda函数被停止并返回对api网关的响应,它甚至没有在后端运行method.invoke()函数。

如果我理解或做错了,请纠正我。我查看了这个链接:Invoke AWS Lambda and return response to API Gateway asyncronously

这是解决此问题的唯一方法吗?创建两个lambda函数。

5 个答案:

答案 0 :(得分:3)

您可以使用连接到API网关的AWS Lambda Step functions实现此目的,并行执行具有两个lambda函数的分支,其中一个返回对API Gateway的响应,而另一个则异步执行。

答案 1 :(得分:2)

找不到指向AWS文档的链接,但通常在Lambda函数返回响应后无法继续处理。这不是available runtimes(用于不同的编程语言)的构造方式。

除了调用单独的异步进程(例如,其他Lambda函数请求或将工作放入队列)或使用此处提到的AWS Step functions之外,还有一种我知道有效的方法:提供特殊的{{ 3}}来满足此需求的AWS Lambda函数。

在标准运行时旁边,您可以custom runtime用于AWS Lambda函数。在标准运行时中,您的处理程序的响应会被发布到Lambda执行上下文中,此后,由于该处理程序正在终止(或至少:已暂停),因此您的处理程序中无法进行任何活动。

因此,发送响应后 使得可能进行其他处理的技巧是,将对Lambda操作内容发布响应的责任从引导脚本转移到Lambda函数处理程序本身...发送完响应后,继续在Lambda函数处理程序中进行处理。使用自定义运行时,发送响应后,Lambda函数中的处理将不会终止,因为这不是您自定义运行时的构造方式。

这不是体系结构上最好的解决方案,因为它弄乱了Lambda操作上下文和Lambda函数处理程序之间的职责...但是,它使发送响应后在Lambda函数处理程序中进行处理成为可能。 / p>

答案 2 :(得分:1)

除了Step Functions之外,您还可以使用Lambda环境内置的SDK调用另一个Lambda函数。

我不是express或NodeJS的专家,但我也认为应该有一种方法可以发回HTTP响应并继续执行代码。

答案 3 :(得分:0)

步进功能似乎是最好的解决方案。参见@Ashan的回复。除此之外,您可以在lambda nodejs sdk中使用新的invoke方法。请注意,现在不建议使用invokeAsync。您可以将InvocationType设置为Event参见下面的示例。取自here

var params = {
  ClientContext: "MyApp", 
  FunctionName: "MyFunction", 
  InvocationType: "Event", 
  LogType: "Tail", 
  Payload: <Binary String>, 
  Qualifier: "1"
 };
 lambda.invoke(params, function(err, data) {
   if (err) console.log(err, err.stack); // an error occurred
   else     console.log(data);           // successful response
   /*
   data = {
    FunctionError: "", 
    LogResult: "", 
    Payload: <Binary String>, 
    StatusCode: 123
   }
   */
 }); 

一个示例用例是,第一个函数将返回立即响应,并且将触发另一个lambda函数,该函数将执行任务并最终称为webhook。

答案 4 :(得分:0)

我是新来的,我想帮忙,所以我是如何克服这个问题的:
我确实在我的 javascript 代码中安装了 axios,然后对另一个函数做了一个请求 我刚刚通过无服务器添加了一个 http api 端点,并且修复了 viola 的内容,而且我可以在请求正文中传递参数。

其他人称其为“即发即忘”的请求。你应该调查一下;)