

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

# 创建子部署
<a name="create-subdeployments"></a>

**注意**  
子部署功能适用于 Greengrass Nucleus 版本 2.9.0 及更高版本。Greengrass Nucleus 的早期组件版本无法将配置部署到子部署中。

子部署是针对父部署中较小设备子集的部署。您可以使用子部署将配置部署到较小的设备子集中。您还可以创建子部署，在父部署中的一台或多台设备失败时来重试不成功的父部署。借助此功能，您可以选择在父部署中失败的设备，然后创建一个子部署来测试配置，直到子部署成功。子部署成功后，您可以将该配置重新部署到父部署。

按照本节中的步骤操作，创建子部署并检查其状态。有关如何创建部署的更多信息，请参阅[创建部署](https://docs.aws.amazon.com/greengrass/v2/developerguide/create-deployments.html)。

**创建子部署（AWS CLI）**

1. <a name="create-subdeployments-step1"></a>运行以下命令以检索事物组的最新部署。将命令中的 ARN 替换为要查询的事物组的 ARN。将 `--history-filter` 设置为 **LATEST\$1ONLY**，查看该事物组的最新部署。

   ```
   aws greengrassv2 list-deployments --target-arn arn:aws:iot:region:account-id:thinggroup/thingGroupName --history-filter LATEST_ONLY
   ```

1. 将响应中的 `deploymentId` 复制到 **list-deployments** 命令，以便在下一步中使用。

1. 运行以下命令以检索部署的状态。将 `deploymentId` 替换为要查询的部署的 ID。

   ```
   aws greengrassv2 get-deployment --deployment-id deploymentId
   ```

1. 将响应中的 `iotJobId` 复制到 **get-deployment** 命令中，以便在接下来的步骤中使用。

1. 运行以下命令以检索指定作业的作业执行列表。将 *jobID* 替换为上一步中的 `iotJobId`。将 *status* 替换为您要筛选的状态。您可以根据以下状态筛选结果：
   + `QUEUED`
   + `IN_PROGRESS`
   + `SUCCEEDED`
   + `FAILED`
   + `TIMED_OUT`
   + `REJECTED`
   + `REMOVED`
   + `CANCELED`

   ```
   aws iot list-job-executions-for-job --job-id jobID --status status
   ```

1. 为子部署创建新的 AWS IoT 事物组或使用现有事物组。然后，向该事物组中添加一个 AWS IoT 事物。您可以使用事物组来管理 Greengrass 核心设备实例集。将软件组件部署到设备时，可以将单个设备或设备组设为目标。您可以通过激活的 Greengrass 部署将设备添加到事物组。添加后，您可以将该事物组的软件组件部署到该设备上。

   要创建新的事物组并将您的设备添加到其中，请执行以下操作：

   1. 创建 AWS IoT 事物组。将 *MyGreengrassCoreGroup* 替换为新事物组的名称。请勿在事物组名称中使用半角冒号（:）。
**注意**  
如果将子部署的某个事物组用于一个 `parentTargetArn`，则无法在其他父实例集中重复使用该事物组。如果事物组已被用于为另一个实例集创建子部署，则 API 将返回错误。

      ```
      aws iot create-thing-group --thing-group-name MyGreengrassCoreGroup
      ```

      如果请求成功，将返回与以下示例类似的响应：

      ```
      {
        "thingGroupName": "MyGreengrassCoreGroup",
        "thingGroupArn": "arn:aws:iot:us-west-2:123456789012:thinggroup/MyGreengrassCoreGroup",
        "thingGroupId": "4df721e1-ff9f-4f97-92dd-02db4e3f03aa"
      }
      ```

   1. 将已预置的 Greengrass Nucleus 添加到您的事物组中。使用这些参数运行以下命令：
      + 将 *MyGreengrassCore* 替换为已预置的 Greengrass Nucleus 的名称。
      + 将 *MyGreengrassCoreGroup* 替换为您的事物组的名称。

      ```
      aws iot add-thing-to-thing-group --thing-name MyGreengrassCore --thing-group-name MyGreengrassCoreGroup
      ```

      如果请求成功，则该命令没有任何输出。

1. 创建一个名为 `deployment.json` 的文件，然后将以下 JSON 对象复制到该文件中。将 *targetArn* 替换为 AWS IoT 事物组的 ARN，作为子部署目标。子部署目标只能是事物组。事物组 ARN 采用以下格式：
   + **事物组** – `arn:aws:iot:region:account-id:thinggroup/thingGroupName`

   ```
   {
     "targetArn": "targetArn"
   }
   ```

1. 再次运行以下命令，获取原始部署的详细信息。这些详细信息包括元数据、组件和作业配置。将 *deploymentId* 替换为 [Step 1](#create-subdeployments-step1) 中的 ID。您可以使用此部署配置来配置您的子部署，并根据需要进行更改。

   ```
   aws greengrassv2 get-deployment --deployment-id deploymentId
   ```

   响应包含部署的详细信息。从 **get-deployment** 命令的响应中，将以下任何键值对复制到 `deployment.json` 中。您可以为子部署更改这些值。有关此命令的更多详细信息，请参阅 [GetDeployment](https://docs.aws.amazon.com/greengrass/v2/APIReference/API_GetDeployment.html)。
   + `components` – 部署的组件。要卸载组件，请将其从该对象中移除。
   + `deploymentName` – 部署的名称。
   + `deploymentPolicies` – 部署的策略。
   + `iotJobConfiguration` – 部署的作业配置。
   + `parentTargetArn` – 父部署的目标。
   + `tags` – 部署的标签。

1. 运行以下命令，从 `deployment.json` 创建子部署。将 *subdeploymentName* 替换为子部署的名称。

   ```
   aws greengrassv2 create-deployment --deployment-name subdeploymentName --cli-input-json file://deployment.json
   ```

   响应中包含标识此子部署的 `deploymentId`。您可以使用部署 ID 来检查部署的状态。有关更多信息，请参阅[检查部署状态](https://docs.aws.amazon.com/greengrass/v2/developerguide/check-deployment-status.html#check-cloud-deployment-status)。

1. 如果子部署成功，则可以使用其配置来修改父部署。复制在上一步中使用的 `deployment.json`。将 JSON 文件中的 `targetArn` 替换为父部署的 ARN，然后运行以下命令，使用此新配置创建父部署。
**注意**  
如果您创建父实例集的新部署修订版，它将替换该父部署的所有部署修订版和子部署。有关更多信息，请参阅[修改部署](https://docs.aws.amazon.com/greengrass/v2/developerguide/revise-deployments.html)。

   ```
   aws greengrassv2 create-deployment --cli-input-json file://deployment.json
   ```

   <a name="check-new-deployment-status"></a>响应中包含用于标识此部署的 `deploymentId`。您可以使用部署 ID 来检查部署的状态。有关更多信息，请参阅 [检查部署状态](check-deployment-status.md#check-cloud-deployment-status)。