2016-05-14 2 views
24

У меня есть простая функция лямбда, которая асинхронно выполняет вызовы API, а затем возвращает данные. 99% времени это отлично работает. Когда API когда-либо занимает больше времени, а затем ждал лямбда-тайм-аут, он дает ошибку, как ожидалось. Теперь проблема заключается в том, что когда я делаю последующие вызовы функции лямбда, она навсегда дает мне ошибку тайм-аута.Функция AWS лямбда перестает работать после ошибки времени ожидания

"errorMessage": "2016-05-14T22:52:07.247Z {session} Task timed out after 3.00 seconds" 

Для того чтобы проверить, что это было в случае я установить тайм-аут лямбда до 3 секунд, и есть способ, чтобы вызвать эти две функции в пределах лямбда.

Javascript

function now() { 
    return response.tell('success'); 
} 

function wait() { 
    setTimeout(function() { return response.tell('success'); }, 4000); 
} 

Когда я вызываю функцию now нет никаких проблем. Когда я вызываю функцию wait, я получаю ошибку таймаута, а затем любые последующие вызовы now дают мне ту же ошибку.

Является ли это ожидаемым поведением? Я думаю, что любые последующие вызовы лямбда-функции должны работать. Я понимаю, что всегда могу увеличить таймаут конфигурации, но скорее не буду.

+0

Вы записываете журнал? ничего в cloudwatch –

+0

Это ошибкаMessage, которую я опубликовал выше и снова. – jjbskir

+0

Я играю с той же проблемой. Я помещаю console.log в FIRST LINE моего файла обработчика индекса, прежде чем я импортирую библиотеку. Этот console.log попадает на последующие таймауты, но после него нет журналов! Он останавливается при импорте. Я не знаю, что делает AWS, но по какой-то причине он не может загружать внешние библиотеки (или занимает время LONG). – duhseekoh

ответ

7

хорошо, если вы определили 3 секунды в своей конфигурации функций, этот тайм-аут переопределит время внутри вашего кода, поэтому обязательно увеличьте время ожидания из конфигураций лямбда-функции и повторите попытку wait(), и он должен работать!

+0

Я не спрашиваю, почему моя функция отключается. Я спрашиваю, почему все последующие таймауты функций, даже если они не должны. – jjbskir

+0

Я не могу рассказать вам, как базовый интерпретатор node.js работает в Lambda, но если вы платите за секунды, не имеет смысла оптимизировать интерпретатор, чтобы делать ожидания или спать, это может быть причиной. Но это просто предположение .. спросите ребят о поддержке AWS и, возможно, они дадут вам больше информации. –

9

Вы должны искать, как ваша функция обрабатывать работы с конкретным context.callbackWaitsForEmptyEventLoop

Если булева типа является false, то SetTimeout не будет когда-либо уволен, потому что вы могли бы вы ответили/обрабатывается лямбда-призыв раньше. Но если значение callbackWaitsForEmptyEventLoop равно true - тогда ваш код будет делать то, что вы ищете.

Кроме того - это, вероятно, легче обрабатывать все с помощью обратных вызовов непосредственно, без необходимости «рукописных» тайм-ауты, изменение конфигурации таймаута и так далее ...

Э.Г.

function doneFactory(cb) { // closure factory returning a callback function which knows about res (response) 
    return function(err, res) { 
    if (err) { 
     return cb(JSON.stringify(err)); 
    } 
    return cb(null, res); 
    }; 
} 

// you're going to call this Lambda function from your code 
exports.handle = function(event, context, handleCallback) { 

    // allows for using callbacks as finish/error-handlers 
    context.callbackWaitsForEmptyEventLoop = false; 

    doSomeAsyncWork(event, context, doneFactory(handleCallback)); 
}; 
+0

вы сэр - это жизненный аромат! –

2

В консоли AWS Amazon конфига вы должны изменить таймаут по умолчанию от 3 секунд до более (5 мин макс)

+0

Это не очень хороший подход, так как тайм-аут также может произойти, если вы просто поднимете лямбду до 300 секунд. – lin

3

Я столкнулся с той же проблемой, на самом деле есть много случаев, когда Lambda перестает отвечать на запросы, например:

  1. Синтаксический не действительный JSON:

    exports.handler = function(event, context, callback) 
    { 
        var nonValidJson = "Not even Json"; 
        var jsonParse = JSON.parse(nonValidJson); 
    
  2. Доступ свойство неопределенной переменной:

    exports.handler = function(event, context, callback) 
    { 
        var emptyObject = {}; 
        var value = emptyObject.Item.Key; 
    
  3. Не закрывая соединение MYSQL после получения доступа к RDS приводит к Lambda тайм-аут, а затем он становится не реагирует.

Когда я говорю, что не отвечает, буквально даже не загружается, т. Е.первая печать внутри обработчика не печатается, и лямбда-только выходит каждый прогон с тайм-аут:

exports.handler = function(event, context, callback) 
{ 
    console.log("Hello there"); 

Это ошибка, известная команда AWS почти год:
https://forums.aws.amazon.com/thread.jspa?threadID=238434&tstart=0

К сожалению, до сих пор не зафиксировано , после некоторых тестов выяснилось, что на самом деле Lambda пытается перезагрузить (перезагрузить контейнер?), просто не хватает времени. Если вы установите тайм-аут на 10 секунд, то после ~ 4 секунд выполнения Lambda начнет работать, а затем в следующих прогонах будет вести себя нормально. Я также пробовал играть с настройкой:

context.callbackWaitsForEmptyEventLoop = false; 

и помещение всех блоков «требуется» внутри обработчика, ничего действительно не работало. Единственный способ предотвратить мертвую лямбду - установить более высокий тайм-аут, 10 секунд должно быть более чем достаточно, как обходная защита от этой ошибки.

+0

Я столкнулся с тремя вторыми ошибками таймаута, когда у меня были мои запросы в теле 'export.handler', а не на верхнем уровне моего скрипта. – worsnupd

0

Мне просто пришлось увеличить таймаут, и ошибка утихла. Я увеличил его до 5 секунд. Это было хорошо для меня, потому что я не собирался использовать эту Лямбду в производстве.

Смежные вопросы