首页 > 解决方案 > AWS Lambda 回调后继续执行

问题描述

我正在使用 API Gateway + AWS Lambda 来处理 Slack API 请求。Slack 要求 Lambda 函数在 3 秒内以 2XX 响应,因此我需要快速响应,然后触发一些长时间运行的数据库操作。问题是 AWS Lambda 要么(1)等待事件循环为空,然后再将响应返回给 API Gateway,要么(2)在callback调用函数时立即返回响应,但它会立即冻结 Lambda 执行和长时间运行用它进行操作。

阅读这篇文章和其他文章,似乎通常的方法是使用 2 个 lambda:一个立即发送 2XX 响应,然后触发另一个 lambda 执行长时间运行的操作。这看起来不错,但我很好奇这是否可以通过一次 lambda 调用来完成?

来自 Mark B这个出色答案的选项#1似乎表明它可以使用 AWS 服务集成类型。但是按照这些说明设置 AWS 服务集成并将调用类型标头设置为“事件”,我仍然看到 Lambda 执行在callback运行后立即冻结。

我的小测试处理程序看起来像这样。我怀疑 Cloudwatch 在运行后没有记录,callback所以我让处理程序在 5 秒超时后向 ngrok 发出请求。我希望立即得到回调响应,然后 5 秒后,我通过 ngrok 收到一个 GET 请求。

const https = require('https');

exports.handler = function(event, context, callback) {
    context.callbackWaitsForEmptyEventLoop = false;

    const options = {
      hostname: 'f3e7f2cc.ngrok.io',
      port: 443,
      path: '/',
      method: 'GET'
    };

    setTimeout(function() {
        console.log(options);
        const req = https.request(options, (res) => {
            console.log('statusCode:', res.statusCode);
            console.log('headers:', res.headers);
        });

        req.end();
    }, 5000);

    const end = new Date().toUTCString();
    callback(null, {body: "OK", timeEnd: end});
};

但是,我可以看到这没有按预期工作。我立即得到callback响应,但 5 秒后没有收到 GET 请求。是否需要调整其他配置才能实现这一目标?还是我应该采用 2 lambda 方法?

标签: amazon-web-servicesaws-lambdaslack-api

解决方案


据我了解,您的问题是 Lambda 以同步方式执行,并且执行时间过长。

解决方案是以异步方式调用 Lambda。在这种情况下,您将立即从网关获得响应,并且您的 Lambda 的执行将使用内部 Lambda 队列进行安排。

此处描述了如何执行此操作。这个对我有用。


推荐阅读