动态事物组 - AWS IoT
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

动态事物组

动态事物组通过搜索查询更新组成员资格。使用动态事物组,您可以更改与事物的交互方式,具体取决于其连接、注册表或影子数据。

由于动态事物组与队列索引相关联,您必须启用队列索引服务才能使用它们。您可以先预览动态事物组中的事物,然后再使用队列索引搜索查询创建该组。有关更多信息,请参阅队列索引服务查询语法

您可以将动态事物组指定为作业的目标。只有满足定义动态事物组的条件的事物才能执行作业。

例如,假设您要更新设备上的固件,但为将更新中断的几率降至最低,您只希望更新电池电量大于 80% 的设备上的固件。您可以创建仅包括报告的电池电量大于 80% 的设备的动态事物组,并且可以使用该动态事物组作为固件更新作业的目标。只有满足您的电池电量条件的设备才能收到固件更新。在设备达到 80% 的电池电量条件后,它们会添加到动态事物组并接收固件更新。

有关将事物组指定为作业目标的更多信息,请参阅CreateJob

动态事物组与静态事物组在以下方面不同:

  • 未显式定义事物成员资格。要创建动态事物组,您必须定义一个查询字符串,用于定义组成员资格。

  • 动态事物组无法成为层次结构的一部分。

  • 不能将策略应用于动态事物组。

  • 您使用一组不同的命令来创建、更新和删除动态事物组。对于所有其他操作,用于与静态事物组交互的相同命令可用于与动态事物组交互。

  • 单个账户可以拥有的动态组数量受到限制

有关静态事物组的更多信息,请参阅静态事物组

例如,假设我们要创建一个动态组,其中包含仓库中温度高于 60 华氏度的所有房间。当房间温度为 61 度或更高时,它将被添加到 RoomTooWarm 动态事物组。RoomTooWarm 动态事物组中的所有房间都会打开冷却风扇。当一个房间的温度降至 60 度或更低时,将从动态事物组中移除该房间,并且其风扇将关闭。

创建动态事物组

使用 CreateDynamicThingGroup 命令创建动态事物组。要为房间太热的场景创建动态事物组,您可以使用 create-dynamic-thing-group CLI 命令:

$ aws iot create-dynamic-thing-group --thing-group-name "RoomTooWarm" --query-string "attributes.temperature>60"
注意

我们建议不要在您的动态事物组名称中使用个人身份信息。

CreateDynamicThingGroup 命令返回包含索引名称、查询字符串、查询版本,事物组名称、事物组 ID 和事物组 ARN 的响应:

{ "indexName": "AWS_Things", "queryVersion": "2017-09-30", "thingGroupName": "RoomTooWarm", "thingGroupArn": "arn:aws:iot:us-west-2:123456789012:thinggroup/RoomTooWarm", "queryString": "attributes.temperature>60\n", "thingGroupId": "abcdefgh12345678ijklmnop12345678qrstuvwx" }

动态事物组创建不是即时发生的。动态事物组回填需要一些时间才能完成。在创建动态事物组时,该组的状态设置为 BUILDING。在回填完成后,状态变为 ACTIVE。要查看动态事物组的状态,请使用 DescribeThingGroup 命令。

描述动态事物组

使用 DescribeThingGroup 命令获取有关动态事物组的信息:

$ aws iot describe-thing-group --thing-group-name "RoomTooWarm"

DescribeThingGroup 命令返回有关指定组的信息:

{ "status": "ACTIVE", "indexName": "AWS_Things", "thingGroupName": "RoomTooWarm", "thingGroupArn": "arn:aws:iot:us-west-2:123456789012:thinggroup/RoomTooWarm", "queryString": "attributes.temperature>60\n", "version": 1, "thingGroupMetadata": { "creationDate": 1548716921.289 }, "thingGroupProperties": {}, "queryVersion": "2017-09-30", "thingGroupId": "84dd9b5b-2b98-4c65-84e4-be0e1ecf4fd8" }

在动态事物组上运行 DescribeThingGroup 返回特定于动态事物组的属性,如 queryString 和状态。

动态事物组的状态可以采用以下值:

ACTIVE

动态事物组已准备就绪,可供使用。

BUILDING

正在创建动态事物组,并且正在处理事物成员资格。

REBUILDING

正在按照组的搜索查询的调整更新动态事物组的成员资格。

注意

在创建动态事物组后,您可以使用该组,而不必考虑其状态。只有 ACTIVE 状态的动态事物组包括与该动态事物组的搜索查询匹配的所有事物。BUILDINGREBUILDING 状态的动态事物组可能未包括与搜索查询匹配的所有事物。

更新动态事物组

使用 UpdateDynamicThingGroup 命令更新动态事物组的属性,包括组的搜索查询。以下命令更新事物组描述和查询字符串,同时将成员资格条件更改为温度 > 65:

