

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

# 教程：运行 AWS IoT 设备客户端教程后进行清理
<a name="iot-dc-cleanup"></a>

本教程中的过程将指导您在完成本学习路径中的教程时删除创建的文件和资源。

**Topics**
+ [步骤 1：使用设备客户端制作演示后清理 AWS IoT 设备](#iot-dc-cleanup-devices)
+ [第 2 步：使用 AWS IoT 设备客户端 AWS 账户 在构建演示之后清理你的](#iot-dc-cleanup-cloud)

## 步骤 1：使用设备客户端制作演示后清理 AWS IoT 设备
<a name="iot-dc-cleanup-devices"></a>

本教程介绍了在此学习路径中构建演示后如何清理 microSD 卡的两个选项。选择提供所需安全级别的选项。

请注意，清理设备的 microSD 卡并不会移除您 AWS IoT 创建的任何资源。要在清理设备的 microSD 卡后清理 AWS IoT 资源，您应该查看上面的教程。[第 2 步：使用 AWS IoT 设备客户端 AWS 账户 在构建演示之后清理你的](#iot-dc-cleanup-cloud)

### 选项 1：通过重写 microSD 卡进行清理
<a name="iot-dc-cleanup-devices-flash"></a>

在完成本学习路径中的教程之后，清理 microSD 卡最简单、最彻底的方法是用您在首次准备设备时创建的保存图像文件覆盖 microSD 卡。

此过程使用本地主机将保存的 microSD 卡映像写入 microSD 卡。

**注意**  
如果您的设备没有将可移动存储介质用于操作系统，请参阅该设备的步骤。

**要向 microSD 卡写入一个新映像**

1. 在本地主机上，找到要写入 microSD 卡的已保存 microSD 卡映像。

1. 将 microSD 卡插到您的计算机上。

1. 使用 SD 卡成像工具，将选定的图像文件写入 microSD 卡。

1. 将 Raspberry Pi 操作系统映像写入 microSD 卡后，弹出 microSD 卡并将其从本地主机安全地移除。

您的 microSD 卡已准备就绪，可供使用。

### 选项 2：通过删除用户目录进行清理
<a name="iot-dc-cleanup-devices-dirs"></a>

要在完成教程后清理 microSD 卡而不重写 microSD 卡映像，可以单独删除用户目录。这并不像从保存的图像中重写 microSD 卡那么彻底，因为它不会删除可能已安装的任何系统文件。

如果删除用户目录足以满足您的需要，可以按照此步骤操作。

**从设备中删除此学习路径的用户目录**

1. 运行这些命令可以在连接到设备的终端窗口中删除在此学习路径中创建的用户目录、子目录及其所有文件。
**注意**  
删除这些目录和文件后，如果不再完成教程，您将无法运行演示。

   ```
   rm -Rf ~/dc-configs
   rm -Rf ~/policies
   rm -Rf ~/messages
   rm -Rf ~/certs
   rm -Rf ~/.aws-iot-device-client
   ```

1. 在连接到设备的终端窗口中，运行这些命令删除应用程序源目录和文件。
**注意**  
这些命令不会卸载任何程序。他们只删除用于构建和安装它们的源文件。删除这些文件后， AWS CLI 和 AWS IoT 设备客户端可能无法运行。

   ```
   rm -Rf ~/aws-cli
   rm -Rf ~/aws
   rm -Rf ~/aws-iot-device-client
   ```

## 第 2 步：使用 AWS IoT 设备客户端 AWS 账户 在构建演示之后清理你的
<a name="iot-dc-cleanup-cloud"></a>

这些过程可帮助您识别和删除您在完成本学习路径中的教程时创建的 AWS 资源。

### 清理 AWS IoT 资源
<a name="iot-dc-cleanup-cloud-iot"></a>

此过程可帮助您识别和删除您在完成本学习路径中的教程时创建的 AWS IoT 资源。


**AWS IoT 在此学习路径中创建的资源**  

| 教程 | 事物资源 | 策略资源 | 
| --- | --- | --- | 
|  [教程：安装和配置 AWS IoT 设备客户端](iot-dc-install-dc.md)  |  **DevCliTestThing**  | DevCliTestThingPolicy | 
|  [教程：演示与 AWS IoT 设备客户端的 MQTT 消息通信](iot-dc-testconn.md)  |  **PubSubTestThing**  | PubSubTestThingPolicy | 
|  [教程：使用 AWS IoT 设备客户端演示远程操作（作业）](iot-dc-runjobs.md)  | 定义的用户（可能有不止一个） |  *定义的用户*（可能有不止一个）  | 

**要删除 AWS IoT 资源，请针对您创建的每个事物资源执行以下步骤**

1. 将 `thing_name` 替换为要删除的对象资源的名称，然后运行此命令列出从本地主机附加到对象资源的证书。

   ```
   aws iot list-thing-principals --thing-name thing_name
   ```

   此命令返回类似这样的响应，其中列出了附加到 `thing_name`的证书。在大多数情况下，列表中只有一个证书。

   ```
   {
       "principals": [
           "arn:aws:iot:us-west-2:57EXAMPLE833:cert/23853eea3cf0edc7f8a69c74abeafa27b2b52823cab5b3e156295e94b26ae8ac"
       ]
   }
   ```

1. 对于上一个命令列出的每个证书：

   1. 将 `certificate_ID`替换为上一个命令中的证书 ID。证书ID是上一个命令返回的 ARN 中遵循 `cert/`的字母数字字符。然后运行此命令以停用证书。

      ```
      aws iot update-certificate --new-status INACTIVE --certificate-id certificate_ID
      ```

      如果成功，该命令不返回任何内容。

   1. 将 `certificate_ARN` 替换为之前返回的证书列表中的证书 ARN，然后运行此命令列出附加到此证书的策略。

      ```
      aws iot list-attached-policies --target certificate_ARN
      ```

      此命令返回类似这样的响应，其中列出了附加到证书的策略。在大多数情况下，列表中只有一个策略。

      ```
      {
          "policies": [
              {
                  "policyName": "DevCliTestThingPolicy",
                  "policyArn": "arn:aws:iot:us-west-2:57EXAMPLE833:policy/DevCliTestThingPolicy"
              }
          ]
      }
      ```

   1. 对于附加到该证书的每个策略。

      1. 将 `policy_name` 替换为上一个命令中的 `policyName` 值，将 `certificate_ARN` 替换为证书的 ARN，然后运行此命令将策略与证书分离。

         ```
         aws iot detach-policy --policy-name policy_name --target certificate_ARN
         ```

         如果成功，该命令不返回任何内容。

      1. 将 `policy_name` 替换为 `policyName` 值，然后运行此命令查看策略是否附加到其他证书。

         ```
         aws iot list-targets-for-policy --policy-name policy_name
         ```

         如果该命令返回这样的空列表，该策略不会附加到任何证书，您将继续列出策略版本。如果还有附加到策略的证书，请继续 **detach-thing-principal** 步骤。

         ```
         {
             "targets": []
         }
         ```

      1. 将 `policy_name` 替换为 `policyName` 值，然后运行此命令检查策略版本。要删除策略，它必须只有一个版本。

         ```
         aws iot list-policy-versions --policy-name policy_name
         ```

         如果策略只有一个版本（如此示例），则可以跳至步骤 **delete-policy** 立即删除策略。

         ```
         {
             "policyVersions": [
                 {
                     "versionId": "1",
                     "isDefaultVersion": true,
                     "createDate": "2021-11-18T01:02:46.778000+00:00"
                 }
             ]
         }
         ```

         如果策略有多个版本，如本例所示，则必须先删除 `false` 值为 `isDefaultVersion` 的策略版本，然后才能删除策略。

         ```
         {
             "policyVersions": [
                 {
                     "versionId": "2",
                     "isDefaultVersion": true,
                     "createDate": "2021-11-18T01:52:04.423000+00:00"
                 },
                 {
                     "versionId": "1",
                     "isDefaultVersion": false,
                     "createDate": "2021-11-18T01:30:18.083000+00:00"
                 }
             ]
         }
         ```

         如果您需要删除策略版本，将 `policy_name` 替换为 `policyName` 值，将 `version_ID` 替换为来自上一个命令的 `versionId`值，然后运行此命令删除策略版本。

         ```
         aws iot delete-policy-version --policy-name policy_name --policy-version-id version_ID
         ```

         如果成功，该命令不返回任何内容。

         删除策略版本后，请重复此步骤，直到该策略只有一个策略版本。

      1. 将 `policy_name`替换为 `policyName` 值，然后运行此命令删除策略。

         ```
         aws iot delete-policy --policy-name policy_name
         ```

   1. 将 `thing_name` 替换为事物名称，将 `certificate_ARN` 替换为证书的 ARN，然后运行此命令将证书与事物资源分离。

      ```
      aws iot detach-thing-principal --thing-name thing_name --principal certificate_ARN
      ```

      如果成功，该命令不返回任何内容。

   1. 将 `certificate_ID`替换为上一个命令中的证书 ID。证书 ID 是上一个命令返回的 ARN 中遵循 `cert/`的字母数字字符。运行这个命令删除证书资源。

      ```
      aws iot delete-certificate --certificate-id certificate_ID
      ```

      如果成功，该命令不返回任何内容。

1. 将 `thing_name`替换为事物名称，然后运行此命令删除该事物。

   ```
   aws iot delete-thing --thing-name thing_name
   ```

   如果成功，该命令不返回任何内容。

### 清理 AWS 资源
<a name="iot-dc-cleanup-cloud-aws"></a>

此过程可帮助您识别和删除您在完成本学习路径中的教程时创建的其他 AWS 资源。


**在此学习路径中创建的其他 AWS 资源**  

| 教程 | 资源类型 | 资源名称或 ID | 
| --- | --- | --- | 
|  [教程：使用 AWS IoT 设备客户端演示远程操作（作业）](iot-dc-runjobs.md)  | Amazon S3 对象 | hello-world-job.json | 
|  [教程：使用 AWS IoT 设备客户端演示远程操作（作业）](iot-dc-runjobs.md)  |  AWS IoT 工作资源  | 定义的用户 | 

**删除在此学习路径中创建的 AWS 资源**

1. 要删除在此学习路径中创建的职位

   1. 运行此命令列出您的中的作业 AWS 账户。

      ```
      aws iot list-jobs
      ```

      该命令会返回你的 AWS IoT 任务列表 AWS 账户 AWS 区域 ，如下所示。

      ```
      {
          "jobs": [
              {
                  "jobArn": "arn:aws:iot:us-west-2:57EXAMPLE833:job/hello-world-job-2",
                  "jobId": "hello-world-job-2",
                  "targetSelection": "SNAPSHOT",
                  "status": "COMPLETED",
                  "createdAt": "2021-11-16T23:40:36.825000+00:00",
                  "lastUpdatedAt": "2021-11-16T23:40:41.375000+00:00",
                  "completedAt": "2021-11-16T23:40:41.375000+00:00"
              },
              {
                  "jobArn": "arn:aws:iot:us-west-2:57EXAMPLE833:job/hello-world-job-1",
                  "jobId": "hello-world-job-1",
                  "targetSelection": "SNAPSHOT",
                  "status": "COMPLETED",
                  "createdAt": "2021-11-16T23:35:26.381000+00:00",
                  "lastUpdatedAt": "2021-11-16T23:35:29.239000+00:00",
                  "completedAt": "2021-11-16T23:35:29.239000+00:00"
              }
          ]
      }
      ```

   1. 对于您从列表中识别为在此学习路径中创建的作业的每项作业，请`jobId`替换为要删除的作业的`jobId`值，然后运行此命令删除 AWS IoT 作业。

      ```
      aws iot delete-job --job-id jobId
      ```

      如果命令成功，该命令不返回任何内容。

1. 要删除您在此学习路径中存储在 Amazon S3 存储桶中的任务文档。

   1. 将 `bucket`替换为您使用的存储桶名称，然后运行此命令列出您使用的 Amazon S3 存储桶中的对象。

      ```
      aws s3api list-objects --bucket bucket
      ```

      该命令返回存储桶中 Amazon S3 对象的列表，该列表如下所示。

      ```
      {
          "Contents": [
              {
                  "Key": "hello-world-job.json",
                  "LastModified": "2021-11-18T03:02:12+00:00",
                  "ETag": "\"868c8bc3f56b5787964764d4b18ed5ef\"",
                  "Size": 54,
                  "StorageClass": "STANDARD",
                  "Owner": {
                      "DisplayName": "EXAMPLE",
                      "ID": "e9e3d6ec1EXAMPLEf5bfb5e6bd0a2b6ed03884d1ed392a82ad011c144736a4ee"
                  }
              },
              {
                  "Key": "iot_job_firmware_update.json",
                  "LastModified": "2021-04-13T21:57:07+00:00",
                  "ETag": "\"7c68c591949391791ecf625253658c61\"",
                  "Size": 66,
                  "StorageClass": "STANDARD",
                  "Owner": {
                      "DisplayName": "EXAMPLE",
                      "ID": "e9e3d6ec1EXAMPLEf5bfb5e6bd0a2b6ed03884d1ed392a82ad011c144736a4ee"
                  }
              },
              {
                  "Key": "order66.json",
                  "LastModified": "2021-04-13T21:57:07+00:00",
                  "ETag": "\"bca60d5380b88e1a70cc27d321caba72\"",
                  "Size": 29,
                  "StorageClass": "STANDARD",
                  "Owner": {
                      "DisplayName": "EXAMPLE",
                      "ID": "e9e3d6ec1EXAMPLEf5bfb5e6bd0a2b6ed03884d1ed392a82ad011c144736a4ee"
                  }
              }
          ]
      }
      ```

   1. 对于从列表中识别为在此学习路径中创建的对象的每个对象，将 `bucket` 替换为要删除的对象的存储桶名称，将 `key` 替换为密钥值，然后运行此命令删除 Amazon S3 对象。

      ```
       aws s3api delete-object --bucket bucket --key key
      ```

      如果命令成功，该命令不返回任何内容。

删除完成此学习路径时创建的所有 AWS 资源和对象后，您可以重新开始并重复这些教程。