Есть ли способ преобразовать числа в строки, которые DynamoDB ожидает в пошаговых функциях?

#amazon-dynamodb #aws-step-functions

#amazon-dynamodb #aws-step-функции

Вопрос:

У меня есть тема IoT, получающая данные с устройств. Каждая полезная нагрузка IoT включает в себя некоторые свойства и массив объектов, который выглядит примерно так.

 {
  "batchId": "someBatchId",
  "prop1": "someProp1",
  "objArray": [
    {
      "arrString1": "someArrString1",
      "arrString2": "someArrString2",
      "arrNum1": 1,
      "arrNum2": 2,
      "arrString3": "someArrString3"
    },
    {
      "arrString1": "someArrString4",
      "arrString2": "someArrString5",
      "arrNum1": 3,
      "arrNum2": 4,
      "arrString3": "someArrString6"
    }
  ]
}
  

Массив может содержать сотни объектов в нем. Мы хотим сгладить эти данные с помощью Map шага и связать свойства верхнего уровня с каждым элементом в массиве и вставить этот элемент в DynamoDB. У нас есть настройка таблицы и раздел IoT, которые работают просто отлично.

Проблема, с которой мы сталкиваемся, заключается в том, что DynamoDB ожидает строки при вставке чисел. Однако, поскольку мы получаем эти данные в виде объекта JSON из IoT, а числа находятся внутри массива объектов, нам сложно преобразовать числа в строки. Итак, мы хотим, чтобы функция Step каким-то образом преобразовывала числа в строки, но я не вижу, как это сделать. Цель здесь — построить простой конвейер для хранения данных IoT в DynamoDB.

Мы также не полностью контролируем все свойства, которые могут быть отправлены, поэтому мы также храним копии полезных данных IoT в S3 (который уже подключен к движку правил IoT и работает просто отлично), но это скорее резервная копия и универсальная. Нас больше всего интересуют данные, поступающие в DynamoDB, чтобы мы могли фактически запрашивать их. Как мы можем убедить функцию Step вставить числа из полезной нагрузки JSON в DynamoDB?

Комментарии:

1. Рассматривали ли вы возможность использования SQL-правила IoT для преобразования чисел в строки? Вложенный запрос SELECT VALUE может быть способен сделать это.

2. @cementblocks у меня есть. Я не фанат, потому что, если наши клиенты в конечном итоге отправят дополнительные данные, я не хочу исключать эти данные, потому что мне пришлось выбирать отдельные свойства вместо * . По сути, это простой конвейер для приема данных для анализа, чтобы мы могли получить решение для того, что представляют данные.

3. Я бы просто переключился на лямбда-выражение либо в пошаговой функции, либо в качестве цели правила темы.

4. @cementblocks: Да. Небольшая напыщенная речь: AWS создает несколько интересных инструментов, но, похоже, упускает из виду мелкие детали, которые нарушают интеграцию, и всегда ожидается «Ну, просто набросайте на это код в виде лямбды», и это раздражает. Но, сказав это, подумав еще раз о вашем предложении в подзапросе, это может работать до тех пор, пока некоторые свойства, дублируемые в объектах, в порядке. Таким образом, вы все еще можете ВЫБРАТЬ * на объектах, чтобы перехватить любые дополнительные данные. Могут возникнуть сложности с квотами символов, хотя в зависимости от количества объектов в массиве.

5. Это просто поразило: aws.amazon.com/blogs/aws/… Может быть, использовать форматирование строки для добавления кавычек вокруг числа?

Ответ №1:

Вы действительно задаете здесь два вопроса.

  1. Может ли Amazon States Language преобразовывать числа в строки?

  2. Как вы можете заставить пошаговые функции добавлять что-либо в Dynamo DB без указания типа данных.

Ответ на первый вопрос заключается в том, что да, вы можете использовать ASL для преобразования чисел в строки, используя встроенную функцию конкатенации, вот так. Учитывая полезную нагрузку в виде одного числа

 {
  "key.$": "States.Format('{}',$.Payload)"
}
  

Мы можем использовать формат встроенной функции Statesдля добавления кавычек вокруг выходных данных этого шага.

Однако это не будет полезно в вашем случае использования, поскольку у вас потенциально есть сотни чисел, которые не всегда могут соответствовать установленному формату.

В вашем случае решением было бы сохранить ваши данные в DynamoDB, используя лямбда-функцию с клиентом Document.

Было бы неплохо, если бы у них была возможность использовать document client непосредственно в пошаговых функциях, но на момент написания этой статьи это не так. Вам просто нужно выполнить действие вручную в лямбда-функции, используя document client. Тот же результат.