$ aws iot update-dynamic-thing-group --thing-group-name "RoomTooWarm" --thing-group-properties "thingGroupDescription=\"This thing group contains rooms warmer than 65F.\"" --query-string "attributes.temperature>65"

UpdateDynamicThingGroup 命令返回一个响应,其中包含该组更新后的版本号:

{ "version": 2 }

动态事物组更新不是即时发生的。动态事物组回填需要一些时间才能完成。在更新动态事物组时,该组的状态变为 REBUILDING,同时该组更新其成员资格。在回填完成后,状态变为 ACTIVE。要查看动态事物组的状态,请使用 DescribeThingGroup 命令。

删除动态事物组

使用 DeleteDynamicThingGroup 命令删除动态事物组:

$ aws iot delete-dynamic-thing-group --thing-group-name "RoomTooWarm"

DeleteDynamicThingGroup 命令不会生成任何输出。

在更新云中的记录时,显示事物所属的组的命令(例如,ListGroupsForThing)可能会继续显示该组。

限制和冲突

动态事物组与静态事物组共用这些限制:

  • 事物组可以拥有的属性数量受到限制

  • 一个事物可以属于的组数受到限制

  • 无法重命名事物组。

  • 事物组名称不能包含国际字符,如 û、é 和 ñ。

在使用动态事物组时,请记住以下内容。

必须已启用队列索引服务

必须已启用队列索引服务并且队列索引回填必须已完成,然后您才能创建并使用动态事物组。启用队列索引服务后,预计会有延迟。回填可能需要一些时间才能完成。您注册的事物越多,回填过程所需的时间就越长。在为动态事物组启用队列索引服务后,您将无法禁用它,直到您删除所有动态事物组。

注意

如果您有权查询队列索引,则可以访问整个队列的事物数据。

动态事物组的数量受到限制

动态组的数量受到限制

成功的命令可能记录错误

创建或更新动态事物组时,有些事物可能符合处于动态事物组中的条件,但尚未添加到动态事物组中。在这些情况下,尽管会记录错误和生成 AddThingToDynamicThingGroupsFailed 指标,但创建或更新动态事物组的命令依旧会获得成功。

当符合条件的事物无法添加到动态事物组或从动态事物组中删除事物以将其添加到另一个组时,将在 CloudWatch 日志中为每个事物创建错误日志条目。当事物无法添加到动态组时,也会创建一个 AddThingToDynamicThingGroupsFailed 指标;但一个指标可以表示多个日志条目。

当某个事物有资格添加到动态事物组时,将考虑以下事项:

  • 事物是否已经位于尽可能多的组中了? (请参阅限制

    • 否:该事物被添加到动态事物组中。

    • 是:该事物是任何动态事物组的成员吗?

      • 否:无法将该事物添加到动态事物组,记录错误,并生成 AddThingToDynamicThingGroupsFailed 指标

      • 是:要加入的动态事物组是否早于该事物已成为其成员的任何动态事物组?

当动态事物组中的事物不再满足搜索查询时,将从动态事物组中删除它。同样,当某个事物已更新以满足动态事物组的搜索查询时,它会被添加到前面介绍的组中。这些添加和删除操作是正常的,不会产生错误记录条目。

在启用 overrideDynamicGroups 的情况下,静态组优先于动态组

一个事物可以属于的组数受到限制。当您使用 AddThingToThingGroupUpdateThingGroupsForThing 命令更新事物成员资格时,添加 --overrideDynamicGroups 参数会使静态事物组优先于动态事物组。

将事物添加到静态事物组时,应考虑以下因素:

  • 事物是否已经属于最大数量的组?

    • 否:该事物被添加到静态事物组中。

    • 是:该事物是否在任何动态组中?

      • 否:该事物无法添加到该事物组中。该命令引发异常。

      • 是:是否已启用 --overrideDynamicGroups

        • 否:该事物无法添加到该事物组中。该命令引发异常。

        • 是:从最近创建的动态事物组中删除该事物,记录错误,并针对从中删除该事物的动态事物组生成 AddThingToDynamicThingGroupsFailed 指标 。然后,该事物被添加到静态事物组。

旧动态事物组优先于新动态事物组

一个事物可以属于的组数受到限制。当某个事物因创建或更新操作而有资格添加到动态事物组,而该事物已经在尽可能多的组中时,可以从另一个动态事物组中删除该事物以允许此添加。有关如何发生这种情况的更多信息,请参阅成功的命令可能记录错误在启用 overrideDynamicGroups 的情况下,静态组优先于动态组了解示例。

当从动态事物组中删除事物时,将记录错误,并引发事件。

无法将策略应用于动态事物组

尝试将策略应用于动态事物组会生成异常。

动态事物组成员资格具有最终一致性

只为注册表评估事物的最终状态。如果状态快速更新,则可跳过中间状态。避免将规则、作业、 与其成员资格依赖中间状态的动态事物组相关联。