amazon-web-services - 回调后 AWS Lambda 继续执行

标签 amazon-web-services aws-lambda slack-api

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

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

来自 this excellent answer 的选项 #1 Mark B 似乎暗示使用 AWS 服务集成类型是可能的。但关注 these instructions要设置 AWS 服务集成并将调用类型 header 设置为“事件”,我仍然看到 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 方法?

最佳答案

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

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

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

关于amazon-web-services - 回调后 AWS Lambda 继续执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59450564/

相关文章:

amazon-web-services - AWS::RDS::DBInstance 不是从 cloudformation 创建的

MySql 无需停机即可迁移到 Aurora

python - Python 中基于类的 AWS lambda

python - 如何在 slack oAuth 重定向 url 中使用动态重定向 url?

Java - 向 Slack Webhook 发送消息

Java AWS S3 PutObject 多部分文件

python - 有效的 UUID 不是有效的 UUID

python - AWS lambda CLI 'update-function-code' 不更新 lambda_handler 文件

amazon-web-services - 使用 AWS lambda 的异步后台作业

node.js - 使用 Microsoft Bot Framework 在 slack 中获取消息发件人的姓名