如何高效配置 AWS IoT 规则以将数据写入设备特定的时间流数据库?
How do I efficiently configure AWS IoT rules to write data to a device specific Timestream database?
我想将 IoT 设备数据存储在 Timestream 数据库中的设备特定 table 中。这将允许我们仅根据特定的 IAM 或 Cognito 策略授予用户访问其特定设备数据的权限。
来自设备的数据看起来像这样,id
是时间流维度,temperature
是度量。
{
"ts": 1619815725,
"id": "device_12345",
"temperature": 47.2
}
并且会发布到话题
devices/data/device_12345
有一个 Timestream 数据库 device_data
,其中每个设备都有一个 table,在本例中为 device_12345
现在我们可以创建一个规则,将数据从该设备推送到特定的 table,如下所示:
从准确的端点中选择相关数据。操作如下所示:
该角色配置为仅允许写入 Timestream 数据库中的特定 table。可以将策略附加到设备以仅允许特定设备写入该特定 MQTT 端点(这可以防止其他设备意外写入)。
然后可以为用户配置一个策略,只允许读取访问 table 以仅从他们的设备查询数据。
在这种情况下,每个设备都必须具备以下条件:
- 将 MQTT 发布端点限制为设备端点的策略(在本例中
devices/data/device_12345
- 将数据推送到具有特定设备端点以及特定设备数据库 table 正确设置的 Timestream 的规则
- 允许该规则将数据写入数据库中特定设备 table 的 IAM 策略
现在问题:
- 是否可以配置一个通用规则来查看设备 ID 或有关 IoT 事物的某些信息,并根据此信息将其推送到正确的数据库 table?例如规则是否可以查看
id
维度并基于该维度将其推送到正确的 table?
- 如果我们必须为数百万台设备中的每台设备设置这些项目中的每一项,如何实现自动化?
- 拥有数百万个特定于设备的策略和规则是否是实现此目的的最effective/efficient方式?
可以配置一组可以附加到 IoT 事物和用户的策略和规则,以绑定设备具有的访问权限以及最终用户具有的访问权限。
在高层次上可以完成以下操作:
- IoT 事物具有唯一链接到设备的证书
- 可以将策略链接到只允许设备发布到特定主题的证书
- 可以设置 IoT 代码规则以根据设备发布到的主题将数据推送到设备特定的时间流数据库
- 可以为最终用户授予访问特定时间流的读取权限table
Timestream 数据库的最小 IAM 资源解析是 table(参见 https://docs.aws.amazon.com/timestream/latest/developerguide/security_iam_service-with-iam.html),因此限制用户访问自己数据的唯一方法是将设备数据包含在自己的数据中table,然后授予用户访问 table 及其设备数据的权限。
1.物联网证书
这是基本 AWS IoT 核心事物设置的一部分。一旦设备拥有私钥和证书,它就可以连接到 IoT Core 并根据证书附带的策略publish/subscribe
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 数据库 table
您将需要创建时间流数据库和设备特定 table,其中 table 与事物同名,例如数据库 device_data
带有 table device_12345
首先要定义的是 IoT SQL 查询,它将 select 数据推送到规则中的时间流操作。在这种情况下,SQL 将是,
SELECT temperature FROM 'devices/data/+'
+
是一个通配符,select 是单个主题级别,即它将匹配 devices/data/device_12345
上的数据,但不匹配 devices/data/device_12345/more_data
上的数据。这将 select 来自任何设备的已发布数据的数据。
在 Timestream 操作中,数据库将是 device_data
并且 tableName
使用 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 角色来提供对数据库 tables 的写访问权限,并且必须在配置规则之前进行设置。创建角色 devices_to_timestream_role
并附加自定义策略以允许写入数据库的 table。政策是
{
"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": "*"
}
]
}
此策略允许写入 any table 因为它会被许多不同的事物用来写入数据。尽管此策略允许写入任何 table,但事物证书策略和规则查询限制 table 特定事物可以写入的内容。
可以使用以下命令从命令行编写 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 中的模式访问其设备数据。
总结:
此配置提供,
- 一个通用策略,可以附加到任何事物以允许它发布到具有事物特定名称的主题
- 将所有数据推送到 Timestream 数据库中特定事物 table 的通用规则
- 用户只能访问链接到其 AWS 身份的事物数据
除了此处描述的内容,您还需要,
- 一种在首次创建或连接新事物时创建新 table 的自动化方法
- 一种将访问权限附加到用户身份的机制
我想将 IoT 设备数据存储在 Timestream 数据库中的设备特定 table 中。这将允许我们仅根据特定的 IAM 或 Cognito 策略授予用户访问其特定设备数据的权限。
来自设备的数据看起来像这样,id
是时间流维度,temperature
是度量。
{
"ts": 1619815725,
"id": "device_12345",
"temperature": 47.2
}
并且会发布到话题
devices/data/device_12345
有一个 Timestream 数据库 device_data
,其中每个设备都有一个 table,在本例中为 device_12345
现在我们可以创建一个规则,将数据从该设备推送到特定的 table,如下所示:
从准确的端点中选择相关数据。操作如下所示:
该角色配置为仅允许写入 Timestream 数据库中的特定 table。可以将策略附加到设备以仅允许特定设备写入该特定 MQTT 端点(这可以防止其他设备意外写入)。
然后可以为用户配置一个策略,只允许读取访问 table 以仅从他们的设备查询数据。
在这种情况下,每个设备都必须具备以下条件:
- 将 MQTT 发布端点限制为设备端点的策略(在本例中
devices/data/device_12345
- 将数据推送到具有特定设备端点以及特定设备数据库 table 正确设置的 Timestream 的规则
- 允许该规则将数据写入数据库中特定设备 table 的 IAM 策略
现在问题:
- 是否可以配置一个通用规则来查看设备 ID 或有关 IoT 事物的某些信息,并根据此信息将其推送到正确的数据库 table?例如规则是否可以查看
id
维度并基于该维度将其推送到正确的 table? - 如果我们必须为数百万台设备中的每台设备设置这些项目中的每一项,如何实现自动化?
- 拥有数百万个特定于设备的策略和规则是否是实现此目的的最effective/efficient方式?
可以配置一组可以附加到 IoT 事物和用户的策略和规则,以绑定设备具有的访问权限以及最终用户具有的访问权限。
在高层次上可以完成以下操作:
- IoT 事物具有唯一链接到设备的证书
- 可以将策略链接到只允许设备发布到特定主题的证书
- 可以设置 IoT 代码规则以根据设备发布到的主题将数据推送到设备特定的时间流数据库
- 可以为最终用户授予访问特定时间流的读取权限table
Timestream 数据库的最小 IAM 资源解析是 table(参见 https://docs.aws.amazon.com/timestream/latest/developerguide/security_iam_service-with-iam.html),因此限制用户访问自己数据的唯一方法是将设备数据包含在自己的数据中table,然后授予用户访问 table 及其设备数据的权限。
1.物联网证书
这是基本 AWS IoT 核心事物设置的一部分。一旦设备拥有私钥和证书,它就可以连接到 IoT Core 并根据证书附带的策略publish/subscribe
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 数据库 table
您将需要创建时间流数据库和设备特定 table,其中 table 与事物同名,例如数据库 device_data
带有 table device_12345
首先要定义的是 IoT SQL 查询,它将 select 数据推送到规则中的时间流操作。在这种情况下,SQL 将是,
SELECT temperature FROM 'devices/data/+'
+
是一个通配符,select 是单个主题级别,即它将匹配 devices/data/device_12345
上的数据,但不匹配 devices/data/device_12345/more_data
上的数据。这将 select 来自任何设备的已发布数据的数据。
在 Timestream 操作中,数据库将是 device_data
并且 tableName
使用 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 角色来提供对数据库 tables 的写访问权限,并且必须在配置规则之前进行设置。创建角色 devices_to_timestream_role
并附加自定义策略以允许写入数据库的 table。政策是
{
"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": "*"
}
]
}
此策略允许写入 any table 因为它会被许多不同的事物用来写入数据。尽管此策略允许写入任何 table,但事物证书策略和规则查询限制 table 特定事物可以写入的内容。
可以使用以下命令从命令行编写 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 中的模式访问其设备数据。
总结:
此配置提供,
- 一个通用策略,可以附加到任何事物以允许它发布到具有事物特定名称的主题
- 将所有数据推送到 Timestream 数据库中特定事物 table 的通用规则
- 用户只能访问链接到其 AWS 身份的事物数据
除了此处描述的内容,您还需要,
- 一种在首次创建或连接新事物时创建新 table 的自动化方法
- 一种将访问权限附加到用户身份的机制