NodeJS脚本出错后,不会再启动。 AWS 拉姆达

After NodeJS script has an error, it will not start again. AWS Lambda

我在 nodejs4.x 运行 时间有一个 lambda 函数。如果我的脚本由于错误而停止执行,假设我尝试获取未定义对象的 .length,那么我将无法再次启动脚本。它甚至不像脚本 运行s 并且会遇到同样的错误,脚本不会 运行。 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次)。 但是,这仅适用于 异步 调用,there are two types of invocations.

  2. 你的 lambda 代码需要的任何外部模块,必须包含在你部署到 lambda 的包中,


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

由于调用require('request')时Lambda函数失败,我认为项目没有正确部署。 request must be deployed with the Lambda function because it is not part of 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 函数。

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

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

他们正在修复。

论坛 post:https://forums.aws.amazon.com/thread.jspa?threadID=238434&tstart=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 超时,然后变得无响应。

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

context.callbackWaitsForEmptyEventLoop = false;

并将所有 'require' 块放入处理程序中,但没有任何效果。因此,防止 Lambda 死机的好方法是设置更大的超时时间,10 秒应该足以作为防止此错误的解决方法。