我使用aws api-gateway和dynamodb创建了REST api,但没有在GET API方法、POST http方法和扫描操作设置上使用aws-lambda (我为集成请求和集成响应编写了映射模板,而不是lambda)。我从dynamodb中的全局二级索引中获取数据,以使我的扫描比原始表更小。
它工作得很好,除了我只能扫描我需要扫描的7500个项目中的大约1000个。我查看了s3存储桶中的json分页,但如果可能的话,我真的希望只使用aws api-gateway和dynamodb来保持简单。
有没有办法在对集成请求和/或响应映射进行一些修改的情况下,获得我有效负载中的所有7,500个项目?如果没有,你有什么建议?
下面是我使用的映射代码,它适用于1000个项目的json有效负载,而不是我想要的7500个项目:
集成请求:
{
"TableName": "TrailData",
"IndexName": "trail-index"
}集成响应:
#set($inputRoot = $input.path('$'))
[
#foreach($elem in $inputRoot.Items)
{
"id":$elem.id.N,
"trail_name":"$elem.trail_name.S",
"challenge_rank":$elem.challenge_rank.N,
"challenge_description":"$elem.challenge_description.S",
"reliability_description":"$elem.reliability_description.S"
}
#if($foreach.hasNext),#end
#end
]下面是我的接口的GET方法设置的屏幕截图:API Screenshot
我已经看过这个:与stackoverflow question相关的话题,但我不知道如何将它应用于我的情况。我在这上面花了很多时间。
我知道dynamodb的查询限制是1MB,但我返回的有限数据只有142KB。
感谢您的帮助和建议。我对此还不熟悉。谢谢!
发布于 2021-01-17 12:03:15
这个限制与Dynamo扫描无关,但是Response Template中的VTL #foreach被限制为1000次迭代,Here才是问题所在。
我们也可以确认这一点,通过简单地删除#foreach(或整个响应模板),我们应该看到所有(1MB)的记录回来(但格式不好)。
最简单的解决方案是传递请求参数,以便仅限制Dynamo表中的必要属性
{
"TableName":"ana-qa-linkshare",
"Limit":2000,
"ProjectionExpression":"challenge_rank,reliability_description,trail_name"
}然而,我们可以避免使用多个foreach循环进行超过1000次的单个循环,但是在模板中会变得有点复杂,相反,我们可以使用lambda。但这是它可能看起来的样子。
#set($inputRoot = $input.path('$'))
#set($maxRec = 500)
#set($totalLoops = $inputRoot.Count / $maxRec )
#set($outerArray = [0..$totalLoops])
#set($innerArray = [0..$maxRec])
{
[
#foreach($outer in $outerArray)
#foreach($inner in $innerArray)
{
grab the element with $inputRoot.Items.get(..index)
and Build JSON here.
}
#end
#end
]
}https://stackoverflow.com/questions/65756589
复制相似问题