首页 > 解决方案 > 如何指定要通过 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
        }
    }
}

标签: amazon-web-servicesamazon-dynamodbaws-appsync

解决方案


我联系了 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)。


推荐阅读