5

我不小心将一些 Java 代码部署到 AWS Lambda 中,其中包含以下明显有问题的 getter:

public String getLocation() {
   return this.getLocation();
}

Lambda 函数配置了 15 秒和 320 Mo 的限制。它由 DynamoDB 流触发。部署有问题的代码后,我在 22 小时 17 左右修改了我的 DynamoDB 表,因此执行了代码。我检查了日志,正如您从前面的函数中所期望的那样,我遇到了一个经典的 StackOverflowError 和一个很长的堆栈跟踪。但是,令我惊讶的是,这并没有停止继续执行并报告更多堆栈溢出错误(CloudWatch 中的日志)的函数。当我意识到即使在 15 秒限制之后该功能也不会停止时,我更加担心。我找不到任何手动停止它的方法,所以我只是在 22h30 左右从 Lambda 控制台中删除了它,最终杀死了它。

在此处输入图像描述

此外,我确信我没有触摸我的 DynamoDB 表(也没有其他人可以访问它),也没有尝试以任何其他方式执行 Lambda 函数。它为什么一直执行几分钟,直到我删除它?我当然应该更加小心并首先进行一些本地预测试,但是持续时间限制不是应该保证一旦达到就不会执行任何事情吗?

谢谢您的帮助。

4

1 回答 1

9

我终于弄清楚了这种行为的起源。在AWS Lambda 官方文档中说:

根据事件源,AWS Lambda 可能会重试失败的 Lambda 函数。例如,如果 Amazon Kinesis 是 Lambda 函数的事件源,AWS Lambda 会重试失败的函数,直到 Lambda 函数成功或流中的记录过期。

DynamoDB 流有 24 小时的过期延迟,所以我的功能到那时才会停止。

于 2016-04-16T17:23:11.763 回答