DynamoDB вызывает лямбда-тайм-аут


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

Чтобы найти корень проблемы, я добавил ведение журнала в различных точках по всей моей функции и определил, что все функционирует правильно до первого запроса 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");
    }
  }
});

Не душиться читает

Задержка чтения кажется минимальной

1 4

1 ответ:

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

{
    "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)"
    ]
}

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

new AWS.DynamoDB({
  httpOptions: {
    agent: new https.Agent({
      rejectUnauthorized: true,
      secureProtocol: "TLSv1_method",
      ciphers: "ALL"
    })
  }
});