如何使用API-网关作为服务代理直接调用DynamoDB Scan API?

How to Call DynamoDB Scan API Directly using API-Gateway as Service Proxy?

我在调用 GET REST(区域)API 时遇到问题,然后调用 DynamoDB Scan API 以获取名为 City-Temperature 的 table 的所有项目.

作为请求参数,我只添加了 'tablename',因为它需要调用 DynamoDB:Scan API。但是在测试 API 时,我从 DynamoDB 获得了 400 状态,错误如下:

{
  "__type": "com.amazon.coral.validate#ValidationException",
  "message": "1 validation error detected: Value null at 'tableName' failed to satisfy constraint: Member must not be null"
}

为简单起见,dynamoDB table "City-Temperature" 包含五个项目,每个项目 'City'(主键 - 字符串)包含一个属性(字符串)"Temperature"。

我生成 API 服务代理的步骤:

  1. 创建了一个新的 REST API。
  2. 创建了一个名为 "get-cities-temp"
  3. 的资源
  4. 创建了一个名为 'table-name' 的子资源,路径为 {tablename}
  5. 为子资源创建了一个 GET 方法:
    • 集成类型:AWS 服务
    • 区域:与 DynamoDB 区域相同
    • 服务:DynamoDB
    • 操作:扫描
    • HTTP 方法:POST(因为对 DynamoDB 的所有请求都是使用 POST 发出的)
    • 执行角色 ARN:(假定角色为 API-网关创建并附加了一个策略,该策略仅允许单个操作 "DynamoDB:Scan",资源 ARN 指向 DyanmoDB "City-Temperature" table.
  6. 在 Integration-Method 窗格中,我将 'Content-handling' 保留为 'passthrough',并添加了内容类型为 'application/json' 的映射模板以使用单个参数 'tablename' 转换请求与 DynamoDB 兼容,如下所示:

To add here: 'Request Body Passthrough' is set to 'When there are no templates defined (recommended)'

{
    "tableName": "$input.params('tablename')"
}

最后,在测试部分,我添加 tablename=City-Temperature 作为查询字符串以传入 table 的扫描名称 API 并点击 'Test'.但是作为响应抛出了上面提到的错误。

更新:

In logs, it looks like request body after transformation is being properly converted: { "tablename": "City-Temperature" }. But yet, same error as above

基于https://aws.amazon.com/blogs/compute/using-amazon-api-gateway-as-a-proxy-for-dynamodb/tableName不是属性对象类型,而是一个简单的string。编辑:属性 也应该是 Pascal 大小写。因此下面的变化应该做

{
    "TableName":"$input.params('tablename')"
}