有没有办法使用 aws api-gateway 通过 REST API 获取全局二级索引中的所有项目?我只能得到一些
Is there a way to GET all items in a global secondary index with REST API using aws api-gateway? I can only GET some
我在 GET 上使用 aws api-gateway 和 dynamodb 创建了一个 REST api 而没有使用 aws-lambda(我为集成请求和集成响应而不是 lambda 编写了映射模板) API 方法,POST http 方法和扫描操作设置。我正在从 dynamodb 中的全局二级索引中获取,以使我的扫描小于原始 table。
它运行良好,但我只能扫描我需要扫描的 7,500 件物品中的大约 1,000 件。我检查了在 s3 存储桶中对 json 进行分页,但我真的想尽可能简单地使用 aws api-gateway 和 dynamodb。
有没有办法通过对我的集成请求 and/or 响应映射进行一些修改来获取我的有效负载中的所有 7,500 个项目?如果没有,你有什么建议?
下面是我正在使用的映射代码,它适用于 1000 个项目 json 有效载荷,而不是我想要的 7,500 个:
集成请求:
{
"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
]
这是我的 API 的 GET 方法设置的屏幕截图:
API Screenshot
我已经查看了这个: 相关主题,但我不知道如何将它应用到我的情况中。我花了很多时间。
我知道 dynamodb 的 1MB 查询限制,但我返回的有限数据只有 142KB。
感谢任何帮助或建议。我是新来的。谢谢!
此限制与 Dynamo Scan 无关,但 Response Template
内的 VTL #foreach 被限制为 1000 次迭代 Here 是问题所在。
我们也可以确认这一点,只需删除 #foreach
(或整个响应模板),我们应该可以看到所有 (1MB) 的记录(但格式不正确)。
最简单的解决方案是传递请求参数以仅限制来自 Dynamo 的必要属性 table
{
"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
]
}
我在 GET 上使用 aws api-gateway 和 dynamodb 创建了一个 REST api 而没有使用 aws-lambda(我为集成请求和集成响应而不是 lambda 编写了映射模板) API 方法,POST http 方法和扫描操作设置。我正在从 dynamodb 中的全局二级索引中获取,以使我的扫描小于原始 table。
它运行良好,但我只能扫描我需要扫描的 7,500 件物品中的大约 1,000 件。我检查了在 s3 存储桶中对 json 进行分页,但我真的想尽可能简单地使用 aws api-gateway 和 dynamodb。
有没有办法通过对我的集成请求 and/or 响应映射进行一些修改来获取我的有效负载中的所有 7,500 个项目?如果没有,你有什么建议?
下面是我正在使用的映射代码,它适用于 1000 个项目 json 有效载荷,而不是我想要的 7,500 个:
集成请求:
{
"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
]
这是我的 API 的 GET 方法设置的屏幕截图: API Screenshot
我已经查看了这个:
我知道 dynamodb 的 1MB 查询限制,但我返回的有限数据只有 142KB。
感谢任何帮助或建议。我是新来的。谢谢!
此限制与 Dynamo Scan 无关,但 Response Template
内的 VTL #foreach 被限制为 1000 次迭代 Here 是问题所在。
我们也可以确认这一点,只需删除 #foreach
(或整个响应模板),我们应该可以看到所有 (1MB) 的记录(但格式不正确)。
最简单的解决方案是传递请求参数以仅限制来自 Dynamo 的必要属性 table
{
"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
]
}