

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 動態物件群組
<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% 的裝置上更新韌體。您可以建立名為 80PercentBatteryLife的動態物件群組，只包含電池壽命超過 80% 的裝置，並將其用作任務的目標。只有符合您電池壽命條件的裝置才會收到韌體更新。當裝置達到 80% 的電池壽命條件時，它們會自動新增至動態物件群組，並會收到韌體更新。

您也可以擁有多個具有不同韌體或作業系統的裝置模型，因此需要不同版本的新軟體更新。這是具有連續任務的動態群組最常見的使用案例，您可以在其中為每個裝置模型、韌體和作業系統組合建立動態群組。然後，您可以為每個這些動態群組設定連續任務，以在裝置根據定義的條件自動成為這些群組的成員時推送軟體更新。

如需將物件群組指定為任務目標的詳細資訊，請參閱 [CreateJob](https://docs.aws.amazon.com//iot/latest/apireference/API_CreateJob.html)。

### 使用動態群組成員資格變更來執行所需的動作
<a name="dynamic-thing-group-use-cases-actions"></a>

每次在動態物件群組中新增或移除裝置時，都會傳送通知至 MQTT 主題，做為[登錄事件](https://docs.aws.amazon.com//iot/latest/developerguide/registry-events.html)更新的一部分。您可以設定[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 Logs 進行監控](https://docs.aws.amazon.com//iot/latest/developerguide/cloud-watch-logs.html#fine-grained-logging)。如需如何為特定物件群組指定記錄層級的詳細資訊，請參閱[設定資源特定的登入 AWS IoT](https://docs.aws.amazon.com//iot/latest/developerguide/configure-logging.html#fine-logging-cli)。

## 建立動態物件群組
<a name="create-dynamic-thing-group"></a>

使用 **CreateDynamicThingGroup** 命令建立動態物件群組。若要為 80PercentBatteryLife 案例建立動態物件群組，請使用 **create-dynamic-thing-group** CLI 命令：

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

**注意**  
請勿在動態物件群組名稱中使用個人識別資訊。

**CreateDynamicThingGroup** 命令會傳回回應。回應包含索引名稱、查詢字串、查詢版本、物件群組名稱、物件群組 ID 和物件群組的 Amazon Resource Name (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 和 狀態。

動態物件群組的狀態可能會需要以下的值：

`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>

只會針對登錄檔對物件的最終狀態進行評估。如果狀態快速更新，可能會略過中繼狀態。避免將規則或任務與成員資格取決於中間狀態的動態物件群組建立關聯。