【问题标题】:AWS Lambda to run in background even after sending response to API GatewayAWS Lambda 即使在向 API Gateway 发送响应后也会在后台运行
【发布时间】:2017-11-23 21:58:13
【问题描述】:

我已经在网上搜索了所有内容,但没有找到如何使此功能成功的解决方案。需要帮助。

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

代码sn-p是:

    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 函数。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 你有没有机会发布一张这样的图片(以实现向 API 网关返回响应的效果)?
    • 我也很想知道如何自定义 API Gateway 从 Step Function 返回的响应。
    【解决方案2】:

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

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

    【讨论】:

    • 如果你没有从代码中返回,只是发送响应( res.send() ),代码将继续执行。但是,对于 Lambda 来说,情况并非如此。我在我的机器上遇到了同样的问题,它运行良好。但是部署在 Lambda 上的代码在将 HTTP 响应发送回客户端后停止执行。
    【解决方案3】:

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

    除了调用单独的异步进程(例如,其他 Lambda 函数请求,或将工作放在队列上)或使用这里提到的 AWS Step functions 之外,还有第三种我知道可行的方法:提供一个特殊的 custom runtime for满足此需求的 AWS Lambda 函数。

    除了标准运行时,您还可以将create and specify a custom runtime 用于您的 AWS Lambda 函数。在标准运行时中,您的处理程序的响应被发布到 Lambda 执行上下文,之后您的处理程序中不可能有任何活动,因为处理程序正在终止(或至少:暂停)。

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

    这不是架构上最好的解决方案,因为它混淆了 Lambda 操作上下文和您的 Lambda 函数处理程序之间的职责......但它可以在发送响应后在您的 Lambda 函数处理程序中进行处理。

    【讨论】:

    • 我的同事刚刚发表了一篇关于这个解决方案的博客文章,因为我们在我们构建的一个软件中遇到了这个问题。见xebia.com/blog/…。我们的情况是,我们需要将一个函数的所有请求复制到其他几个函数,并收集和比较响应......但不想等待从第一个函数发送响应。
    【解决方案4】:

    阶梯函数似乎是这里最好的解决方案。请参阅@Ashan 的回复。除此之外,您可以在 lambda nodejs sdk 中使用新的调用方法。请注意,现在已弃用 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。

    【讨论】:

      【解决方案5】:

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

      对方称其为fire and forget request。你应该调查一下;)

      【讨论】:

        猜你喜欢
        • 2015-10-21
        • 2019-08-03
        • 1970-01-01
        • 2019-01-09
        • 2018-08-14
        • 2017-09-07
        • 2016-09-14
        • 2013-10-09
        • 1970-01-01
        相关资源
        最近更新 更多