Я случайно развернул некоторый код Java в AWS Lambda, который содержит следующий явно глючный геттер:
public String getLocation() {
return this.getLocation();
}
Функция Lambda настроена с ограничением в 15 секунд и 320 месяцев. Она запускается потоком DynamoDB. После развертывания проблемного кода я изменил свою таблицу DynamoDB примерно в 22:17, поэтому выполнил код. Я проверил журналы и, как и следовало ожидать от предыдущей функции, у меня был классический StackOverflowError с очень длинной трассировкой стека. Однако я был удивлен, увидев, что это не остановило функцию, которая продолжала выполняться и сообщала о еще нескольких ошибках переполнения стека (журналы в CloudWatch). Еще больше я забеспокоился, когда понял, что функция просто не остановится даже после 15-секундного лимита. Я не мог найти способ остановить его вручную, поэтому я просто удалил его из консоли Lambda около 22:30, что, наконец, убило его. На следующем графике (из CloudWatch) показана продолжительность выполнения с течением времени, и вы можете увидеть несколько тестов, которые я выполнил перед запуском ошибки (запуски более 10 с), а затем последовательные быстрые запуски (около 200 мс) между 22:17 и 22:30.
Кроме того, я уверен, что не трогал свою таблицу DynamoDB (и никто другой не имеет к ней доступа) и не пытался выполнить функцию Lambda каким-либо другим способом. Почему он продолжал выполняться в течение нескольких минут, пока я его не удалил? Я, конечно, должен был быть более осторожным и сначала выполнить локальное предварительное тестирование, но разве ограничение продолжительности не должно гарантировать, что после достижения ничего не будет выполнено?
Спасибо за помощь.