Как эффективно настроить правила AWS IoT для записи данных в базу данных Timestream для конкретного устройства?

Я хочу хранить данные устройства IoT в специальной таблице устройства в базе данных Timestream. Это позволит нам предоставлять пользователям доступ к данным их конкретных устройств только на основе определенной политики IAM или Cognito.

Данные с устройств будут выглядеть примерно так с измерением потока времени и мера.

      {
  "ts": 1619815725,
  "id": "device_12345",
  "temperature": 47.2
}

и он будет опубликован в теме

      devices/data/device_12345

Есть база данных Timestream и в этой таблице для каждого устройства, в данном случае device_12345

Теперь мы можем создать правило, которое помещает данные с этого устройства в конкретную таблицу, например:

который выбирает соответствующие данные из точной конечной точки. Действие выглядит так:

Роль настроена так, чтобы разрешать запись только в определенную таблицу в базе данных Timestream. К устройству может быть прикреплена политика, позволяющая только определенному устройству писать в эту конкретную конечную точку MQTT (что предотвращает случайную запись на нее другим устройством).

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

В этом случае для каждого устройства должно быть предусмотрено следующее:

  1. Политика, которая ограничивает конечную точку публикации MQTT конечной точкой устройства (в данном случае devices/data/device_12345
  2. Правило, которое отправляет данные в Timestream, в котором правильно настроена конкретная конечная точка устройства, а также таблица базы данных конкретного устройства.
  3. Политика IAM, которая позволяет этому правилу записывать данные в таблицу, специфичную для устройства, в базе данных.

Теперь вопросы:

  1. Можно ли настроить общее правило, которое смотрит на идентификатор устройства или некоторую информацию об IoT и помещает ее в правильную таблицу базы данных на основе этой информации? например, может ли правило смотреть на размер и на основании чего подтолкнуть его к правильной таблице?
  2. Как это можно автоматизировать, если нам нужно настроить каждый из этих элементов для каждого из миллионов устройств?
  3. Является ли наличие миллионов политик и правил для конкретных устройств наиболее эффективным / действенным способом сделать это?

1 ответ

Решение

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

На высоком уровне можно сделать следующее:

  1. У IoT есть сертификат, который однозначно связан с устройством.
  2. К сертификату может быть привязана политика, которая позволяет устройству публиковать только определенные темы.
  3. Можно настроить правило кода IoT для передачи данных в конкретную базу данных Timestream устройства на основе темы, в которой устройство публикует
  4. Конечному пользователю могут быть предоставлены права чтения для доступа к определенной таблице 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.

Помимо того, что описано здесь, вам понадобится,

  1. Автоматический метод создания новых таблиц при создании или первом подключении нового объекта.
  2. Механизм привязки прав доступа к идентификаторам пользователей
Другие вопросы по тегам