1

我正在尝试使用数据 API 将带有 SQL 查询的 AWS Lambda 连接到 AWS RDS (MySQL),并为具有特定id.

这是处理程序的样子:

'use strict';
const AWS = require('aws-sdk')
const RDS = new AWS.RDSDataService({ endpoint: '******.cluster-*********.us-west-2.rds.amazonaws.com' })
    
module.exports.fetchById = async (event, context, callback) => {

  const req_id = event.pathParameters.id;

  try {
    const params = {
      resourceArn: 'arn:aws:rds:us-west-2:***********',
      secretArn: 'arn:aws:secretsmanager********',
      sql: `SELECT * FROM user WHERE user_id = :id`,
      database: '*********',
      includeResultMetadata: true,
      parameters: [
        { id: req_id },
      ]
    }

    const db_res = await rdsDataService.executeStatement(params).promise();

    const response = {
      body: JSON.stringify({
        message: 'Data fetched!!',
        data: db_res.records
      })
    };
    callback(null, response);
  } catch (error) {
    console.log('Error Received', error)
  }
};

无服务器.yml

functions:
  fetchByIdId:
    handler: handler.fetchById
    events:
      - http:
          path: user/{id}
          method: get
          authorizer:
            name: cognito-authorizer
            arn: arn:aws:***********
          request:
            parameters:
              paths:
                id: true

我需要解决的几个问题:

  1. 如果我像这样实例化:

    const RDS = new AWS.RDSDataService({ endpoint: '******.cluster-*********.us-west-2.rds.amazonaws.com' })

通过将端点集群作为参数包含在内,处理程序函数根本不会执行。它只是不断抛出:

{"errorMessage": "2020-10-30T07:31:12.258Z c4b4ca2d-3cbb-4733-8cfe-0c7aad228c29 Task timed out after 6.01 seconds"}.

也尝试增加超时,但它没有任何区别并且错误仍然存​​在。但是如果端点被删除并且只使用如下:

const RDS = new AWS.RDSDataService()

,函数不会抛出超时错误,但是面临这两个新问题:

  1. id是必需的。我将所需的配置传递给 yml 文件,但它
    似乎没有将其标记为必需。如果 http 端点被执行为
    /user/,它不会抛出任何错误。

  2. 我需要对请求参数执行输入数据验证/清理。在执行端点/user/123时,它会抛出一个错误: INFO Error Received UnexpectedParameter: Unexpected key 'id' found in params.parameters[0].

我在文档中读出但找不到任何特定的线索来完成相同的任务。

任何解决此问题的帮助表示赞赏。

4

0 回答 0