使用NodeJS从Lambda调用RDS MySQL时间歇性超时
我的web应用使用Lambda,使用NodeJS,后端是RDS(MySQL)。我正在使用无服务器mysql进行db调用 由于某些原因,db调用会间歇性超时。我尝试了以下方法:使用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秒。还是不走运 下面是我使
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安全组的入站规则。