

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 动态事物组
<a name="dynamic-thing-groups"></a>

动态事物组是根据注册表中的特定搜索查询创建的。设备连接、设备影子创建和 AWS IoT Device Defender 违规数据等搜索查询参数均支持此功能。动态事物组需要启用实例集索引，才能搜索和聚合设备的数据并对其编制索引。您可以先使用实例集索引搜索查询预览动态事物组中的事物，然后再创建该组。有关更多信息，请参阅[机群索引](iot-indexing.md)和[查询语法](query-syntax.md)。

**注意**  
动态事物组操作按注册表操作进行计量。有关更多信息，请参阅 [AWS IoT Core 其它计量详细信息](https://aws.amazon.com/iot-core/pricing/additional-details/)。

动态事物组与静态事物组在以下方面不同：
+ 未显式定义事物成员资格。要创建动态事物组，请定义一个[搜索查询字符串](example-queries.md)来确定组成员资格。
+ 动态事物组不能成为层次结构的一部分。
+ 不能将策略应用于动态事物组。
+ 您使用一组不同的命令来创建、更新和删除动态事物组。对于所有其他操作，您可以对两种类型的事物组使用相同的命令。
+ 每个动态组的数量 AWS 账户 是[有限](https://docs.aws.amazon.com//general/latest/gr/iot_device_management.html#thing-group-limits)的。
+ 请勿在事物组名称中使用个人身份信息。事物组名称可以出现在未加密的通信和报告中。

有关静态事物组的更多信息，请参阅 [静态事物组](thing-groups.md)。

## 动态事物组的使用案例
<a name="dynamic-thing-group-use-cases"></a>

您可将动态事物组用于以下使用案例：

### 将动态事物组指定为任务的目标。
<a name="dynamic-thing-group-use-cases-jobs"></a>

通过创建将动态事物组作为目标的连续任务，您可以在设备满足所需条件时自动定位到设备。条件可以是连接状态，也可以是存储在注册表或影子中的任何条件，例如软件版本或型号。如果某件事物未出现在动态事物组中，则它不会从该任务接收任务文档。

例如，如果您的设备实例集需要更新固件以最大限度地降低更新过程中出现中断的风险，且您只想在电池电量大于 80% 的设备上更新固件。您可以创建一个名为 80 的动态事物组PercentBatteryLife ，该组仅包含电池续航时间超过 80% 的设备，并将其用作工作的目标。只有满足您的电池电量条件的设备才将收到固件更新。在设备达到 80% 的电池电量条件后，它们会自动添加到动态事物组并将接收固件更新。

您可能还有固件或操作系统各不相同的多个设备型号，因此需要不同版本的新软件更新。对于具有连续任务的动态组，这是最常见的使用案例，您可以在其中为每种设备型号、固件和操作系统组合创建一个动态组。然后，您可以为每个动态组设置连续任务，以便在设备根据定义的条件自动成为这些组的成员时向其推送软件更新。

有关将事物组指定为任务目标的更多信息，请参阅[CreateJob](https://docs.aws.amazon.com//iot/latest/apireference/API_CreateJob.html)。

### 使用动态组成员资格更改来执行所需的操作
<a name="dynamic-thing-group-use-cases-actions"></a>

每次将设备添加到动态事物组或从动态事物组中将其移除时，都会在[注册表事件](https://docs.aws.amazon.com//iot/latest/developerguide/registry-events.html)更新过程中向 MQTT 主题发送通知。您可以配置[AWS IoT Core 规则](https://docs.aws.amazon.com//iot/latest/developerguide/iot-rules.html)，根据动态群组成员资格更新与 AWS 服务进行交互并采取所需的操作。示例操作包括写入 Amazon DynamoDB、调用 Lambda 函数或者向 Amazon SNS 发送通知。

### 将设备添加到动态事物组以进行自动违规检测
<a name="dynamic-thing-group-use-cases-dd"></a>

AWS IoT Device Defender Detect 客户可以在动态事物组上定义[安全配置文件](https://docs.aws.amazon.com//iot/latest/developerguide/device-defender-detect.html)。动态事物组上定义的安全配置文件会自动检测该事物组的设备是否存在违规行为。

### 在动态事物组上设置日志级别，以使用精细日志记录级别来观察设备
<a name="dynamic-thing-group-use-cases-log"></a>

您可以为动态事物组指定日志级别。如果您只想为满足特定条件的设备自定义日志级别和详细信息，则此功能非常有用。例如，如果您怀疑具有特定固件版本的设备在特定规则的已发布主题上导致错误，则可能需要设置详细的日志记录来调试这些问题。在这种情况下，您可以为所有具有此固件版本的设备创建一个动态组，我们假设该固件版本存储为注册表属性或存储在设备影子中。然后，您可以设置调试级别，并将日志记录目标定义为该动态事物组。有关精细日志记录的更多信息，请参阅[AWS IoT 使用日志进行 CloudWatch 监控](https://docs.aws.amazon.com//iot/latest/developerguide/cloud-watch-logs.html#fine-grained-logging)。有关如何为特定事物组指定日志记录级别的更多信息，请参阅[在 AWS IoT中配置资源特定的日志记录（CLI）](https://docs.aws.amazon.com//iot/latest/developerguide/configure-logging.html#fine-logging-cli)。

## 创建动态事物组
<a name="create-dynamic-thing-group"></a>

使用 **CreateDynamicThingGroup** 命令创建动态事物组。要为 80 PercentBatteryLife 场景创建动态事物组，请使用 **create-dynamic-thing-group** CLI 命令：

```
$ aws iot create-dynamic-thing-group --thing-group-name "80PercentBatteryLife" --query-string "attributes.batterylife80"
```

**注意**  
请勿在您的动态事物组名称中使用个人身份信息。

**CreateDynamicThingGroup** 命令返回响应。该响应包含索引名称、查询字符串、查询版本，事物组名称、事物组 ID 和事物组的 Amazon 资源名称（ARN）：

```
{
    "indexName": "AWS_Things", 
    "queryVersion": "2017-09-30", 
    "thingGroupName": "80PercentBatteryLife", 
    "thingGroupArn": "arn:aws:iot:us-west-2:123456789012:thinggroup/80PercentBatteryLife", 
    "queryString": "attributes.batterylife80\n", 
    "thingGroupId": "abcdefgh12345678ijklmnop12345678qrstuvwx"
}
```

动态事物组的创建并非一蹴而就。动态事物组回填需要一些时间才能完成。在创建动态事物组时，该组的状态设置为 `BUILDING`。在回填完成后，状态变为 `ACTIVE`。要检查动态事物组的状态，请使用[DescribeThingGroup](https://docs.aws.amazon.com/iot/latest/apireference/API_DescribeThingGroup.html)命令。

## 描述动态事物组
<a name="describe-dynamic-thing-group"></a>

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

```
$ aws iot describe-thing-group --thing-group-name "80PercentBatteryLife"
```

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

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

在动态事物组上运行 **DescribeThingGroup** 会返回特定于动态事物组的属性。例如，返回的属性有 queryString 和 status。

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

`ACTIVE`  
动态事物组已准备就绪，可供使用。

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

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

**注意**  
在创建动态事物组后，就可以使用该组，而不必考虑其状态。只有 `ACTIVE` 状态的动态事物组包括与该动态事物组的搜索查询匹配的所有事物。`BUILDING` 和 `REBUILDING` 状态的动态事物组可能未包括与搜索查询匹配的所有事物。

## 更新动态事物组
<a name="update-dynamic-thing-group"></a>

使用 **UpdateDynamicThingGroup** 命令更新动态事物组的属性，包括组的搜索查询。以下命令更新两个属性。一个是事物组描述，另一个是将成员资格条件更改为电池电量 > 85 的查询字符串：

```
$ aws iot update-dynamic-thing-group --thing-group-name "80PercentBatteryLife" --thing-group-properties "thingGroupDescription=\"This thing group contains devices with a battery life greater than 85 percent.\"" --query-string "attributes.batterylife85"
```

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

```
{
    "version": 2
}
```

动态事物组的更新不会立即反映出来。动态事物组回填需要一些时间才能完成。在更新动态事物组时，该组的状态变为 `REBUILDING`，同时该组会更新其成员资格。在回填完成后，状态变为 `ACTIVE`。要检查动态事物组的状态，请使用[DescribeThingGroup](https://docs.aws.amazon.com/iot/latest/apireference/API_DescribeThingGroup.html)命令。

## 删除动态事物组
<a name="delete-dynamic-thing-group"></a>

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

```
$ aws iot delete-dynamic-thing-group --thing-group-name "80PercentBatteryLife"
```

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

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

## 动态事物组和静态事物组限制
<a name="dynamic-static-thing-group-limitations"></a>

动态事物组与静态事物组都具有以下限制：
+ 事物组可以拥有的属性数量[有限](https://docs.aws.amazon.com//general/latest/gr/iot_device_management.html#thing-group-limits)。
+ 一个事物可以属于的组数[受到限制](https://docs.aws.amazon.com//general/latest/gr/iot_device_management.html#thing-group-limits)。
+ 您无法重命名事物组。
+ 事物组名称不能包含国际字符，如 û、é 和 ñ。

## 动态事物组限制
<a name="dynamic-thing-group-limitations"></a>

动态事物组具有以下限制：

### 机群索引
<a name="indexing-backfill-conflict"></a>

启用实例集索引服务后，您就可以在设备实例集上执行搜索查询。在实例集索引回填完成后，您就可以创建和管理动态事物组。回填过程的完成时间直接受在 AWS 云中注册的设备实例集大小的影响。在为动态事物组启用实例集索引服务后，您将无法禁用它，直到您删除所有动态事物组。

**注意**  
如果您有权查询实例集索引，可以访问整个实例集的事物数据。

### 动态事物组的数量有限
<a name="dynamic-thing-groups-limited"></a>

动态事物组的数量[有限](https://docs.aws.amazon.com//general/latest/gr/iot_device_management.html#thing-group-limits)。

### 成功的命令可能记录错误
<a name="log-errors"></a>

创建或更新动态事物组时，有些事物可能符合加入到动态事物组中的条件，但尚未添加到动态事物组中。这种情况将导致成功执行创建或更新命令，同时记录错误并生成 [`AddThingToDynamicThingGroupsFailed` 指标](metrics_dimensions.md#iot-metrics)。一个指标可以代表多个日志条目。

发生以下情况时，将在 CloudWatch 日志中创建[错误日志条目](https://docs.aws.amazon.com/iot/latest/apireference/cwl-format.html#dynamic-group-logs)：
+ 符合条件的事物无法添加到动态事物组中。
+ 将事物从动态事物组中移除，然后将其添加到另一个组。

当某个事物有资格添加到动态事物组时，应考虑以下因素：
+ 事物是否已经位于尽可能多的组中了？ （请参阅[限制](https://docs.aws.amazon.com//general/latest/gr/iot_device_management.html#thing-limits)）
  + **否：**该事物被添加到动态事物组中。
  + **是：**该事物是任何动态事物组的成员吗？
    + **否：**无法将该事物添加到动态事物组，记录错误，并生成 [`AddThingToDynamicThingGroupsFailed` 指标](metrics_dimensions.md#iot-metrics)。
    + **是：**要加入的动态事物组是否早于该事物已成为其成员的任何动态事物组？
      + **否：**无法将该事物添加到动态事物组，记录错误，并生成 [`AddThingToDynamicThingGroupsFailed` 指标](metrics_dimensions.md#iot-metrics)。
      + **是：**从最新的动态事物组中删除该事物，记录错误，然后将该事物添加到所需的动态事物组中。这会生成一个错误，并针对从中删除该事物的动态事物组生成一个 [`AddThingToDynamicThingGroupsFailed` 指标](metrics_dimensions.md#iot-metrics)。

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

### 在启用 `overrideDynamicGroups` 的情况下，静态组优先于动态组
<a name="membership-limit"></a>

一个事物可以属于的组数[受到限制](https://docs.aws.amazon.com//general/latest/gr/iot_device_management.html#thing-limits)。当您使用[AddThingToThingGroup](https://docs.aws.amazon.com/iot/latest/apireference/API_AddThingToThingGroup.html)或[UpdateThingGroupsForThing](https://docs.aws.amazon.com/iot/latest/apireference/API_UpdateThingGroupsForThing.html)命令更新事物成员资格时，添加`--overrideDynamicGroups`参数会使静态事物组优先于动态事物组。

将事物添加到静态事物组时，应考虑以下因素：
+ 事物是否已经属于最大数量的组？
  + **否：**该事物被添加到静态事物组中。
  + **是：**该事物是否在任何动态组中？
    + **否：**该事物无法添加到该事物组中。该命令引发异常。
    + **是：**是否已启用 **--overrideDynamicGroups**？
      + **否：**该事物无法添加到该事物组中。该命令引发异常。
      + **是：**从最近创建的动态事物组中删除该事物，记录错误，并针对从中删除该事物的动态事物组生成 [`AddThingToDynamicThingGroupsFailed` 指标](metrics_dimensions.md#iot-metrics)。然后，该事物被添加到静态事物组。

### 旧动态事物组优先于新动态事物组
<a name="group-priorities"></a>

一个事物可以属于的组数[受到限制](https://docs.aws.amazon.com//general/latest/gr/iot_device_management.html#thing-limits)。当创建或更新操作为某事物创建了其他组资格并且该事物已达到其组限制时，可能会从另一个动态事物组中移除该事物，然后才会执行此添加操作。有关如何发生这种情况的更多信息，请参阅 [成功的命令可能记录错误](#log-errors) 和 [在启用 `overrideDynamicGroups` 的情况下，静态组优先于动态组](#membership-limit) 了解示例。

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

### 无法将策略应用于动态事物组
<a name="apply-policy"></a>

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

### 动态事物组成员资格具有最终一致性
<a name="update-conflict"></a>

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