使用NodeJS从Lambda调用RDS MySQL时间歇性超时

使用NodeJS从Lambda调用RDS MySQL时间歇性超时,mysql,node.js,aws-lambda,amazon-rds,serverless-framework,Mysql,Node.js,Aws Lambda,Amazon Rds,Serverless Framework,我的web应用使用Lambda,使用NodeJS,后端是RDS(MySQL)。我正在使用无服务器mysql进行db调用 由于某些原因,db调用会间歇性超时。我尝试了以下方法: 启用流日志以查看是否存在任何错误(但找不到任何拒绝状态) 尝试公开数据库,并将lambda从VPC中删除(以查看是否存在VPC配置问题)。但是,它仍然断断续续地失败。所以VPC是不可能的 RDS没有任何异常峰值和连接耗尽,因为监控显示峰值仅为3个连接。兰姆达总是保持温暖。我尝试将超时时间增加到25秒。还是不走运 下面是我使

我的web应用使用Lambda,使用NodeJS,后端是RDS(MySQL)。我正在使用无服务器mysql进行db调用

由于某些原因,db调用会间歇性超时。我尝试了以下方法:

  • 启用流日志以查看是否存在任何错误(但找不到任何拒绝状态)
  • 尝试公开数据库,并将lambda从VPC中删除(以查看是否存在VPC配置问题)。但是,它仍然断断续续地失败。所以VPC是不可能的
  • RDS没有任何异常峰值和连接耗尽,因为监控显示峰值仅为3个连接。兰姆达总是保持温暖。我尝试将超时时间增加到25秒。还是不走运
  • 下面是我使用的代码:

    export async function get(event, context, callback) {
        if (await warmer(event)) return 'warmed';
    
        context.callbackWaitsForEmptyEventLoop = false;
    
        try {
            const userId = getUserIdFromIdentityId(event);
            const query = "select * from UserProfile where UserId = ?";
    
            const result = await mysql.query(query, [userId]);
            console.log(result);
    
            console.log('getting user account');
    
            mysql.quit();
    
            return success({
                profileSettings: result.length > 0 ? result[0] : null,
            });
    
        } catch(e) {
            console.log(e);
    
            return failure();
        }
    }
    
    Success函数基本上返回一个json对象,如下所示:

    return {
            statusCode: 200,
            headers: {
                "Access-Control-Allow-Origin": "*",
                "Access-Control-Allow-Credentials": true
            },
            body: JSON.stringify(body)
        };
    
    mysql初始化如下:

    export const mysql = AWSXray.captureMySQL(require('serverless-mysql')({
        config: {
            host: process.env.dbHost,
            user: process.env.dbUsername,
            password: process.env.dbPassword,
            database: process.env.database,
        }
    }));
    
    我在Cloudwatch日志中看到的唯一错误是:

    任务在10.01秒后超时


    您为lambda函数设置的超时是多少?(大概十秒钟)试着增加它;也许十秒钟并不总是足够长。我尝试将超时时间增加到25秒。但它仍然会断断续续地超时。这显然与网络有关。允许访问RDS的正确方法是在同一VPC中运行lambda并分配适当的安全组(即添加
    default
    SG)。您是如何在专有网络中配置lambda的?我不会考虑通过互联网访问RDS不止一个原因……是的,它们在同一个VPC中运行。我公开RDS只是为了测试是否是VPC配置问题。RDS具有默认的RDS启动向导安全组,并且具有允许lambda安全组的入站规则。