如何使用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 服务代理的步骤:
- 创建了一个新的 REST API。
- 创建了一个名为 "get-cities-temp"
的资源
- 创建了一个名为 'table-name' 的子资源,路径为 {tablename}
- 为子资源创建了一个 GET 方法:
- 集成类型:AWS 服务
- 区域:与 DynamoDB 区域相同
- 服务:DynamoDB
- 操作:扫描
- HTTP 方法:POST(因为对 DynamoDB 的所有请求都是使用 POST 发出的)
- 执行角色 ARN:(假定角色为 API-网关创建并附加了一个策略,该策略仅允许单个操作 "DynamoDB:Scan",资源 ARN 指向 DyanmoDB "City-Temperature" table.
- 在 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')"
}
我在调用 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 服务代理的步骤:
- 创建了一个新的 REST API。
- 创建了一个名为 "get-cities-temp" 的资源
- 创建了一个名为 'table-name' 的子资源,路径为 {tablename}
- 为子资源创建了一个 GET 方法:
- 集成类型:AWS 服务
- 区域:与 DynamoDB 区域相同
- 服务:DynamoDB
- 操作:扫描
- HTTP 方法:POST(因为对 DynamoDB 的所有请求都是使用 POST 发出的)
- 执行角色 ARN:(假定角色为 API-网关创建并附加了一个策略,该策略仅允许单个操作 "DynamoDB:Scan",资源 ARN 指向 DyanmoDB "City-Temperature" table.
- 在 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')"
}