lambda nodejs mysql任务超时

dgenwo3n  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(458)

我正在尝试学习如何使用aws中的lambda函数连接mysql。我在网上遵循了一些说明,基本上得到了以下代码:

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);
        });
      });
    };

这是在我的本地工作,但当我压缩这个代码并上传它作为一个lambda函数,这返回 Response: { "errorMessage": "2018-11-13T02:16:10.339Z 0562b432-e6ea-11e8-81ef-bd64aa1af0a4 Task timed out after 30.03 seconds" } 不管我设定多少秒它都会超时。
我几乎已经将所有内容都设置为默认值,因为我对所有这些都是新手,但是我已经将amazonrdsfullsaccess添加到lambda函数的角色中。
有人知道我的设置中有什么错误或遗漏吗?
谢谢。

6g8kf2rb

6g8kf2rb1#

在做了一些尝试和错误,我能够使它工作,我所缺少的是,我不允许 All TCP 在我的rds安全组的入站。之后,我将其设置为lambda函数 No VPC ,并且它能够正确地查询。
此链接:https://dzone.com/articles/querying-rds-mysql-db-with-nodejs-lambda-function 其中发布的堆栈溢出链接(即:aws lambda rds connection timeout)帮助我找出代码/设置的错误。
这是我最后使用的代码。

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);
        });
      });
    };

谢谢!

相关问题