在NodeJS脚本出错后,它将不会再次启动。 AWS Lambda

时间:2016-08-31 16:34:14

标签: node.js amazon-web-services aws-lambda alexa-skills-kit requestjs

我在nodejs4.x运行时有一个lambda函数。如果我的脚本由于错误而停止执行,假设我尝试获取未定义对象的.length,那么我就无法再次启动脚本。它甚至不像脚本运行并且遇到相同的错误,脚本也不会运行。 lambda处理函数永远不会被第二次调用。

此lambda函数是Amazon Alexa的终结点。当我重新上载代码(zip文件)时,系统再次运行。

这是nodejs的一些行为吗?脚本结尾是否会破坏文件,使其无法再次启动?

当服务器遇到错误时,我收到此消息Process exited before completing request

然后后续请求达到超时限制。

重要编辑 我已经向NPM请求指出了这个问题。模块没有完成加载,即

console.log('i see this message');
var request = require('request');
console.log('this never happens');

4 个答案:

答案 0 :(得分:1)

我知道的一些事情:

  1. 如果lambda调用失败,由于任何原因,它将再次被调用(实际上它将被重试最多3次)。 但是,这仅适用于异步调用,there are two types of invocations

  2. 您的lambda代码所需的任何外部模块必须包含在您部署到lambda I have explained this simply in here的包中。

  3. 你可以编写访问未定义变量属性的代码,是的,它会抛出异常,如果这个调用是异步,它将被重试2次 - 当然也会失败。

答案 1 :(得分:0)

由于Lambda函数在调用require('request')时失败,我认为该项目尚未正确部署。必须使用Lambda函数部署request,因为它不是Node.js 4.3.2(当前Lambda JavaScript运行时)的一部分。

确保:

  1. require已添加到您的package.json文件中(例如,通过致电$ npm install require --save,有关详细信息,请参阅npm install。)
  2. 您可以通过压缩项目文件夹(包括node_modules文件夹)来创建deployment package
  3. 将部署.zip上传到您的Lambda函数。

答案 2 :(得分:0)

因此,在通过他们的论坛联系AWS后,结果证明这是一个错误。错误时不会清除容器,因此必须重新上载代码。

解决方案是制作一个cloudwatch闹钟,触发另一个自动重新上传代码的lambda函数。

他们正在修复。

论坛帖子:https://forums.aws.amazon.com/thread.jspa?threadID=238434&tstart=0

答案 3 :(得分:0)

事实上,Lambda变得没有反应的情况很多,例如:

  1. 解析无效的json:

    exports.handler = function(event, context, callback)
    {
        var nonValidJson = "Not even Json";
        var jsonParse = JSON.parse(nonValidJson);
    
  2. 访问未定义变量的属性:

    exports.handler = function(event, context, callback)
    {
        var emptyObject = {};
        var value = emptyObject.Item.Key;
    
  3. 访问RDS后未关闭mySql连接导致Lambda超时,然后它变得无响应。

  4. 制作重新上载代码的lambda可能需要一段时间。 经过一些测试后,它发现事实上Lambda试图重新启动(重装容器?),时间不够。如果将超时设置为10秒,则执行时间约为4秒后,Lambda开始工作,然后在下一次运行中表现正常。我也尝试过设置:

    context.callbackWaitsForEmptyEventLoop = false;
    

    并将所有'要求'处理程序内的块,没有真正有用。因此,防止Lambda死机的好方法是设置更大的超时,10s应该足以作为针对此bug的变通方法保护。