2016-05-26 3 views
2

У меня возникла проблема, когда функции Lambda иногда выходят из системы без каких-либо сообщений об ошибках, кроме уведомления о том, что функция вышла из строя.DynamoDB, вызывающий тайм-аут Lambda

Чтобы найти корень проблемы, я добавил регистрацию в разных точках всей моей функции и определил, что все работает правильно до первого запроса getItem() для чтения данных из DynamoDB. Похоже, что чтение занимает больше 3,00 секундного таймаута.

Естественно, я проверил таблицу DynamoDB, чтобы увидеть, были ли какие-либо дросселируемые чтения или ошибки. Показатели DynamoDB не показывают никаких дросселей или ошибок, а время чтения остается в двухзначных миллисекундах максимум.

Ясно, что что-то идет не так или падает по пути. Как я могу исправить эту проблему или хотя бы поймать ее и повторить чтение?

Это ориентированная на чтение функция для веб-API, поэтому время отклика имеет решающее значение. Следовательно, увеличение тайм-аута не решит проблему.

dynamodb.getItem({ 
    "TableName": "tablename", 
    "Key": { "keyname": { "S": "keyvalue" } }, 
    "AttributesToGet": [ "attributeA", "attributeB" ] 
}, function(err, data) { 
    if(err){ 
    context.done(err); 
    } else { 
    if("Item" in data){ 
     nextFunction(event, context); 
    } else { 
     context.done("Invalid key"); 
    } 
    } 
}); 

No throttled reads

Read latency appears to be minimal

ответ

4

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

{ 
    "errorMessage": "write EPROTO", 
    "errorType": "NetworkingError", 
    "stackTrace": [ 
     "Object.exports._errnoException (util.js:870:11)", 
     "exports._exceptionWithHostPort (util.js:893:20)", 
     "WriteWrap.afterWrite (net.js:763:14)" 
    ] 
} 

Эта проблема, как представляется, вызваны проблемой между Node.js и OpenSSL согласно this thread. Похоже, проблема затрагивает Node.js 4.x и выше, но не 0.10. Это означает, что вы можете решить проблему, понизив время выполнения Lambda до Node.js 0,10 или добавив следующий код при использовании aws-sdk:

new AWS.DynamoDB({ 
    httpOptions: { 
    agent: new https.Agent({ 
     rejectUnauthorized: true, 
     secureProtocol: "TLSv1_method", 
     ciphers: "ALL" 
    }) 
    } 
}); 
Смежные вопросы