NodeJS脚本发生错误后,将不会再次启动。 AWS Lambda

我在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'); 

我知道的一些事情:

  1. 如果lambda调用失败,由于任何原因,它将被再次调用(实际上它将被重试最多3次)。 但是,这仅适用于asynchronous调用, 有两种types的调用 。

  2. 您的lambda代码需要的任何外部模块必须包含在您部署到lambda的包中, 我已经在这里简单地说明了这一点 。


你可以编写访问未定义variables属性的代码,是的,它会抛出一个exception,如果这个调用是asynchronous的 ,它将被重试2次 – 这当然也会失败。

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

确保:

  1. require被添加到你的package.json文件中(例如,通过调用$ npm install require --save ,请参阅npm install了解详细信息)。
  2. 通过压缩项目文件夹(包括node_modules文件夹)来创build部署包 。
  3. 将部署.zip上传到您的Lambda函数。

所以在通过他们的论坛联系AWS之后,结果是一个错误。 容器在出错时不会被清除,所以代码必须重新上传。

一个解决scheme是制作一个cloudwatch警报,该警报会引发另一个lambda函数自动重新上传代码。

他们正在修复。

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

实际上,在很多情况下,Lambda变得没有反应,例如:

  1. parsing无效的json:

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

     exports.handler = function(event, context, callback) { var emptyObject = {}; var value = emptyObject.Item.Key; 
  3. 访问RDS后不closuresmySql连接会导致Lambda超时,然后变为无响应。

重新加载代码的lambda可能需要一定的时间。 经过一些testing发现,实际上Lambda尝试重新启动(重新加载容器?),但没有足够的时间。 如果将超时设置为10秒,则在执行时间〜4s后,Lambda开始工作,然后在下一次运行中performance正常。 我也试着玩设置:

 context.callbackWaitsForEmptyEventLoop = false; 

并把所有'需求'块内处理程序,没有真正的工作。 所以防止Lambda死机的好方法是设置更大的超时时间,10s应该足以解决这个问题。