【问题标题】:AWS Lambda timeout when calling AWS service after MySQL query using Serverless使用无服务器查询 MySQL 后调用 AWS 服务时 AWS Lambda 超时
【发布时间】:2020-05-05 19:49:22
【问题描述】:

我正在处理一些处理给定事件、查询 MySQL 数据库然后将格式化对象上传到 DynamoDB 的业务代码。代码如下所示:

var mysql = require('mysql');
var AWS = require('aws-sdk');
var dynamodb = new AWS.DynamoDB({ apiVersion: '2012-08-10' });

var pool = mysql.createPool({
  host: process.env.DB_HOST,
  user: process.env.DB_USER,
  password: process.env.DB_PASSWORD,
  database: process.env.DB_DATABASE
});

module.exports.handle = (event, context, callback) => {
  context.callbackWaitsForEmptyEventLoop = false;
  console.time("query");

  // more code

  pool.getConnection(function (err, connection) {
    if (err) callback(Error(`could not get a pool connection: ${err}`));

    connection.query(query, (err, res, fields) => {
      connection.release();
      if (err) {
        callback(Error(`could not execute query: ${err}`));
      } else {
        console.timeEnd("query");
        console.time("parsing");

        // more code

        let inputItem = {
          Item: item,
          TableName: "some_table"
        }

        console.timeEnd("parsing");
        console.time("putItem");

        // here it hangs... no err, no data

        dynamodb.putItem(inputItem, function (err, data) {
          if (err) callback(Error(`could not putItem: ${err}`))
          console.timeEnd("putItem");
          callback(null, JSON.stringify({
            message: "OK"
          }));
        });

      }
    });
  });
}

我使用无服务器来捆绑此代码并将其部署到 AWS。 当我使用 sls invoke local 在本地执行 lambda 时,它可以工作,但是当我尝试运行已部署的(从 sls 或 AWS 控制台)时,我每次都会超时。

这真的很奇怪,因为如果我删除 MySQL 代码,它就可以工作,即将项目放入 DynamoDB。事实上,原始代码是一个 Go lambda。使用该代码,我在调用一项 AWS 服务时遇到了完全相同的错误:没问题,在调用 MySQL 和 AWS 服务时,挂起……尝试了所有不同版本的 Go、AWS-SDK 包等……决定将其迁移到 Node,认为这是一个 Go 问题。我真的不知道发生了什么......

就角色和权限而言,它们是可以的,正如我所说,如果我只在 Lambda 执行期间调用 AWS 服务,代码就可以工作。

有什么想法可能是错的,或者我只是一个白痴错过了什么?

我想唯一的解决方案是链接 Lambdas...

【问题讨论】:

  • 您的 MySQL 服务器在哪里运行?是RDS吗?最终听起来好像是防火墙类型的问题阻止了 Lambda 连接到 MySQL。
  • 不,我连接到 SQL 没有问题。数据库位于 VPC 内的 RDS 中。 lambda 有它的 sec 组和所有,所以它可以连接到它。
  • “在 Lambda 执行期间调用 AWS 服务”是什么意思?如何在 Lambda 执行之外调用它?
  • 例如,我的意思是调用 DynamoDB 或 Eventbridge。

标签: mysql amazon-web-services aws-lambda amazon-dynamodb serverless


【解决方案1】:

我做了一些研究,发现这与 VPC 的配置方式有关。我发现 Lambda 无法从 VPC 内访问互联网,因此您需要:

  1. 配置数据库代理(不推荐用于生产,因为它处于 beta 预览阶段)并通过此连接到数据库。
  2. 配置 VPC 以访问互联网。

来源:

【讨论】:

    猜你喜欢
    • 2019-01-21
    • 2018-08-06
    • 2017-07-28
    • 2020-08-25
    • 2019-02-24
    • 2020-10-20
    • 1970-01-01
    • 2017-09-20
    • 2019-11-06
    相关资源
    最近更新 更多