首页 > 解决方案 > 在 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"');

任何线索可能是问题所在?

标签: node.jsaws-lambdamysql2

解决方案


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


推荐阅读