Тайм-аут задачи для Lambda NodeJS MySQL - PullRequest
0 голосов
/ 13 ноября 2018

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



    var mysql = require('mysql');
    var pool  = mysql.createPool({
        connectionLimit : 1000,
        connectTimeout  : 60 * 60 * 1000,
        acquireTimeout  : 60 * 60 * 1000,
        timeout         : 60 * 60 * 1000,
        host: "foo-bar-123.us-east-2.rds.amazonaws.com",
        user: "root",
        password: "pass123",
        database: "sample_db",
    });

    exports.handler =  (event, context, callback) => {
      // prevent timeout from waiting event loop
      context.callbackWaitsForEmptyEventLoop = false;

      pool.getConnection(function(err, connection) {
        if (err) throw err;

        // Use the connection
        connection.query('SELECT id FROM customer limit 10;', function (error, results, fields) {
          // And done with the connection.
          connection.release();
          // Handle error after the release.
          if (error) callback(error);
          else callback(null,results);
        });
      });
    };

Это работает на моем локальном компьютере, но когда я заархивировал этот код и загрузил его как лямбда-функцию, это возвращает

Response: { "errorMessage": "2018-11-13T02:16:10.339Z 0562b432-e6ea-11e8-81ef-bd64aa1af0a4 Task timed out after 30.03 seconds" }

Время ожидания вне зависимости от того, сколько секунд я установил его.

Я установил все по умолчанию, так как я новичок во всех из них, но у меня естьдобавил AmazonRDSFullAccess к роли лямбда-функции.

Кто-нибудь знает, что может быть не так или отсутствует в моей настройке?

Спасибо.

1 Ответ

0 голосов
/ 20 ноября 2018

После некоторых проб и ошибок я смог заставить его работать, и мне не хватало только того, что я не разрешил All TCP во входящей группе RDS Security. После этого я установил в качестве своей лямбда-функции значение No VPC, и он смог правильно выполнить запрос.

Эта ссылка: https://dzone.com/articles/querying-rds-mysql-db-with-nodejs-lambda-function и ссылка на переполнение стека, размещенная там (а именно: Тайм-аут соединения AWS Lambda RDS ), очень помогла мне выяснить, что не так с моим кодом /setup.

Вот последний код, который я использовал в итоге.



    const mysql = require('mysql');
    const pool  = mysql.createPool({
        host: "foo-bar-123.us-east-2.rds.amazonaws.com",
        user: "root",
        password: "pass123",
        database: "sample_db"
    });

    exports.handler = (event, context, callback) => {
      //prevent timeout from waiting event loop
      context.callbackWaitsForEmptyEventLoop = false;

      pool.getConnection((err, connection) => {
        if(err) throw err;

        // Use the connection
        connection.query('SELECT id FROM customer limit 10;', (error, results, fields) => {

          // And done with the connection.
          connection.release();

          // Handle error after the release.
          if (error) callback(error);
          else callback(null,results);
        });
      });
    };

Спасибо!

...