AWS lambda 执行仅在我第一次 运行 时失败 'customer function error'

AWS lambda execution fails only first time I run it with 'customer function error'

我通过 API 网关触发了一个 lambda 函数,一切正常,只有一个例外,即我在给定日期第一次触发它时失败了。

奇怪的是,lambda 函数日志没有显示任何错误。我得到了我通常的 START 日志语句,然后是触发器的请求和上下文,然后在 5 秒后,它意外结束。

当我查看 API 网关日志时,这是错误 returns:

Lambda execution failed with status 200 due to customer function error: 2018-12-10T11:00:31.208Z cc233168-fc9n-11fc-a05a-577bb4sd2b2ccc Task timed out after 5.01 seconds.

有没有人遇到过类似的问题?什么是客户功能错误,我该如何解决?

在不了解您正在使用的大部分后台代码的情况下,我将其称为冷启动。冷启动发生在您的函数很长时间未被调用的第一个请求中。如果您注意到错误消息显示“5.01 秒后超时。这是默认设置。您可以增加超时时间。

或者,您可以考虑通过缩短冷启动时间来减少冷启动的影响 reference :

  1. 通过使用不会产生高冷启动时间的语言编写您的 Lambda 函数 —— 即 Node.js、Python 或 Go
  2. 为处理用户请求的关键路径上的函数选择更高的内存设置(即用户必须等待响应的任何内容,包括中间 APIs)
  3. 优化函数的依赖关系和包大小

您还可以通过在每个特定时间间隔后通过 Cloud Watch 放置一个 cron 作业来进行探索,以通过 PING

调用您的 API

添加到 Yash 的回答:

我只在 API 网关 执行 日志中看到 Lambda execution failed with status 200,但万一它可以以其他方式显示:确保为端点启用了执行日志记录。如果您尚未启用它,则需要等待问题再次出现。

您可以通过以下方式验证它是冷启动问题:

  • 在有错误的日志条目中获取事件的 @logStream 值和时间戳;它将是一长串字母数字,例如 a4f8115980dc83a511eeedc493a78741
  • 打开该端点的执行日志的日志组 -> 找到具有您刚刚抓取的标识符的日志流
  • 将 date/time 范围缩小到事件发生时间附近的 window
  • 如果您选择了一个窄 window 并且它是一个冷启动问题:我希望有问题的请求是列表中的第一个。单击列表顶部的 There are older events to load. Load more.
  • 您现在应该看到收到的最后一个请求和违规请求之间的时间间隔。

在我的例子中,错误显示 connection reset by peer 这让我认为它的行为就像一个虚拟机被置于睡眠状态然后在它相信它之前打开的 TCP 连接仍然有效的意义上被唤醒。

短期内,我们将采用的解决方案是实施重试策略。


除了 cold-start 问题之外,此问题还有另一个潜在方面:您的 API 网关访问日志格式。

执行以下操作:

  • 执行 access 中找到与违规请求相对应的日志条目日志.
  • HTTP状态是否== 502?

502s in the API Gateway access log 通常(总是?)表示 Lambda 响应格式错误 JSON.

它返回格式错误的最明显原因 JSON 是您的代码中的错误。不太明显的原因之一:访问日志格式错误。

如果您怀疑是这种情况,请查找以下内容:

  • 不应该被引用的字段;例如 $context.error.messageString
  • Un-quoted 字段应该是。一个常见的习惯用法是保留数字字段 un-quoted,因为它使 insights 查询像这样工作:| filter @status >= 500。如此方便,如果不能保证该字段产生数字结果,那么 JSON 响应将是格式错误的。
  • {} 主体中的尾随逗号

Here's the documentation 对于许多上下文变量,但要记住一件事:可用的上下文变量在不同 API 网关端点类型(lambda、websocket 等)之间有所不同).