Как эффективно настроить правила AWS IoT для записи данных в базу данных Timestream для конкретного устройства?
Я хочу хранить данные устройства IoT в специальной таблице устройства в базе данных Timestream. Это позволит нам предоставлять пользователям доступ к данным их конкретных устройств только на основе определенной политики IAM или Cognito.
Данные с устройств будут выглядеть примерно так с измерением потока времени и
{
"ts": 1619815725,
"id": "device_12345",
"temperature": 47.2
}
и он будет опубликован в теме
devices/data/device_12345
Есть база данных Timestream
device_12345
Теперь мы можем создать правило, которое помещает данные с этого устройства в конкретную таблицу, например:
который выбирает соответствующие данные из точной конечной точки. Действие выглядит так:
Роль настроена так, чтобы разрешать запись только в определенную таблицу в базе данных Timestream. К устройству может быть прикреплена политика, позволяющая только определенному устройству писать в эту конкретную конечную точку MQTT (что предотвращает случайную запись на нее другим устройством).
Затем можно настроить политику для пользователя, чтобы разрешить доступ только для чтения к этой таблице для запроса данных только со своего устройства.
В этом случае для каждого устройства должно быть предусмотрено следующее:
- Политика, которая ограничивает конечную точку публикации MQTT конечной точкой устройства (в данном случае
devices/data/device_12345
- Правило, которое отправляет данные в Timestream, в котором правильно настроена конкретная конечная точка устройства, а также таблица базы данных конкретного устройства.
- Политика IAM, которая позволяет этому правилу записывать данные в таблицу, специфичную для устройства, в базе данных.
Теперь вопросы:
- Можно ли настроить общее правило, которое смотрит на идентификатор устройства или некоторую информацию об IoT и помещает ее в правильную таблицу базы данных на основе этой информации? например, может ли правило смотреть на
размер и на основании чего подтолкнуть его к правильной таблице? - Как это можно автоматизировать, если нам нужно настроить каждый из этих элементов для каждого из миллионов устройств?
- Является ли наличие миллионов политик и правил для конкретных устройств наиболее эффективным / действенным способом сделать это?
1 ответ
Можно настроить набор политик и правил, которые могут быть прикреплены к IoT-объекту и пользователю, чтобы ограничить доступ, который есть у устройств, а также доступ, который есть у конечного пользователя.
На высоком уровне можно сделать следующее:
- У IoT есть сертификат, который однозначно связан с устройством.
- К сертификату может быть привязана политика, которая позволяет устройству публиковать только определенные темы.
- Можно настроить правило кода IoT для передачи данных в конкретную базу данных Timestream устройства на основе темы, в которой устройство публикует
- Конечному пользователю могут быть предоставлены права чтения для доступа к определенной таблице Timestream.
Наименьшее разрешение ресурса IAM для базы данных Timestream - это таблица (см. Https://docs.aws.amazon.com/timestream/latest/developerguide/security_iam_service-with-iam.html ), поэтому единственный способ ограничить доступ пользователей к их собственные данные должны содержать данные устройства в своей собственной таблице, а затем предоставлять пользователю права доступа к таблицам с данными их устройств.
1. Сертификат Интернета вещей
Это часть базовой настройки ядра AWS IoT. Как только устройство получит закрытый ключ и сертификат, оно может подключиться к ядру IoT и опубликовать / подписаться в соответствии с политикой, прикрепленной к сертификату.
2. Настройте общую политику с помощью переменных политики IoT Thing.
Информацию о переменных политики AWS IoT Thing можно найти здесь: https://docs.aws.amazon.com/iot/latest/developerguide/thing-policy-variables.html.
Следующая политика может быть прикреплена к любому сертификату и позволит устройству только публиковать в теме. Переменная политики thing
${iot:Connection.Thing.ThingName}
заменяется фактическим именем вещи. Это минимальная политика, которая позволяет подключаться и публиковать только одну тему.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "iot:Connect",
"Resource": "arn:aws:iot:us-east-1:123456789:client/${iot:Connection.Thing.ThingName}"
},
{
"Effect": "Allow",
"Action": "iot:Publish",
"Resource": "arn:aws:iot:us-east-1:123456789:topic/devices/data/${iot:Connection.Thing.ThingName}"
}
]
}
Любое устройство с этой политикой , прикрепленной к его сертификату будет только иметь возможность публиковать в тему со своим собственным именем вещи. Это общая политика, которая может быть прикреплена к любой вещи с помощью подстановки переменной политики.
3. Настройте основное правило IoT для передачи данных в таблицу базы данных Timestream.
Вам нужно будет создать базу данных Timestream и таблицу для конкретного устройства, в которой таблица имеет то же имя, что и Thing, например, база данных с таблицей
device_12345
Первое, что нужно определить, - это запрос IoT SQL, который выберет данные, которые будут отправлены в действие Timestream в правиле. В этом случае SQL будет,
SELECT temperature FROM 'devices/data/+'
В
+
- это подстановочный знак, который выбирает один уровень темы, т.е. он будет соответствовать данным на
devices/data/device_12345
но нет
devices/data/device_12345/more_data
. Это выберет данные из опубликованных данных с любого устройства.
В действии Timestream база данных будет
device_data
и
tableName
использует функцию SQL topic()
(который доступен в контакте действия), чтобы получить имя устройства.
Это правило необходимо настроить с помощью интерфейса командной строки, поскольку шаблоны подстановки доступны только через интерфейс командной строки или API AWS .
JSON для установки правила:
{
"sql": "SELECT temperature FROM 'devices/data/+'",
"actions": [
{
"timestream": {
"roleArn": "arn:aws:iam::123456789:role/service-role/devices_to_timestream",
"databaseName": "device_data",
"tableName": "${topic(3)}",
"dimensions": [
{
"name": "id",
"value": "${id}"
}
],
"timestamp": {
"value": "${ts}",
"unit": "SECONDS"
}
}
}
],
"ruleDisabled": false,
"awsIotSqlVersion": "2015-10-08"
}
Обратите внимание, что роль IAM необходима для предоставления доступа на запись к таблицам базы данных, и ее необходимо настроить перед настройкой правила. Создать роль
devices_to_timestream_role
и прикрепил настраиваемую политику, разрешающую запись в таблицы базы данных. Политика
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "timestream:WriteRecords",
"Resource": "arn:aws:timestream:us-east-1:123456789:database/device_data/table/*"
},
{
"Effect": "Allow",
"Action": "timestream:DescribeEndpoints",
"Resource": "*"
}
]
}
Эта политика позволяет записывать данные в любую таблицу, поскольку она будет использоваться многими разными вещами для записи данных. Хотя эта политика разрешает запись в любую таблицу, политика сертификатов Thing и правила запроса ограничивают, в какую таблицу конкретная Thing может писать.
Правило IoT можно записать из командной строки с помощью этой команды:
aws iot create-topic-rule --rule-name devices_to_timestream --topic-rule-payload file://devices_to_timestream.json
где
devices_to_timestream.json
имеет содержание правила, перечисленного выше.
4. Предоставьте пользователю доступ к его данным.
Политика доступа может быть прикреплена к идентификатору пользователя, чтобы предоставить конечному пользователю доступ к данным своего устройства, следуя шаблону в примерах политик на основе идентификаторов Timesteam .
В итоге:
Эта конфигурация обеспечивает,
- Одна общая политика, которую можно прикрепить к любой вещи, чтобы разрешить ее публикацию в теме с конкретным именем вещи.
- Одно общее правило, которое помещает все данные в конкретные таблицы Thing в базе данных Timestream.
- Доступ пользователей только к данным Thing, связанным с их идентификационными данными AWS.
Помимо того, что описано здесь, вам понадобится,
- Автоматический метод создания новых таблиц при создании или первом подключении нового объекта.
- Механизм привязки прав доступа к идентификаторам пользователей