Тревожное поведение AWS Lambda после случайного бесконечного цикла

Я случайно развернул некоторый код 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 каким-либо другим способом. Почему он продолжал выполняться в течение нескольких минут, пока я его не удалил? Я, конечно, должен был быть более осторожным и сначала выполнить локальное предварительное тестирование, но разве ограничение продолжительности не должно гарантировать, что после достижения ничего не будет выполнено?

Спасибо за помощь.


person Hatim Khouzaimi    schedule 16.04.2016    source источник
comment
Где доказательства того, что он работал дольше 15 секунд для любого вызова? График представлен в миллисекундах, поэтому 15 секунд = 15000. Похоже, что он продолжал работать, потому что он продолжал вызываться, и его удаление остановило больше вызовов.   -  person Michael - sqlbot    schedule 16.04.2016
comment
Ты прав. Проблема не в том, что функция работала более 15 секунд, а как я сказал в сообщении, я наблюдал несколько последовательных быстрых запусков без причины (DynamoDB не обновлялась, поэтому в потоке ничего не должно приходить, и я не пытался выполнить функцию другим способом).   -  person Hatim Khouzaimi    schedule 16.04.2016


Ответы (1)


Я, наконец, понял происхождение этого поведения. В официальной документации AWS Lambda говорится, что:

В зависимости от источника события AWS Lambda может повторить неудачную попытку функции Lambda. Например, если Amazon Kinesis является источником событий для функции Lambda, AWS Lambda повторяет неудачную попытку функции до тех пор, пока функция Lambda не завершится успешно или пока не истечет срок действия записей в потоке.

Потоки DynamoDB имеют задержку истечения в 24 часа, поэтому моя функция остановилась бы только к этому времени.

person Hatim Khouzaimi    schedule 16.04.2016