AWS Lambda / Nodejs не выполняет соединение с mysql.запрос

#mysql #node.js #amazon-web-services #aws-lambda

#mysql #node.js #amazon-веб-сервисы #aws-lambda

Вопрос:

У меня есть простая лямбда-функция для подключения к MYSQL, но connection.query она не выполняется. У Lambda есть AWSLambdaVPCAccessExecutionRole доступ, и он является частью того же VPC, где развернута RDS.

В конфигурацию Lambda добавлена группа безопасности RDS. log1 — это результат, который я всегда получаю. Однажды я получил Log2. Я не уверен, что происходит.

     var mysql      = require('mysql');
    var connection = mysql.createConnection({
      host     : 'xxxxxxxx.us-east-1.rds.amazonaws.com',
      user     : 'admin',
      password : 'pass',
      database : 'dbname'
    });
    console.log('CONNECTION '   connection);
    connection.connect();
    console.log('2 ');  
    exports.handler = async (event,context,callback) => {
      console.log('3 ');
      context.callbackWaitsForEmptyEventLoop = false;
        connection.query('SELECT emp_num from tag where emp_id=1', function (error, results, fields) {
          console.log('2 ');
          if (error) throw error;
          else
            callback(null, results)
          //console.log('The solution is: ', results[0].tag_num);
        });
        connection.end();
    };
  

Log1

НАЧАЛЬНЫЙ ЗАПРОС: 04c2d758-ac40-474f-ac55-045ccea8a9ff Версия: $ПОСЛЕДНЯЯ 2020-11-08T02: 02:58.976Z 04c2d758-ac40-474f-ac55-045ccea8a9ff ИНФОРМАЦИЯ 3 КОНЕЧНЫЙ ЗАПРОС: 04c2d758-ac40-474f-ac55-045ccea8a9ff ИДЕНТИФИКАТОР ЗАПРОСА ОТЧЕТА: 04c2d758-ac40-474f-ac55-045ccea8a9ff Продолжительность: 5,75 мс Время выставления счета: 100 мс Размер памяти: 128 МБ Максимальная используемая память: 20 МБ

Log2

START RequestID: abeb6a6d-7480-4acc-91e2-5971e6fe74fe Версия: $ПОСЛЕДНЯЯ 2020-11-08T02:02:43.293Z abeb6a6d-7480-4acc-91e2-5971e6fe74fe ИНФОРМАЦИЯ 3 2020-11-08T02:02:43.294Z abeb6a6d-7480-4acc-91e2- 5971e6fe74fe ИНФОРМАЦИЯ 2 2020-11-08T02:02:43.294Z abeb6a6d-7480-4acc-91e2-5971e6fe74fe ОШИБКА Неперехваченное исключение {«ErrorType»:»Ошибка», «ErrorMessage»:»Не удается поставить запрос в очередь после вызова quit.»,»code»: «PROTOCOL_ENQUEUE_AFTER_QUIT»,»fatal»: false, «stack»: [«Ошибка: невозможнозапрос в очередь после вызова quit.»,» в Protocol._validateEnqueue (/var/task/node_modules/mysql/lib/protocol/Protocol.js:215:16)», «
в Protocol._enqueue (/var/task/node_modules/mysql/lib/protocol/Protocol.js :138:13)»,»
при подключении.запрос (/var/task/node_modules/mysql/lib/Connection.js:198:25)»,» во время выполнения.exports.handler (/var/task/index.js:18:16)»,» во время выполнения.handleOnce (/var/runtime/Runtime.js:66:25)»]} [ОШИБКА] [1604800963301] LAMBDA_RUNTIME не удалось отправить ответ об успешном завершении обработки. Код ответа Http: 403. ИДЕНТИФИКАТОР КОНЕЧНОГО запроса: abeb6a6d-7480-4acc-91e2-5971e6fe74fe ИДЕНТИФИКАТОР ЗАПРОСА ОТЧЕТА: abeb6a6d-7480-4acc-91e2-5971e6fe74fe Длительность: 29.Продолжительность счета 47 мс: 100 мс Размер памяти: 128 МБ Максимальная используемая память: 20
МБ Идентификатор запроса: abeb6a6d-7480-4acc-91e2-5971e6fe74fe Ошибка: время выполнения завершено с ошибкой: статус выхода 129 Время выполнения.Ошибка выхода

Ответ №1:

Ваш дескриптор определен async как, и вы не await выполнили обещание. Возможные решения:

  1. Добавьте ожидающий вызов к вашему обещанию (т.е. await connection.query(...).promise() )
  2. Измените подпись обработчика на неасинхронную (т. Е. exports.handler = (event,context,callback) => {...} ), а затем он будет ожидать обратного вызова.
  3. (Некрасивый обходной путь) Add context.callbackWaitsForEmptyEventLoop = true; , который сообщает AWS дождаться пустого цикла событий.

Раскрытие информации: я работаю в Lumigo, компании, которая помогает вам отлаживать бессерверные приложения.