我意外地将一些Java代码部署到AWS Lambda中,其中包含以下明显错误的getter:
public String getLocation() {
return this.getLocation();
}
Lambda函数的配置限制为15秒和320 Mo.它由DynamoDB流触发。部署有问题的代码后,我在22h17左右修改了DynamoDB表,从而执行了代码。我查看了日志,正如您对前一个函数所期望的那样,我有一个经典的StackOverflowError,它有很长的堆栈跟踪。但是,我很惊讶地发现这并没有停止执行和报告更多堆栈溢出错误的功能(登录CloudWatch)。当我意识到即使在15秒限制之后该功能也不会停止时我更加担心。我找不到任何方法来手动停止它,所以我只是在22点30分左右从Lambda控制台中将其删除,最后将其删除。下图(来自CloudWatch)显示了一段时间内的执行持续时间,您可以看到我在运行错误之前执行的几项测试(运行超过10秒),然后在22h17和22h30之间连续快速运行(大约200ms)。
此外,我确信我没有触及我的DynamoDB表(并且没有其他人可以访问它),也没有尝试以任何其他方式执行Lambda函数。为什么它会一直执行几分钟,直到我删除它?我当然应该更加小心并首先进行一些本地预先测试,但是不是时间限制应该保证一旦达到就不会执行任何操作吗?
感谢您的帮助。
答案 0 :(得分:4)
我终于找到了这种行为的起源。在AWS Lambda official documentation中有人说:
根据事件源,AWS Lambda可能会重试失败的Lambda 功能。例如,如果Amazon Kinesis是其中的事件源 Lambda函数,AWS Lambda重试失败的函数,直到 Lambda函数成功或流中的记录到期。
DynamoDB流的到期延迟为24小时,因此到那时我的功能才会停止。