#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
выполнили обещание. Возможные решения:
- Добавьте ожидающий вызов к вашему обещанию (т.е.
await connection.query(...).promise()
) - Измените подпись обработчика на неасинхронную (т. Е.
exports.handler = (event,context,callback) => {...}
), а затем он будет ожидать обратного вызова. - (Некрасивый обходной путь) Add
context.callbackWaitsForEmptyEventLoop = true;
, который сообщает AWS дождаться пустого цикла событий.
Раскрытие информации: я работаю в Lumigo, компании, которая помогает вам отлаживать бессерверные приложения.