在 AWS Lambda 上将 mysql2 与 Express 一起使用时出现 ETIMEDOUT

问题描述

我将 MysqL2 包与 Express 框架一起使用,部署在 AWS Lamda 上。我已将 Aws Lambda 的预配置并发设置为 3。

我没有直接连接到 MysqL。我中间有 RDS 代理。

随机收到以下错误

{
    "errorType": "Error","errorMessage": "connect ETIMEDOUT","code": "ETIMEDOUT","errorno": "ETIMEDOUT","syscall": "connect","fatal": true,"stack": [
        "Error: connect ETIMEDOUT","    at Connection._handleTimeoutError (/var/task/node_modules/MysqL2/lib/connection.js:178:17)","    at listOnTimeout (internal/timers.js:554:17)","    at processtimers (internal/timers.js:497:7)"
    ]
}

以下是我的代码

var AWS = require("aws-sdk");
const MysqL = require('MysqL2');

class DBConnection {

    constructor() {

        var signer = new AWS.RDS.Signer({
            region: 'us-east-1',hostname: process.env.DB_HOST,port: 3306,username: process.env.DB_USER
        });
        
        let connectionConfig = {
            host: process.env.DB_HOST,user: process.env.DB_USER,database: process.env.DB_NAME,ssl: 'Amazon RDS',authPlugins: { MysqL_clear_password: () => () => signer.getAuthToken() }
        };
        
        this.db = MysqL.createConnection(connectionConfig);

    }

    query = async (sql,values) => {

        return new Promise((resolve,reject) => {

            this.db.execute(sql,values,(error,result) => {

                if (error) {
                    reject(error);
                    return;
                }

                resolve(result);

            });

        });

    }
}

module.exports = new DBConnection().query;
const results = await query('SELECT COUNT(*) AS total_listens FROM analytics WHERE event_name="PLAYED"');

问题可能出在哪里的任何线索?

解决方法

对于 AWS Lambda function,最好使用 mysql.createPool 而不是 mysql.createconnection。我不知道具体原因是什么,但使用 mysql.createconnection 而不是 mysql.createPool 也给我带来了问题。当查询成功时,还需要 release 连接。