【问题标题】:AWS Lambda NodeJS call to SQL Server returns no data and no errorsAWS Lambda NodeJS 调用 SQL Server 不返回数据和错误
【发布时间】:2020-01-03 07:51:27
【问题描述】:

我正在尝试使用 lambda 函数连接到 AWS 托管的 SQL 服务器,但是当我在 lambda 管理控制台中或通过 API 调用对其进行测试时,我一直通过该函数以获得最终响应test here

这似乎表明调用没有发生错误并且没有返回任何记录。因为我知道表格有数据,所以我至少会预料到一个错误,或者理想情况下是数据。我该如何解决这个问题?

使用 CloudWatch 控制台输出,我看到“称为 rdsquery”,但在那之后什么也没有

var sql = require("mssql");

// config for your database
var config = {
    user: 'xxuser',
    password: 'xxxx',
    server: 'mydns', 
    database: 'Antonio' 
};


module.exports.rdsquery = async event => {

console.log('called rdsquery')
  try{
    // connect to your database
    await sql.connect(config, function (err) {

      console.log('connected')
        if (err) 
          console.log('rdsquery: '+err)
          //return {statusCode: 200, headers: {'Access-Control-Allow-Origin': '*'},body: JSON.stringify('sql connect err: '+err)};

        // create Request object
        var request = new sql.Request();
        console.log('rdsquery: request crated')   
        // query to the database and get the records
        request.query('select CustomerNo from FROMMAS_AR_Customer', function (err, recordset) {

            if (err)
            console.log('rdsquery-sql: '+err)   
            //return {statusCode: 200, headers: {'Access-Control-Allow-Origin': '*'},body: JSON.stringify('sql err: '+err)};

            // send records as a response
            console.log('logging recordset')
            console.log(recordset);
            return {statusCode: 200, headers: {'Access-Control-Allow-Origin': '*'},body: JSON.stringify(recordset)};
            //return {statusCode: 200, headers: {'Access-Control-Allow-Origin': '*'},body: JSON.stringify(recordset)};
        });
    });
  }
  catch(e)
  {
    console.log('rdsquery-catch: '+e)   
    return {statusCode: 200, headers: {'Access-Control-Allow-Origin': '*'},body: JSON.stringify('ERR: '+e)};
  }

  //return {statusCode: 200, headers: {'Access-Control-Allow-Origin': '*'},body: JSON.stringify('test here')};
};

【问题讨论】:

  • 您检查过 AWS cloudwatch 日志吗?您应该控制台错误而不是返回它们以帮助调试
  • @Adiii 我将控制台日志添加到我的代码中,似乎连接从未建立并无形地失败
  • ms 服务器在哪里?是否可以从 lambda 访问?
  • 假设rdsquery 是您的处理函数,您是否还需要以某种方式调用Lambda 处理程序的callback
  • 是的,经过更多挖掘(当我将 require mssql 放入 try catch 时)我得到一个“找不到模块错误”。好像我没有正确地将它加载到 lambda 中

标签: node.js amazon-web-services aws-lambda


【解决方案1】:

请注意,我不是 Lambda 专家。这些信息中的任何一个都可能是完全错误的。如果您发现我解决问题的方式有问题,我将不胜感激下面的 cmets

所以经过大量挖掘后,我发现我的 lambda 配置存在几个问题:

  1. 默认情况下,我的 Lambda 函数超时时间太短。当我将超时时间增加到 30 秒时,当我在 lambda 中运行测试时,我开始收到有用的错误,例如 Could not connect MYIP

  2. 然后我在 SO 上找到了this answer,它让我在我的 lambda 函数中添加了一个 VPC(因此该函数可以访问 RDS)

  3. 最后,我必须将策略 AWSLambdaVPCAccessExecutionRole 添加到我的 lambda 用户。

【讨论】:

    猜你喜欢
    • 2017-04-10
    • 1970-01-01
    • 1970-01-01
    • 2020-09-19
    • 1970-01-01
    • 2020-09-03
    • 1970-01-01
    • 2017-11-13
    • 1970-01-01
    相关资源
    最近更新 更多