【问题标题】:How do I efficiently configure AWS IoT rules to write data to a device specific Timestream database?如何有效地配置 AWS IoT 规则以将数据写入设备特定的 Timestream 数据库?
【发布时间】:2021-05-25 05:41:00
【问题描述】:

我想将 IoT 设备数据存储在 Timestream 数据库中的设备特定表中。这将允许我们仅根据特定的 IAM 或 Cognito 策略授予用户访问其特定设备数据的权限。

来自设备的数据看起来像这样,id 是时间流维度,temperature 是度量。

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

并且会发布到主题

devices/data/device_12345

有一个时间流数据库device_data,其中每个设备都有一个表,在本例中为device_12345

现在我们可以创建一个规则,将数据从该设备推送到特定表,如下所示:

从确切的端点中选择相关数据。动作如下所示:

角色配置为仅允许写入 Timestream 数据库中的特定表。可以将策略附加到设备以仅允许特定设备写入该特定 MQTT 端点(这可以防止其他设备意外写入)。

然后可以为用户配置策略,只允许对该表的读取访问权限,以便仅从他们的设备查询数据。

在这种情况下,每个设备都必须具备以下条件:

  1. 将 MQTT 发布端点限制为设备端点的策略(在本例中为 devices/data/device_12345
  2. 将数据推送到正确设置特定设备端点以及特定设备数据库表的 Timestream 的规则
  3. 允许该规则将数据写入数据库中设备特定表的 IAM 策略

现在的问题:

  1. 是否可以配置一个通用规则来查看设备 ID 或有关 IoT 事物的一些信息,并根据这些信息将其推送到正确的数据库表?例如该规则能否查看id 维度并基于该维度将其推送到正确的表格?
  2. 如果我们必须为数百万台设备中的每台设备设置每一项,如何实现自动化?
  3. 拥有数以百万计的设备特定策略和规则是实现此目的最有效/最高效的方式吗?

【问题讨论】:

    标签: aws-iot aws-iot-core amazon-timestream


    【解决方案1】:

    可以配置一组可以附加到物联网事物和用户的策略和规则,以绑定设备拥有的访问权限以及最终用户拥有的访问权限。

    在高层次上可以做到以下几点:

    1. 物联网事物具有唯一链接到设备的证书
    2. 可以将策略链接到仅允许设备发布到特定主题的证书
    3. 可以设置 IoT 代码规则,根据设备发布到的主题将数据推送到设备特定的 Timestream 数据库
    4. 最终用户可以被授予访问特定时间流表的读取权限

    Timestream 数据库的最小 IAM 资源分辨率是一个表(请参阅https://docs.aws.amazon.com/timestream/latest/developerguide/security_iam_service-with-iam.html),因此限制用户访问自己数据的唯一方法是将设备数据包含在自己的表中,然后授予用户访问权限到带有设备数据的表。

    1.物联网证书

    这是基本 AWS IoT 核心事物设置的一部分。一旦设备拥有私钥和证书,它就可以连接到 IoT 核心并根据证书附带的策略发布/订阅

    2。使用 IoT 事物策略变量设置通用策略

    AWS IoT Thing 策略变量信息可在此处找到:https://docs.aws.amazon.com/iot/latest/developerguide/thing-policy-variables.html

    以下策略可以附加到任何证书,并且只允许设备发布到devices/data/device_12345 主题。事物策略变量 ${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_data 和一个表device_12345

    首先要定义的是 IoT SQL 查询,它将选择要推送到规则中的 Timestream 操作的数据。在这种情况下,SQL 将是,

    SELECT temperature FROM 'devices/data/+'

    + 是一个通配符,它​​选择单个主题级别,即它将匹配devices/data/device_12345 上的数据,但不匹配devices/data/device_12345/more_data。这将从任何设备的已发布数据中选择数据。

    在 Timestream 操作中,数据库将为 device_datatableName 使用 SQL 函数 topic()(可在操作的联系人中获得)获取设备名称。

    必须使用 CLI 设置此规则,如 substitution templates are only available through the AWS CLI or API

    用于设置规则的 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": "*"
            }
        ]
    }
    

    此策略允许写入任何表,因为许多不同的事物将使用它来写入数据。尽管此策略允许写入任何表,但事物证书策略和规则查询限制了特定事物可以写入的表。

    可以使用以下命令从命令行编写 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 identity based policy examples 中的模式访问其设备数据。

    总结:

    此配置提供,

    • 一种通用策略,可附加到任何事物以允许其发布到具有事物特定名称的主题
    • 将所有数据推送到时间流数据库中的事物特定表的通用规则
    • 用户只能访问与其 AWS 身份相关联的事物数据

    除了这里描述的,你还需要,

    1. 首次创建或连接新事物时创建新表的自动化方法
    2. 一种将访问权限附加到用户身份的机制

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-11
      • 1970-01-01
      • 1970-01-01
      • 2021-08-02
      • 2023-03-12
      • 2018-07-22
      相关资源
      最近更新 更多