意外无限循环后的 AWS Lambda 令人担忧的行为

Hat*_*imi 5 amazon-web-services aws-lambda amazon-dynamodb-streams

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

public String getLocation() {
   return this.getLocation();
}
Run Code Online (Sandbox Code Playgroud)

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

在此处输入图片说明

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

感谢您的帮助。

Hat*_*imi 9

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

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

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