amazon-web-services - 如何指定要通过 AppSync 从 DynamoDB 返回的属性
问题描述
我有一个 AppSync 管道解析器。第一个函数在 ElasticSearch 数据库中查询 DynamoDB 键。第二个函数使用提供的键查询 DynamoDB。在我遇到AppSync 的 1 MB 限制之前,这一切都运行良好。由于大部分数据都在我不需要的几个属性/列中,我想将结果限制为我需要的属性。
我尝试添加 AttributesToGet 和 ProjectionExpression ( from here ),但都给出了如下错误:
{
"data": {
"getItems": null
},
"errors": [
{
"path": [
"getItems"
],
"data": null,
"errorType": "MappingTemplate",
"errorInfo": null,
"locations": [
{
"line": 2,
"column": 3,
"sourceName": null
}
],
"message": "Unsupported element '$[tables][dev-table-name][projectionExpression]'."
}
]
}
我的 DynamoDB 函数请求映射模板看起来像(只要数据小于 1 MB 就返回结果):
#set($ids = [])
#foreach($pResult in ${ctx.prev.result})
#set($map = {})
$util.qr($map.put("id", $util.dynamodb.toString($pResult.id)))
$util.qr($map.put("ouId", $util.dynamodb.toString($pResult.ouId)))
$util.qr($ids.add($map))
#end
{
"version" : "2018-05-29",
"operation" : "BatchGetItem",
"tables" : {
"dev-table-name": {
"keys": $util.toJson($ids),
"consistentRead": false
}
}
}
解决方案
我联系了 AWS 人员,他们确认 ProjectionExpression 目前不受支持,他们需要一段时间才能使用它。
相反,我创建了一个 lambda 来从 DynamoDB 中提取数据。
为了限制我在 AppSync 中使用的 DynamoDB 的结果$ctx.info.selectionSetList
来获取请求列的列表,然后使用该列表指定要从 DynamoDB 中提取的数据。我需要获得多个结果,保持顺序,所以我使用了 BatchGetItem,然后使用 LINQ 将结果与原始 ID 列表合并(由于 C# 中的 BatchGetItem 不会像 AppSync 那样保留排序顺序,因此将 DynamoDB 结果恢复到正确的顺序版本有)。
因为我使用 C# 和许多库,冷启动时间有点长,所以我使用 Lambda Layers pre-JITed to Linux 这让我们将冷启动时间从 ~1.8 秒缩短到 ~1 秒(当为 Lambda 使用 1024 GB RAM)。
推荐阅读
- android - 自定义 gradle 插件导致“多个 dex 文件定义 XXX”异常
- ionic-framework - 使用 ionic+angularfire2 从 Firebase 检索数据时出现问题
- python - 避免在 pd.MltiIndex 中自动填充缺失值
- r - Rmarkdown到Word输出 - 为word文档插入页码
- uber-api - UBER API 驱动程序
- c# - 在 C# 中使用 CoreNLP 时出现 SLF4J 错误
- r - 如何使用 R 中的数据框列表绘制图表
- vba - 为什么我的表格还在记忆中
- reactjs - 带有 react-native 的 Apollo 查询组件
- c# - 来自外部程序的 Assett Bundle