node.js - 无服务器:Lambda 仅在控制台/ Lambda 间歇性行为发生更改后才开始工作
问题描述
我正在使用无服务器框架进行 lambda 部署,我正面临这个非常奇怪的问题。我使用 Sequelize 连接到 RDS Aurora MySql DB。部署成功,但是当我调用 API 时,我看到SequelizeConnectionError: Connect ETIMEDOUT
. 当我离线运行时,API 工作正常。但是部署的 API 不起作用。一旦我在控制台上进行任何小的更改并保存它,它们就会开始工作,例如将时间从 30 更改为 31。但是当我重新部署时,我遇到了同样的问题,我就是不知道问题是什么。
错误:
SequelizeConnectionError: connect ETIMEDOUT
编辑:
是的。这是启用了数据 API 的 Aurora 无服务器。lambda 函数在数据库所在的同一 VPC 中运行。安全组和子网也相同。这是我的数据库配置片段:
DB_PORT: 3306
DB_POOL_MAX: 10
DB_POOL_MIN: 2
DB_POOL_ACQUIRE: 30000
DB_POOL_IDLE: 10000
这是我的 db.js:
const sequelize = new Sequelize(process.env.DB_NAME, process.env.DB_USER, process.env.DB_PASSWORD, {
host: process.env.DB_HOST,
port: process.env.DB_PORT,
dialect: 'mysql',
pool: {
max: process.env.DB_POOL_MAX,
min: process.env.DB_POOL_MIN,
acquire: process.env.DB_POOL_ACQUIRE,
idle: process.env.DB_POOL_IDLE
}
});
我的处理程序文件非常长,包含超过 33 个 API。以下是其中之一:
context.callbackWaitsForEmptyEventLoop = false;
if (event.source === 'serverless-plugin-warmup') {
try {
const { Datalogger } = await connectToDatabase();
} catch (err) { }
return {
statusCode: 200,
headers: { 'Access-Control-Allow-Origin': '*' },
body: 'warm-up'
}
}
try {
const { Datalogger } = await connectToDatabase();
var datalogger;
if (!event.headers.dsn && !event.headers.sftp)
throw new HTTPError(404, `Datalogger serial number and SFTP root directory is mandatory`);
datalogger = await Datalogger.findOne({
where: {
dsn: event.headers.dsn,
sftpRootDir: event.headers.sftp,
}
})
if (!datalogger)
throw new HTTPError(404, `Datalogger with this input was not found`);
console.log('datalogger', datalogger);
await datalogger.destroy();
return {
statusCode: 200,
headers: { 'Access-Control-Allow-Origin': '*' },
body: JSON.stringify(datalogger)
}
} catch (err) {
console.log('Error in destroy: ', JSON.stringify(err));
return {
statusCode: err.statusCode || 500,
headers: { 'Content-Type': 'text/plain', 'Access-Control-Allow-Origin': '*' },
body: err.message || 'Could not destroy the datalogger.'
}
}
我就这个问题联系了 AWS 支持,他们怀疑该错误是由于节点 js 版本升级而发生的。我以前使用的是 8,它正在工作。升级到 10 后会导致间歇性超时。很少有调用成功,然后有一个失败。现在即使我回到版本 8,它也是同样的问题。
解决方案
推荐阅读
- c++ - 为什么在我的代码中私有数据成员不可访问?
- mysql - 如何在 MySQL 查询和 Python 中使用 WHERE & AND
- javascript - 当使用 minDate 和/或 maxDate 启用 showYearDropdown 时,如何防止出现或选择超出范围的年份
- html - Angular Material:在不指定宽度的情况下将自定义 sidenav 从长格式转换为图标
- javascript - 从对象数组中的每个对象中删除对象
- django - Django 视图不返回 HttpResponse 对象
- c++ - 从浮点指针填充向量的更快方法是什么?
- kotlin - Android Kotlin MP Android 添加Entry功能
- r - 顺序错误(desc(var),by_group = TRUE):参数长度不同?
- python - 如何在 VScode 中运行单独的 pytests 文件夹