回调后 AWS Lambda 继续执行

Alv*_*vin 5 amazon-web-services slack-api aws-lambda

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

阅读这篇文章和其他文章,似乎通常的方法是使用 2 个 lambdas:一个立即发送 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});
};
Run Code Online (Sandbox Code Playgroud)

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

nic*_*tev 4

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

解决方案是以异步方式调用 Lambda 。在这种情况下,您将立即收到来自 Gateway 的响应,并且将使用内部 Lambda 队列安排 Lambda 的执行。

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