

# AWS IoT Device Defender 故障排除指南
<a name="device-defender-troubleshoot"></a>

**帮助我们改进此主题**  
 [告诉我们如何优化内容](https://docs.aws.amazon.com//forms/aws-doc-feedback?hidden_service_name=IoT%20Docs&topic_url=http://docs.aws.amazon.com/en_us/iot/latest/developerguide/device-defender-troubleshoot.html) General

问：使用 AWS IoT Device Defender 是否需要满足任何先决条件？   
答：如果要使用设备报告的指标，必须首先在连接 AWS IoT 的设备或设备网关上部署代理。设备必须提供一致的客户端标识符或事物名称。审核

问：我启用了检查，审核持续显示“In-Progress”已经很长时间了。是哪里出错了吗？ 何时可以看到结果？   
答：检查一经启用，数据收集就会立即开始。不过，如果账户具有大量数据（例如证书、事物或策略）要收集，您可能要在启用检查后等候一段时间才能看到检查结果。Detect

问：如何知道在 AWS IoT Device Defender 安全配置文件行为中设置的阈值？   
答：首先创建低阈值的安全配置文件行为，并将其附加到包含相应设备组的事物组。您可以使用 AWS IoT Device Defender 查看当前指标，然后根据使用案例调整设备行为阈值。

问：我创建了一个行为，但它没有在预计的时间点触发违规。应该如何修复此问题？   
答：在定义行为时，您指定了预期的设备的正常行为方式。例如，您有一个监控摄像头，只在 TCP 端口 8888 上连接一个中央服务器，您不希望它进行任何其它连接。要想在摄像头连接其它端口时收到提醒，您可以定义一个类似如下的行为：  

```
{
  "name": "Listening TCP Ports",
  "metric": "aws:listening-tcp-ports",
  "criteria": {
    "comparisonOperator": "in-port-set",
    "value": {
      "ports": [ 8888 ]
    }
  }
}
```
如果摄像头在 TCP 端口 443 上建立 TCP 连接，则违反了设备行为并将触发提醒。

问：我的一个或多个行为违规。如何清除违规？   
答：警报将在设备恢复预期行为后解除，如行为配置文件中所定义。系统在收到设备指标数据后即会评估行为配置文件。如果设备超过两天时间未发布任何指标，则违规事件将自动设置为 `alarm-invalidated`。

问：我删除了违规行为，但如何停止提醒？   
答：删除行为会停止针对该行为的所有未来的违规和提醒。必须从通知机制中清除早期的提醒。行为被删除后，该行为的违规记录将同账户中的其它违规一样保留相同的时间。设备指标

问：我在提交已知违反行为的指标报告，但没有触发任何违规。这是怎么回事？   
答：请订阅以下 MQTT 主题以核对您的指标报告是否被接受：  

```
$aws/things/THING_NAME/defender/metrics/FORMAT/rejected
$aws/things/THING_NAME/defender/metrics/FORMAT/accepted
```
其中，`THING_NAME` 是报告指标的事物的名称，`FORMAT` 是“JSON”或“CBOR ”，具体取决于事物提交的指标报告的格式。  
订阅后，对于提交的每个指标报告，您应该会收到关于这些主题的消息。`rejected` 消息表明解析指标报告时出现了问题。消息负载中会包含一条错误消息，以帮助您更正指标报告中的任何错误。`accepted` 消息表明指标报告已正确解析。

问：如果在指标报告中发送空指标会怎样？  
答：空的端口列表或 IP 地址列表始终被视为符合对应行为。如果对应行为违规，则违规将被清除。

问：为什么我的设备指标报告中包含不在 AWS IoT 注册表中的设备的消息？  
如果您有一个或多个安全配置文件附加到所有事物或所有未注册的事物，那么 AWS IoT Device Defender 将包括未注册事物的指标。如果您要排除未注册事物的指标，可以将配置文件附加到所有已注册的设备，而不是所有设备。

问：即使我将安全配置文件附加到所有未注册的设备或所有设备，我也没有看到来自一个或多个未注册设备的消息。如何修复此问题？  
请确认您正使用受支持的格式发送格式正确的指标报告。有关信息，请参阅[设备指标文档规范](detect-device-side-metrics.md#DetectMetricsMessagesSpec)。验证未注册的设备是否使用的是一致的客户端标识符或事物名称。如果事物名称包含控制字符，或长度超过 128 字节的 UTF-8 编码字符，设备报告的消息将遭到拒绝。

问：如果将未注册的设备添加到注册表，或已注册的设备变为未注册，会发生什么情况？  
答：如果在注册表中添加或删除设备：  
+ 如果它持续发布违规指标，您可以看到设备的两项单独的违规（一个在其注册的事物名称下，一个在其未注册的身份下）。旧身份的活动违规会在两天后不再显示，但在违规历史记录存在最长可达 14 天。

问：我应该在设备指标报告的报告 ID 字段提供什么值？   
答：对每个指标报告使用唯一值，用正整数表示。常见的做法是使用 [Unix 纪元时间戳](https://en.wikipedia.org/wiki/Unix_time)。

问：我是否应该为 AWS IoT Device Defender 指标创建专用 MQTT 连接？   
答：不需要使用单独的 MQTT 连接。

问：在连接以发布设备指标时，我应该使用什么客户端 ID？   
对于 AWS IoT 注册表中的设备（事物），可使用注册的事物名称。对于不在 AWS IoT 注册表中的设备，在连接到 AWS IoT 时可使用一致的标识符。此做法有助于将违规与事物名称匹配。

问：我能否使用不同的客户端 ID 发布设备指标？   
代表另一项事物发布指标是可以实现的。要实现此目的，您可以将指标发布到 AWS IoT Device Defender 为该设备预留的主题。例如，`Thing-1` 要发布自己的指标，并代表 `Thing-2` 发布指标。`Thing-1` 收集自己的指标并将其发布到 MQTT 主题：  

```
$aws/things/Thing-1/defender/metrics/json
```
`Thing-1` 随后从 `Thing-2` 获取指标，并将这些指标发布到 MQTT 主题：  

```
$aws/things/Thing-2/defender/metrics/json
```

问：我的账户中能拥有多少个安全配置文件和行为？   
答：请参阅 [AWS IoT Device Defender 终端节点和配额](https://docs.aws.amazon.com/general/latest/gr/iot_device_defender.html)。

问：提醒目标的典型目标角色是什么样的？   
答：允许 AWS IoT Device Defender 针对提醒目标（SNS 主题）发布提醒的角色需要具备以下两个条件：  
+ 信任关系，将 iot.amazonaws.com 指定为可信实体。
+ 附加的策略，授权 AWS IoT 发布到指定的 SNS 主题。例如：

------
#### [ JSON ]

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Effect": "Allow",
              "Action": "sns:Publish",
              "Resource": "arn:aws:sns:{{us-east-1}}:123456789012:{{example-topic}}"
          }
      ]
  }
  ```

------
+ 如果用于发布提示的 SNS 主题是加密主题，那么除了向 SNS 主题发布消息的权限外，AWS IoT 还必须再授予两个权限。例如：

------
#### [ JSON ]

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
         {
             "Effect": "Allow",
             "Action": [
                 "sns:Publish",
                 "kms:Decrypt",
                 "kms:GenerateDataKey"
             ],
             "Resource": "arn:aws:sns:{{us-east-1}}:123456789012:{{example-topic}}"
         }
      ]
  }
  ```

------

问：带自定义指标类型 `number` 的指标报告提交失败，并显示错误消息 `Malformed metrics report`。这是怎么回事？   
答：类型 `number` 只以单个指标值作为输入，但在 DeviceMetrics 报告中提交指标值时，必须将其作为具有单个值的数组传递。确保将指标值作为数组提交。  
错误负载：  

```
{"header":{"report_id":12334567,"version":"1.0"},"metrics":{"network_stats":{"bytes_in":30680,"bytes_out":10652,"packets_in":113,"packets_out":118}},"custom_metrics":{"my_custom_metric":{"number":0}}}
```
错误消息：  

```
{"thingName":"myThing","status":"REJECTED","statusDetails":{"ErrorCode":"InvalidPayload","ErrorMessage":"Malformed metrics report"},"timestamp":1635802047699}
```
无错误有效负载：  

```
{"header":{"report_id":12334567,"version":"1.0"},"metrics":{"network_stats":{"bytes_in":30680,"bytes_out":10652,"packets_in":113,"packets_out":118}},"custom_metrics":{"my_custom_metric":[{"number":0}]}}
```
响应：  

```
{"thingName":"myThing","12334567":1635800375,"status":"ACCEPTED","timestamp":1635801636023}
```