#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:
Вы действительно задаете здесь два вопроса.
-
Может ли Amazon States Language преобразовывать числа в строки?
-
Как вы можете заставить пошаговые функции добавлять что-либо в Dynamo DB без указания типа данных.
Ответ на первый вопрос заключается в том, что да, вы можете использовать ASL для преобразования чисел в строки, используя встроенную функцию конкатенации, вот так. Учитывая полезную нагрузку в виде одного числа
{
"key.$": "States.Format('{}',$.Payload)"
}
Мы можем использовать формат встроенной функции Statesдля добавления кавычек вокруг выходных данных этого шага.
Однако это не будет полезно в вашем случае использования, поскольку у вас потенциально есть сотни чисел, которые не всегда могут соответствовать установленному формату.
В вашем случае решением было бы сохранить ваши данные в DynamoDB, используя лямбда-функцию с клиентом Document.
Было бы неплохо, если бы у них была возможность использовать document client непосредственно в пошаговых функциях, но на момент написания этой статьи это не так. Вам просто нужно выполнить действие вручную в лямбда-функции, используя document client. Тот же результат.