AWS Правило IoT DynamoDB не может прочитать значение SELECTed из функции topi c () - PullRequest
0 голосов
/ 30 января 2020

Я пытаюсь получить данные из AWS IoT MQTT topi c в DynamoDB, используя правило. Пример topi c: cooler/cooler42/sensors и пример сообщения

{ "waterTemp": 10, "timestamp": 1580370731383 }

Я определил запрос примерно так, чтобы извлечь deviceName (например, cooler42) из topi c и вставьте его в JSON:

SELECT *, topic(2) AS deviceName FROM 'cooler/+/sensors'

Это действительно работает, как будто я переиздаю sh сообщение другому topi c Теперь я вижу то же самое JSON с добавлением deviceName:

{ "waterTemp": 10, "timestamp": 1580370731383, "deviceName": "cooler42" }

Насколько я понимаю, теперь все 3 поля должны быть доступны для использования в моем правиле DynamoDB, например:

screenshot of create rule page

Однако из CloudWatch я вижу, что правило не выполняется с ошибкой One or more parameter values were invalid: An AttributeValue may not contain an empty string (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: ValidationException, а ключ раздела (он же ключ sh) отображается как пустое:

{ "ItemRangeKeyValue":"1580370731383", "IsPayloadJSON":"true", "ItemHashKeyField":"deviceName", "Operation":"Insert", "ItemRangeKeyField":"timestamp", "Table":"SensorDataTest2", "ItemHashKeyValue":"" <--- Empty }

Не могу ли я использовать deviceName, который я только что ВЫБИЛ из имени topi c в правиле? Если нет, есть ли другой способ извлечь его?

NB. Если я вручную опубликую sh сообщение в topi c, уже включающее deviceName, тогда оно работает нормально, но я работаю в ограниченная среда и не нужно дополнительного размера полезной нагрузки.

Ответы [ 2 ]

3 голосов
/ 06 февраля 2020

В ключевых значениях используется шаблон замены , который не может ссылаться на псевдоним deviceName (*).

В документации AWS это подчеркивается:

Поскольку выражение в шаблоне подстановки оценивается отдельно от оператора "SELECT ...", вы не можете ссылаться на псевдоним, созданный с помощью предложения AS. Вы можете ссылаться только на информацию, представленную в исходной полезной нагрузке, в дополнение к поддерживаемым функциям и операторам.

Вы можете ссылаться только на информацию в исходной полезной нагрузке.

Поскольку псевдоним отсутствует в исходной полезной нагрузке, вы можете использовать ${topic(2)} в качестве значения ключа раздела. Функция имеет доступ к topi c, хотя это означает, что значение ключа связано с именем topi c.

Другой альтернативой является правило republi sh для другой topi c с deviceName в полезной нагрузке. Правило / действие, которое обрабатывает эту топи c, может записывать в DynamoDB. Это действие затем будет иметь доступ к свойству deviceName, так как оно доступно в переизданной полезной нагрузке.


* Документация ссылается на синтаксис значения ключа как шаблоны подстановки.

Ссылка выше заявляет:

Шаблоны замещения появляются в параметрах действия в правиле

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

, например, с правилом, включающим некоторые псевдонимы:

enter image description here

Сконфигурируйте действие для использования Sort key value из ${encode(*, 'base64')}, который будет кодировать всю полезную нагрузку как строку из 64 строк.

enter image description here

Когда вы публикуете sh сообщение:

enter image description here

Это сообщение записывается в DynamoDB as:

{
  "DateTime": "ewogICJtZXNzYWdlIjogIkhlbGxvIGZyb20gQVdTIElvVCBjb25zb2xlIgp9",
  "Payload": {
    "arrivalTime": 1581082253585,
    "myField": "Hello from AWS IoT console",
    "payload": {
      "message": "Hello from AWS IoT console"
    }
  },
  "Topic": "blt/test"
}

Вся полезная нагрузка, включая псевдонимы, находится в * 106 5 * поле. Но декодирование строки base 64 в поле DateTime покажет, что псевдонимы отсутствуют в функции encode.

0 голосов
/ 06 февраля 2020

У меня есть полное руководство по этому вопросу:

Температура процессора - проект IoT

Вы можете использовать библиотеку MQTT из AWS: Записная книжка

Отправленные телеметрические данные в AWS IoT и сохранение в DynamoDB:

DynamoDB Setup

DynamoDB

Затем выполните запрос:

SELECT message.reported.* FROM '#'

Затем создайте панели мониторинга в реальном времени с помощью Quick Sight или Kibana. Вся идея представлена ​​ниже:

enter image description here

...