Node.js NodeJS Lambda似乎失败,但报告成功
我看到的是我不完全理解的NodeJS Lambda的行为。首先,我假设我们的代码中至少有一个bug,但我们很难理解的问题是,它如何影响同一个Lambda实例上的子序列调用 我所能理解的最大问题是,在初始失败后,我的下一次调用也将失败,我看到一个错误,似乎表明nodejs已经终止。然后我看到它重新初始化并再次成功地开始处理请求 有几个问题:Node.js NodeJS Lambda似乎失败,但报告成功,node.js,aws-lambda,Node.js,Aws Lambda,我看到的是我不完全理解的NodeJS Lambda的行为。首先,我假设我们的代码中至少有一个bug,但我们很难理解的问题是,它如何影响同一个Lambda实例上的子序列调用 我所能理解的最大问题是,在初始失败后,我的下一次调用也将失败,我看到一个错误,似乎表明nodejs已经终止。然后我看到它重新初始化并再次成功地开始处理请求 有几个问题: 好的,我们似乎有一个bug,我想我们可以找到它并在某个时候修复它 后续调用中的NodeJ终止,但调用被视为成功(当然不是) 因为第二次调用被认为是成功的,所以
让我试着展示一些细节。首先,这是第二次调用,它确实失败了,NodeJS似乎要终止:
START RequestId: a71447b0-19f8-456c-b163-47e0408bf3a1 Version: $LATEST
2019-10-17T00:26:12.295Z a71447b0-19f8-456c-b163-47e0408bf3a1 INFO Assuming lambda role: { ... }lambda',
END RequestId: a71447b0-19f8-456c-b163-47e0408bf3a1
REPORT RequestId: a71447b0-19f8-456c-b163-47e0408bf3a1 Duration: 228.19 ms Billed Duration: 300 ms Memory Size: 256 MBMax Memory Used: 158 MB
RequestId: a71447b0-19f8-456c-b163-47e0408bf3a1 Error: Runtime exited with error: exit status 129
也许我误解了最后一行,但在我看来,NodeJS肯定要终止了(用SIGHUP??)。在此之后,下一次调用将显示X射线日志,就像我们在第一次调用此实例时看到的:
2019-10-17T00:55:30.531Z undefined INFO AWS_XRAY_DAEMON_ADDRESS is set. Configured daemon address to 169.xxx.xxx.xxx.
2019-10-17T00:55:30.536Z undefined INFO AWS_XRAY_CONTEXT_MISSING is set. Configured context missing strategy to LOG_ERROR.
2019-10-17T00:55:30.554Z undefined INFO Subsegment streaming threshold set to: 0
所以它在我的lambda实例上重新启动了NodeJs?这是我们应该看到的吗
如果我在X光等中查找此项,则显示错误,但状态为200:
我认为还值得展示之前的调用,它似乎触发了这一点。这也是成功的,它确实返回了正确的值等,但完成后,我在日志中看到:
2019-10-17T00:55:29.169Z 3bf23bda-e7fa-4fd7-b373-2258baff2bb8 ERROR Uncaught Exception {"errorType":"Error","errorMessage":"premature close","stack":["Error: premature close"," at Duplexify.onclose (/var/task/node_modules/end-of-stream/index.js:47:67)"," at Duplexify.emit (events.js:198:13)"," at Duplexify.EventEmitter.emit (domain.js:448:20)"," at Duplexify._destroy (/var/task/node_modules/duplexify/index.js:199:8)"," at /var/task/node_modules/duplexify/index.js:182:10"," at /var/task/node_modules/async-listener/glue.js:188:31"," at process._tickCallback (internal/process/next_tick.js:61:11)"]}
2019-10-17T00:55:29.326Z 3bf23bda-e7fa-4fd7-b373-2258baff2bb8 ERROR Uncaught Exception {"errorType":"Error","errorMessage":"premature close","stack":["Error: premature close"," at Duplexify.onclose (/var/task/node_modules/end-of-stream/index.js:47:67)"," at Duplexify.emit (events.js:198:13)"," at Duplexify.EventEmitter.emit (domain.js:448:20)"," at Duplexify._destroy (/var/task/node_modules/duplexify/index.js:199:8)"," at /var/task/node_modules/duplexify/index.js:182:10"," at /var/task/node_modules/async-listener/glue.js:188:31"," at process._tickCallback (internal/process/next_tick.js:61:11)"]}
2019-10-17T00:55:29.328Z 3bf23bda-e7fa-4fd7-b373-2258baff2bb8 ERROR Uncaught Exception {"errorType":"Error","errorMessage":"premature close","stack":["Error: premature close"," at Duplexify.onclose (/var/task/node_modules/end-of-stream/index.js:47:67)"," at Duplexify.emit (events.js:198:13)"," at Duplexify.EventEmitter.emit (domain.js:448:20)"," at Duplexify._destroy (/var/task/node_modules/duplexify/index.js:199:8)"," at /var/task/node_modules/duplexify/index.js:182:10"," at /var/task/node_modules/async-listener/glue.js:188:31"," at process._tickCallback (internal/process/next_tick.js:61:11)"]}
2019-10-17T00:55:29.329Z 3bf23bda-e7fa-4fd7-b373-2258baff2bb8 ERROR Uncaught Exception {"errorType":"Error","errorMessage":"premature close","stack":["Error: premature close"," at Duplexify.onclose (/var/task/node_modules/end-of-stream/index.js:47:67)"," at Duplexify.emit (events.js:198:13)"," at Duplexify.EventEmitter.emit (domain.js:448:20)"," at Duplexify._destroy (/var/task/node_modules/duplexify/index.js:199:8)"," at /var/task/node_modules/duplexify/index.js:182:10"," at /var/task/node_modules/async-listener/glue.js:188:31"," at process._tickCallback (internal/process/next_tick.js:61:11)"]}
2019-10-17T00:55:29.329Z 3bf23bda-e7fa-4fd7-b373-2258baff2bb8 ERROR Uncaught Exception {"errorType":"Error","errorMessage":"premature close","stack":["Error: premature close"," at Duplexify.onclose (/var/task/node_modules/end-of-stream/index.js:47:67)"," at Duplexify.emit (events.js:198:13)"," at Duplexify.EventEmitter.emit (domain.js:448:20)"," at Duplexify._destroy (/var/task/node_modules/duplexify/index.js:199:8)"," at /var/task/node_modules/duplexify/index.js:182:10"," at /var/task/node_modules/async-listener/glue.js:188:31"," at process._tickCallback (internal/process/next_tick.js:61:11)"]}
2019-10-17T00:55:29.330Z 3bf23bda-e7fa-4fd7-b373-2258baff2bb8 ERROR Uncaught Exception {"errorType":"Error","errorMessage":"premature close","stack":["Error: premature close"," at Duplexify.onclose (/var/task/node_modules/end-of-stream/index.js:47:67)"," at Duplexify.emit (events.js:198:13)"," at Duplexify.EventEmitter.emit (domain.js:448:20)"," at Duplexify._destroy (/var/task/node_modules/duplexify/index.js:199:8)"," at /var/task/node_modules/duplexify/index.js:182:10"," at /var/task/node_modules/async-listener/glue.js:188:31"," at process._tickCallback (internal/process/next_tick.js:61:11)"]}
2019-10-17T00:55:29.368Z 3bf23bda-e7fa-4fd7-b373-2258baff2bb8 ERROR Uncaught Exception {"errorType":"Error","errorMessage":"premature close","stack":["Error: premature close"," at Duplexify.onclose (/var/task/node_modules/end-of-stream/index.js:47:67)"," at Duplexify.emit (events.js:198:13)"," at Duplexify.EventEmitter.emit (domain.js:448:20)"," at Duplexify._destroy (/var/task/node_modules/duplexify/index.js:199:8)"," at /var/task/node_modules/duplexify/index.js:182:10"," at /var/task/node_modules/async-listener/glue.js:188:31"," at process._tickCallback (internal/process/next_tick.js:61:11)"]}
2019-10-17T00:55:29.388Z 3bf23bda-e7fa-4fd7-b373-2258baff2bb8 ERROR Uncaught Exception {"errorType":"Error","errorMessage":"premature close","stack":["Error: premature close"," at Duplexify.onclose (/var/task/node_modules/end-of-stream/index.js:47:67)"," at Duplexify.emit (events.js:198:13)"," at Duplexify.EventEmitter.emit (domain.js:448:20)"," at Duplexify._destroy (/var/task/node_modules/duplexify/index.js:199:8)"," at /var/task/node_modules/duplexify/index.js:182:10"," at /var/task/node_modules/async-listener/glue.js:188:31"," at process._tickCallback (internal/process/next_tick.js:61:11)"]}
2019-10-17T00:55:29.408Z 3bf23bda-e7fa-4fd7-b373-2258baff2bb8 ERROR Uncaught Exception {"errorType":"Error","errorMessage":"premature close","stack":["Error: premature close"," at Duplexify.onclose (/var/task/node_modules/end-of-stream/index.js:47:67)"," at Duplexify.emit (events.js:198:13)"," at Duplexify.EventEmitter.emit (domain.js:448:20)"," at Duplexify._destroy (/var/task/node_modules/duplexify/index.js:199:8)"," at /var/task/node_modules/duplexify/index.js:182:10"," at /var/task/node_modules/async-listener/glue.js:188:31"," at process._tickCallback (internal/process/next_tick.js:61:11)"]}
2019-10-17T00:55:29.428Z 3bf23bda-e7fa-4fd7-b373-2258baff2bb8 ERROR Uncaught Exception {"errorType":"Error","errorMessage":"premature close","stack":["Error: premature close"," at Duplexify.onclose (/var/task/node_modules/end-of-stream/index.js:47:67)"," at Duplexify.emit (events.js:198:13)"," at Duplexify.EventEmitter.emit (domain.js:448:20)"," at Duplexify._destroy (/var/task/node_modules/duplexify/index.js:199:8)"," at /var/task/node_modules/duplexify/index.js:182:10"," at /var/task/node_modules/async-listener/glue.js:188:31"," at process._tickCallback (internal/process/next_tick.js:61:11)"]}
2019-10-17T00:55:29.467Z 3bf23bda-e7fa-4fd7-b373-2258baff2bb8 ERROR Uncaught Exception {"errorType":"Error","errorMessage":"premature close","stack":["Error: premature close"," at Duplexify.onclose (/var/task/node_modules/end-of-stream/index.js:47:67)"," at Duplexify.emit (events.js:198:13)"," at Duplexify.EventEmitter.emit (domain.js:448:20)"," at Duplexify._destroy (/var/task/node_modules/duplexify/index.js:199:8)"," at /var/task/node_modules/duplexify/index.js:182:10"," at /var/task/node_modules/async-listener/glue.js:188:31"," at process._tickCallback (internal/process/next_tick.js:61:11)"]}
2019-10-17T00:55:29.468Z 3bf23bda-e7fa-4fd7-b373-2258baff2bb8 ERROR Uncaught Exception {"errorType":"Error","errorMessage":"premature close","stack":["Error: premature close"," at Duplexify.onclose (/var/task/node_modules/end-of-stream/index.js:47:67)"," at Duplexify.emit (events.js:198:13)"," at Duplexify.EventEmitter.emit (domain.js:448:20)"," at Duplexify._destroy (/var/task/node_modules/duplexify/index.js:199:8)"," at /var/task/node_modules/duplexify/index.js:182:10"," at /var/task/node_modules/async-listener/glue.js:188:31"," at process._tickCallback (internal/process/next_tick.js:61:11)"]}
2019-10-17T00:55:29.469Z 3bf23bda-e7fa-4fd7-b373-2258baff2bb8 ERROR Uncaught Exception {"errorType":"Error","errorMessage":"premature close","stack":["Error: premature close"," at Duplexify.onclose (/var/task/node_modules/end-of-stream/index.js:47:67)"," at Duplexify.emit (events.js:198:13)"," at Duplexify.EventEmitter.emit (domain.js:448:20)"," at Duplexify._destroy (/var/task/node_modules/duplexify/index.js:199:8)"," at /var/task/node_modules/duplexify/index.js:182:10"," at /var/task/node_modules/async-listener/glue.js:188:31"," at process._tickCallback (internal/process/next_tick.js:61:11)"]}
2019-10-17T00:55:29.567Z 3bf23bda-e7fa-4fd7-b373-2258baff2bb8 ERROR Uncaught Exception {"errorType":"Error","errorMessage":"premature close","stack":["Error: premature close"," at Duplexify.onclose (/var/task/node_modules/end-of-stream/index.js:47:67)"," at Duplexify.emit (events.js:198:13)"," at Duplexify.EventEmitter.emit (domain.js:448:20)"," at Duplexify._destroy (/var/task/node_modules/duplexify/index.js:199:8)"," at /var/task/node_modules/duplexify/index.js:182:10"," at /var/task/node_modules/async-listener/glue.js:188:31"," at process._tickCallback (internal/process/next_tick.js:61:11)"]}
2019-10-17T00:55:29.568Z 3bf23bda-e7fa-4fd7-b373-2258baff2bb8 ERROR Uncaught Exception {"errorType":"Error","errorMessage":"premature close","stack":["Error: premature close"," at Duplexify.onclose (/var/task/node_modules/end-of-stream/index.js:47:67)"," at Duplexify.emit (events.js:198:13)"," at Duplexify.EventEmitter.emit (domain.js:448:20)"," at Duplexify._destroy (/var/task/node_modules/duplexify/index.js:199:8)"," at /var/task/node_modules/duplexify/index.js:182:10"," at /var/task/node_modules/async-listener/glue.js:188:31"," at process._tickCallback (internal/process/next_tick.js:61:11)"]}
毫无疑问,这是我们代码中的一个bug。我不清楚这可能是什么,因为这些库不是我们的代码使用的库。事实上,这些似乎被AWS X射线所使用。那么,是不是X射线出现了故障,导致了一些调用失败
我试图理解:
- nodejs是否出现故障并正在重新启动
- 是否有一种方法可以捕获此进程终止,并至少将其视为失败的调用
- 简言之:这里发生了什么?它似乎与我们通常期望在lambda中看到的不匹配
以下是我们将要尝试的一些我们尝试过但没有帮助的事情:
- 升级了aws sdk和X射线软件包:无更改
- 我们已经添加了异常处理和日志记录,但没有学到任何新的东西,现在我们将继续这条路
更新:在“正常”情况下,包括记录了多个错误的情况下,我们会执行相同的操作。我们订阅一个物联网主题,发布一条消息,并等待长达5秒钟的响应。这些执行都没有在等待响应时超时(我们最多等待5秒,如果没有收到响应,则返回错误),并且Lambda执行都没有超时。在上述情况下(日志中的请求id a71447b0-19f8-456c-b163-47e0408bf3a1),我们不这样做,因为据我所知,我们的代码没有运行-没有日志表明它运行
这种情况并不经常发生。在过去的几天里,我看到大约每25人中就有1人被处决。这并没有看到太多的负载,所以我们只进行了大约190次调用(到目前为止有8次调用失败)。几个月后,我们回来报告这到底是什么,以及如何解决它 不明显的是(但事后看来,可能应该是这样的),其根源是在lambda中使用MQTT.js(作为AWS IOT SDK的一部分)。特别是当lambda未激活时,它有时会断开连接-这是合理的预期。这里发生的是,MQTT.js在断开连接时触发一个事件,该事件可能在不可预知的时间运行 它的长与短是我们需要处理
错误
和关闭
事件。如果它们没有被处理,那么我们有一个未处理的异常,正如我上面所描述的。解决这个问题非常简单-我们只需处理这些事件并创建一个新的客户端等
我认为我们应该比以前简单得多地解决这个问题——我们并不清楚它与MQTT有关(但一旦我们意识到这是一个问题,解决起来就相对比较快)
作为补充说明,可能值得指出的是,最新的AWS IoT SDK在底层并不使用MQTTjs。我不知道这样做的动机到底是什么,但我不知道这个问题/答案在未来会有多大用处。你使用的是哪个版本?NodeJs是v10.3如果你的回答是200,但没有定义,我们没有正确地从代码返回。据我所知,我们的代码甚至没有在这个调用上运行我知道。那么你的lambda函数里有什么?