3

я случайно развернутом некоторых Java-кода в AWS Lambda, который содержит следующий очевидно ошибочный геттер:АМС Лямбда вызывают тревогу поведения после случайного бесконечного цикла

public String getLocation() { 
    return this.getLocation(); 
} 

Функция Лямбды выполнена с пределом 15 секунд и 320 Mo .Это инициируется потоком DynamoDB. После развертывания проблемного кода я изменил таблицу DynamoDB примерно на 22h17 и, следовательно, выполнил код. Я проверил журналы, и, как вы можете ожидать от предыдущей функции, у меня был классический StackOverflowError с очень длинной трассировкой стека. Однако я был удивлен, увидев, что это не остановило функцию, которая продолжала выполнять и сообщать о нескольких ошибках переполнения стека (журналы в CloudWatch). Я был еще больше обеспокоен, когда понял, что функция просто не остановится даже после 15-секундных ограничений. Я не мог найти способ вручную остановить его, поэтому я просто удалил его с консоли Lambda около 22h30, который наконец-то убил его. Следующий график (от CloudWatch) показывает продолжительность выполнения с течением времени, и вы можете увидеть несколько тестов, которые я выполнил перед запуском ошибки (работает более 10 секунд), а затем последовательные быстрые прогоны (около 200 мс) между 22 ч. 17 м. И 22 ч. 30 м.

enter image description here

Кроме того, я уверен, что я не трогайте мою DynamoDB таблицу (и никто другой не имеет доступа к нему) и не пытались выполнить функцию лямбда-либо другим способом. Как он продолжал выполняться в течение нескольких минут, пока я не удалю его? Я, конечно, должен был быть более осторожным и сначала выполнять местные предварительные испытания, но не является ли ограничение продолжительности, чтобы гарантировать, что ничто не будет выполнено после достижения?

Благодарим за помощь.

+1

Где доказательства того, что для любого вызова было выполнено более 15 секунд? График находится в миллисекундах, поэтому 15 секунд = 15000. Похоже, что он продолжал работать, потому что он продолжал вызываться, и удаление этого прекратило больше вызовов. –

+0

Вы правы. Проблема заключается не в том, что функция работала более 15 секунд, но, как я сказал в сообщении, я наблюдал несколько последовательных быстрых прогонов без причины (DynamoDB не обновлялся, поэтому в поток не приходило ничего, и я не пытался для выполнения функции каким-либо другим способом). –

ответ

3

Я, наконец, выяснил происхождение этого поведения. В AWS Lambda official documentation говорится, что:

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

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