由挂起导致的 AWS Lambda 函数“进程在完成请求之前退出”

AWS Lambda Function "Process exited before completing request" caused by hanging?

本文关键字:请求 退出 进程 挂起 AWS 函数 Lambda      更新时间:2023-09-26

我开发了一个节点应用程序,我想将其称为AWS Lambda应用程序。

该应用程序按 AWS Lambda 的预期工作,但我的 CloudWatch 日志始终以以下错误结束:Process exited before completing request

我编写了一些代码来确保我的context.succeed()context.fail()调用正在发生,并且确实发生了。但是,在本地运行时,我还注意到我在 start.js 中成功记录与命令提示符再次出现之间存在滞后,这让我相信一旦进行了这些调用,可能还会有一些节点进程发生。这是否会导致错误,如果是这样,什么是分类和解决问题的好方法?

相关代码如下:

λ句柄.js

import log from './log';
import database from './database';
import User from './database/models/user';
export function handle(event, context) {
  log.info('CS Blogs Feed Aggregator Started');
  database.sync()
    .then(() =>
      User.findAll({
        attributes: ['id', 'blogFeedURI']
      }))
    .then(users => {
      users.forEach(user => {
        log.info({ user }, 'User loaded from database');
      });
    })
    .then(() => {
      // context.done() called so AWS knows function completed successfully
      context.succeed();
    })
    .catch(error => {
      context.fail(error);
    });
}

start.js(用于测试上下文。调用成功/失败(

// This function invokes the AWS Lambda Handle as AWS would
// but allows you to do it from your local machine for development
// or from a non-AWS server
import { handle } from './lambda-handle';
import log from './log';
handle({}, {
  succeed: result => {
    log.info({ result: result || 'No result returned' }, 'Process succeeded');
  },
  fail: error => {
    log.error({ error: error || 'No error returned' }, 'Process failed');
  }
});

代码在部署之前由 babel 转译。但是,我怀疑有更多的逻辑问题,所以我向您展示了原始源代码。

如果需要更多信息,存储库可在此处获得:https://github.com/csblogs/feed-downloader/tree/fix/lambda-implementation-details

谢谢

我很确定这是由 bunyan( dtrace-provider(中至少 1 个本机模块依赖项引起的。本机模块需要在运行它们的系统上构建/安装。因此,对于 Lambda,您需要在 linux ec2 实例上运行npm install,或者可能需要在流浪者上运行,以获得正确版本的dtrace-provider

看:使用带有节点 gyp 的本机绑定的交叉编译节点模块https://aws.amazon.com/blogs/compute/nodejs-packages-in-lambda/(滚动到本机模块(

您可能只是删除 Bunyan 以验证它是否有效,然后沿着 ec2/vagrant 编译路线(如果可以修复它(。