【问题标题】:aws lambda with rds mysql DDL command not working带有rds mysql DDL命令的aws lambda不起作用
【发布时间】:2020-03-26 02:37:09
【问题描述】:

我已经创建了 lambda 函数,它在使用 DML 命令时成功连接到数据库

“选择”或“插入”,但当我尝试“创建数据库”或“创建表”时,它返回成功,但表或数据库未创建到 RDS 中。

简而言之,插入查询插入记录并选择返回相同的记录,因此连接没有问题,但创建命令不起作用。

以下是我的 lambda 策略

 const mysql = require('mysql');

const con = mysql.createConnection({
  host     : process.env.RDS_HOSTNAME,
  user     : process.env.RDS_USERNAME,
  password : process.env.RDS_PASSWORD,
  port     : process.env.RDS_PORT,
    connectionLimit : 10,// max number of connections before your pool starts waiting for a release
    multipleStatements : true,// Prevent nested sql statements
    connectionLimit : 1000,
    connectTimeout  : 60 * 60 * 1000,
    acquireTimeout  : 60 * 60 * 1000,
    timeout         : 60 * 60 * 1000,
    debug    : true 
   // ,database:'testdb1'
});


exports.handler = async (event) => {

  con.query('CREATE DATABASE testdb1', function (err, result) {
    if (err){
          console.log("Error->"+err);
       throw err;
    }
  });

  return "Completed..."
};

【问题讨论】:

  • 请贴一些代码
  • 查询有一个回调,但处理函数没有编码为等待它。是你的真实代码还是不同的代码。
  • 谢谢,一切正常

标签: aws-lambda


【解决方案1】:

lambda 应该等待查询完成。让我们先解决这个问题。之后,检查 lambda 在尝试创建数据库时是否报告任何错误。

const mysql = require('mysql');

const con = mysql.createConnection({
  host: process.env.RDS_HOSTNAME,
  user: process.env.RDS_USERNAME,
  password: process.env.RDS_PASSWORD,
  port: process.env.RDS_PORT,
  connectionLimit: 10,
  multipleStatements: true,// Prevent nested sql statements
  connectionLimit: 1000,
  connectTimeout: 60 * 60 * 1000,
  acquireTimeout: 60 * 60 * 1000,
  timeout: 60 * 60 * 1000,
  debug: true
  // ,database:'testdb1'
});

exports.handler = async (event) => {
  try {
    const data = await new Promise((resolve, reject) => {
      con.connect(function (err) {
        if (err) {
          reject(err);
        }
        con.query('CREATE DATABASE testdb1', function (err, result) {
          if (err) {
            console.log("Error->" + err);
            reject(err);
          }
          resolve(result);
        });
      })
    });

    return {
      statusCode: 200,
      body: JSON.stringify(data)
    }

  } catch (err) {
    return {
      statusCode: 400,
      body: err.message
    }
  }
};

【讨论】:

  • 添加了承诺语法。你的代码是正确的,它应该可以工作。我的猜测是,用户可能没有创建数据库的权限。 lambda 没有显示权限错误,因为它没有等待查询执行完成。
  • 如有语法错误也请及时调整。我没有尝试执行此代码。
猜你喜欢
  • 1970-01-01
  • 2016-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-04
  • 2018-10-27
  • 2017-01-14
  • 1970-01-01
相关资源
最近更新 更多