2016-02-14 39 views
0

我开发了一个节点应用程序,我希望将其称为AWS Lambda应用程序。AWS Lambda函数“在完成请求之前退出进程”引起的挂起?

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

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

相关的代码是下面:

λ-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 /失败被调用)

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

感谢

+0

'User.findAll()'是否返回承诺?如果不是这样,似乎你会试图在它之前迭代“用户”。 – Ryan

+0

是的。 User.findAll()返回一个承诺,代码按预期工作。 – DanTonyBrown

+0

然后,我会检查以下内容:1.在Lambda上设置一个额外的高超时时间,也许它超时2.在本地安装节点0.10.x并确保代码仍然运行3.如果数据库是aws资源,请确保您的lambda拥有正确的角色来访问它 – Ryan

回答

0

我敢肯定这是由至少1原生模块依赖于本仁(dtrace-provider)引起的。本地模块需要在它们将运行的系统上构建/安装。因此,在Lambda的情况下,您需要在linux ec2实例上运行npm install,或者可能需要迁移才能获得构建的正确版本dtrace-provider

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

你很可能只是删除本仁,以验证它的工作原理,然后走下来EC2 /游民编译路线问题能否解决。