我已经通过网络进行了搜索,但没有找到如何使此功能获得成功的解决方案。需要帮助。
我的要求是:如果我触发在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函数。
答案 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 的内容,而且我可以在请求正文中传递参数。
其他人称其为“即发即忘”的请求。你应该调查一下;)