【问题标题】:AWS Lambda Function "Process exited before completing request" caused by hanging?挂起导致的 AWS Lambda 函数“进程在完成请求之前退出”?
【发布时间】:2016-02-16 02:12:46
【问题描述】:

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

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

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

相关代码如下:

lambda-handle.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(用于测试 context.succeed/fail 被调用)

// 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

谢谢

【问题讨论】:

  • User.findAll() 是否返回承诺?如果不是,您似乎会尝试在 users 出现之前对其进行迭代。
  • 是的。 User.findAll() 返回一个承诺,代码按预期工作。
  • 然后我会检查以下内容: 1. 在 Lambda 上设置一个额外的高超时,可能是超时 2. 在本地安装节点 0.10.x 并确保代码仍然运行 3. 如果数据库是 aws 资源确保您的 lambda 具有正确的角色来访问它
  • @Ryan。 lambda 的超时时间已经是 5 分钟。远远超过执行所需的时间。如日志所示,代码按预期作为 lambda 运行。该数据库是 AWS 资源,但由于用户在日志中正确打印,因此可以访问。

标签: javascript node.js amazon-web-services aws-lambda


【解决方案1】:

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

见: Cross-compile node module with native bindings with node-gyp https://aws.amazon.com/blogs/compute/nodejs-packages-in-lambda/(滚动到本机模块)

您可能只是删除 Bunyan 以验证它是否有效,然后如果可以修复它,则继续执行 ec2/vagrant 编译路线。

【讨论】:

    猜你喜欢
    • 2018-03-25
    • 1970-01-01
    • 1970-01-01
    • 2015-08-03
    • 1970-01-01
    • 2017-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多