Как указать атрибуты для возврата из DynamoDB через AppSync - PullRequest
0 голосов
/ 06 мая 2020

У меня есть преобразователь конвейера AppSyn c. Первая функция запрашивает у базы данных ElasticSearch ключи DynamoDB. Вторая функция запрашивает DynamoDB с помощью предоставленных ключей. Все это работало хорошо, пока я не столкнулся с лимитом 1 МБ для AppSyn c. Поскольку большая часть данных находится в нескольких атрибутах / столбцах, которые мне не нужны, я хочу ограничить результаты только теми атрибутами, которые мне нужны.

Я попытался добавить AttributesToGet и ProjectionExpression ( отсюда ), но оба выдавали такие ошибки, как:

{
  "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 МБ):

#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
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 14 июля 2020

Я связался с AWS людьми, которые подтвердили, что ProjectionExpression в настоящее время не поддерживается и что пройдет некоторое время, прежде чем они до него дойдут.

Вместо этого я создал лямбду для извлечения данных из DynamoDB .

Чтобы ограничить форму результатов DynamoDB, я использовал $ctx.info.selectionSetList в AppSyn c, чтобы получить список запрошенных столбцов, а затем использовал список, чтобы указать данные, которые нужно извлечь из DynamoDB. Мне нужно было получить несколько результатов, поддерживая порядок, поэтому я использовал BatchGetItem, а затем объединил результаты с исходным списком идентификаторов с помощью LINQ (который вернул результаты DynamoDB в правильном порядке, поскольку BatchGetItem в C# не сохраняет порядок сортировки, например версия AppSyn c поддерживает).

Поскольку я использовал C# с несколькими библиотеками, время холодного старта было немного большим, поэтому я использовал Lambda Layers, предварительно JITed до Linux, который позволил снизить время холодного старта с ~ 1,8 секунды до ~ 1 секунды (при использовании 1024 ГБ ОЗУ для лямбда).

0 голосов
/ 19 мая 2020

AppSyn c не поддерживает проекцию, но вы можете явно указать, какие поля возвращать в шаблоне ответа, вместо возврата всего набора результатов.

{
  "id": "$ctx.result.get('id')",
  "name": "$ctx.result.get('name')",
   ...
}
...