【发布时间】:2016-08-08 02:35:47
【问题描述】:
我不小心将一些 Java 代码部署到 AWS Lambda 中,其中包含以下明显有问题的 getter:
public String getLocation() {
return this.getLocation();
}
Lambda 函数配置了 15 秒和 320 Mo 的限制。它由 DynamoDB 流触发。部署有问题的代码后,我在 22 小时 17 左右修改了我的 DynamoDB 表,因此执行了代码。我检查了日志,正如您从前面的函数中所期望的那样,我遇到了一个经典的 StackOverflowError 和一个很长的堆栈跟踪。但是,令我惊讶的是,这并没有停止继续执行并报告更多堆栈溢出错误(CloudWatch 中的日志)的函数。当我意识到即使在 15 秒限制之后该功能也不会停止时,我更加担心。我找不到任何手动停止它的方法,所以我只是在 22h30 左右从 Lambda 控制台中删除了它,最终杀死了它。下图(来自 CloudWatch)显示了一段时间内的执行持续时间,您可以看到我在运行错误之前执行的几个测试(运行时间超过 10 秒),然后在 22h17 和 22h30 之间连续快速运行(大约 200ms)。
另外,我确信我没有触摸我的 DynamoDB 表(并且没有其他人可以访问它),也没有尝试以任何其他方式执行 Lambda 函数。它为什么一直执行几分钟,直到我删除它?我当然应该更加小心并先进行一些本地预测试,但是持续时间限制不是应该保证一旦达到就不会执行任何操作吗?
感谢您的帮助。
【问题讨论】:
-
任何一次调用运行时间超过 15 秒的证据在哪里?该图以毫秒为单位,因此 15 秒 = 15000。看起来它一直在运行,因为它一直被调用,而删除它会停止更多调用。
-
你是对的。问题不在于函数运行时间超过 15 秒,而是正如我在消息中所说,我无缘无故地观察到连续几次快速运行(DynamoDB 没有更新,因此流中应该没有任何内容,我没有尝试以其他方式执行函数)。
标签: amazon-web-services aws-lambda amazon-dynamodb-streams