首页 > 解决方案 > 无服务器: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,它也是同样的问题。

标签: node.jssequelize.jsserverless

解决方案


推荐阅读