【问题标题】:Error in Lambda Passing SQL to RDS Data APILambda 将 SQL 传递给 RDS 数据 API 时出错
【发布时间】:2020-03-22 17:31:14
【问题描述】:

按照教程,我正在尝试设置一个 AWS Lambda 函数,该函数将使用 Data API 将 SQL 查询传递给 AWS RDS Aurora Serverless MySQL 数据库并返回查询结果(可能是 JSON)。

我使用的代码如下(参数存储为环境变量):

const AWS = require('aws-sdk')
const RDS = new AWS.RDSDataService()

exports.handler = async (event, context) => {
    console.log(JSON.stringify(event, null, 2))  // Log the entire event passed in

    // Get the sqlStatement string value
    // TODO: Implement a more secure way (e.g. "escaping") the string to avoid SQL injection
    var sqlStatement = event.sqlStatement;

    // The Lambda environment variables for the Aurora Cluster Arn, Database Name, and the AWS Secrets Arn hosting the master credentials of the serverless db
    var DBSecretsStoreArn = process.env.DBSecretsStoreArn;
    var DBAuroraClusterArn = process.env.DBAuroraClusterArn;
    var DatabaseName = process.env.DatabaseName;

    const params = {
      awsSecretStoreArn: DBSecretsStoreArn,
      dbClusterOrInstanceArn: DBAuroraClusterArn,
      sqlStatements: sqlStatement,
      database: DatabaseName
    }

    try {
      let dbResponse = await RDS.executeSql(params)
      console.log(JSON.stringify(dbResponse, null, 2))

      return JSON.stringify(dbResponse)

    } catch (error) {
        console.log(error)
      return error
    }
}

我从 Lambda 控制台运行以下测试(其中“Bonds”是我数据库中现有表的名称):

{
    "sqlStatement": "SELECT * FROM Bonds"
}

我的测试记录为成功,输出为空白 {} 并记录了以下错误信息:

INFO    TypeError: Converting circular structure to JSON
    --> starting at object with constructor 'Request'
    |     property 'response' -> object with constructor 'Response'
    --- property 'request' closes the circle
    at JSON.stringify (<anonymous>)
    at Runtime.exports.handler (/var/task/index.js:25:24)END

有谁知道我如何使用这种方法成功检索数据,和/或上述错误意味着什么?

【问题讨论】:

  • 您不能使用JSON.stringifycircular object 转换为字符串,要检查响应,您可以直接控制台dbResponse
  • 您可以查看stackoverflow.com/questions/11616630/… 以获取转换为json字符串的参考

标签: javascript mysql json aws-lambda amazon-rds


【解决方案1】:

RDS.executeSql(params) 不会返回您可以await 的承诺。它只是为您构造一个请求对象。

将其替换为await RDS.executeSql(params).promise(),这样您就可以获得所需的值。

参考资料:

【讨论】:

  • 谢谢!这似乎起到了作用(对于那个错误)——我现在得到与 lambda 角色权限相关的错误——我需要它能够在 RDS 数据库上执行 SELECT 查询并将结果作为 JSON 传递——任何深入了解如何做到这一点?
  • *仅选择查询...不修改数据库。
  • @OJT 为此,您需要授予您的 Lambda IAM 权限以使用 executeSql。详情见本页:docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/…
猜你喜欢
  • 2020-04-26
  • 2019-12-10
  • 2022-01-01
  • 2020-06-26
  • 1970-01-01
  • 1970-01-01
  • 2019-10-26
  • 1970-01-01
  • 2021-11-11
相关资源
最近更新 更多