我使用 AWS APIGateway 集成模板直接扫描 dynamoDB,而不是编写单独的 lambda 来处理请求/响应。但是,扫描有 1MB 的限制,这导致扫描仅限于部分数据。
根据文档,我们应该重新扫描,直到找到匹配项或使用 lastEvaluatedKey 扫描完整的表。有什么方法可以使用 lastEvaluatedKey 并在网关配置本身中重新扫描而不是编写 lambda 吗?
Thanks.
诀窍在于请求和响应模板。此示例启用扫描page_size
and last_key
作为输入参数(GET):
请求模板(应用程序/json):
#set($last_key = $input.params('last_key'))
#set($page_size = $input.params('page_size'))
{
#if($last_key != '')
"ExclusiveStartKey": {
"id": {
"S": "$last_key"
}
},
#end
#if($page_size != '')
"Limit": $page_size,
#end
"TableName": "<your_table>"
}
请求模板(应用程序/json):
#set($payload = $input.path('$'))
#set($last_key = $payload.LastEvaluatedKey.id.S)
{
"page_size": $payload.Count,
#if($last_key != '')
"last_key": "$last_key",
#end
"Items": $payload.Items
}
如果您使用 CloudFormation,请使用此模板:
/er/tickets/scan:
get:
responses:
"200": {}
x-amazon-apigateway-integration:
passthroughBehavior: WHEN_NO_TEMPLATES
httpMethod: POST # must be POST even for GET
type: AWS
credentials: !GetAtt ApiGatewayRole.Arn
uri: !Sub "arn:aws:apigateway:${AWS::Region}:dynamodb:action/Scan"
requestTemplates:
application/json: !Sub |
#set($last_key = $input.params('last_key'))
#set($page_size = $input.params('page_size'))
{
#if($last_key != '')
"ExclusiveStartKey": {
"id": {
"S": "$last_key"
}
},
#end
#if($page_size != '')
"Limit": $page_size,
#end
"TableName": "${TicketsTable}"
}
responses:
default:
statusCode: 200
responseTemplates:
application/json: |
#set($payload = $input.path('$'))
#set($last_key = $payload.LastEvaluatedKey.id.S)
{
"page_size": $payload.Count,
#if($last_key != '')
"last_key": "$last_key",
#end
"Items": $payload.Items
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)