通过 AWS API Gateway 集成模板使用 DynamoDB 的 lastEvaluatedKey 进行扫描

2024-04-05

我使用 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(使用前将#替换为@)

通过 AWS API Gateway 集成模板使用 DynamoDB 的 lastEvaluatedKey 进行扫描 的相关文章

随机推荐