使用无服务器的MySQL查询后调用AWS服务时AWS Lambda超时

时间:2020-05-05 19:49:22

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

我正在处理一些处理给定事件的业务代码,查询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"
          }));
        });

      }
    });
  });
}

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

这真的很奇怪,因为如果我删除MySQL代码,它将起作用,即,它将项目放入DynamoDB。实际上,原始代码是Go lambda。使用该代码,在调用一个AWS服务时出现完全相同的错误:没问题,在调用MySQL然后再调用AWS服务时挂起...尝试了所有不同版本的Go,AWS-SDK软件包等...决定认为这是一个Go问题,将其迁移到Node。我真的不知道怎么回事...

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

关于可能出什么问题的任何想法,或者如果我只是一个缺少东西的白痴?

我想独特的解决方案是将Lambda链接起来...

1 个答案:

答案 0 :(得分:0)

我进行了一些研究,发现这是在VPC的配置方式上实现的。我发现Lambda无法从VPC内访问互联网,因此您需要执行以下操作之一:

  1. 配置数据库代理(不建议在生产中使用,因为它处于beta预览阶段),并由此连接到数据库。
  2. 配置VPC可以访问Internet。

来源: