

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

# 诊断规则问题
<a name="diagnosing-rules"></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/diagnosing-rules.html) 

本部分介绍了在遇到规则问题时要检查的一些事项。

## 配置用于故障排除的 CloudWatch 日志
<a name="diagnosing-rules-logs"></a>

调试规则问题的最佳方法是使用 CloudWatch 日志。启用 CloudWatch 日志后 AWS IoT，您可以看到哪些规则被触发以及它们的成功或失败。您还可以了解 WHERE 子句条件是否匹配。有关更多信息，请参阅 [AWS IoT 使用 CloudWatch 日志进行监控](cloud-watch-logs.md)。

最常见的规则问题是授权问题。日志会显示您的角色是否无权在资源 AssumeRole 上执行。下面是一个[精细日志记录](configure-logging.md#fine-logging-cli)功能生成的示例日志：

```
{
    "timestamp": "2017-12-09 22:49:17.954",
    "logLevel": "ERROR",
    "traceId": "ff563525-6469-506a-e141-78d40375fc4e",
    "accountId": "123456789012",
    "status": "Failure",
    "eventType": "RuleExecution",
    "clientId": "iotconsole-123456789012-3",
    "topicName": "test-topic",
    "ruleName": "rule1",
    "ruleAction": "DynamoAction",
    "resources": {
        "ItemHashKeyField": "id",
        "Table": "trashbin",
        "Operation": "Insert",
        "ItemHashKeyValue": "id",
        "IsPayloadJSON": "true"
    },
    "principalId": "ABCDEFG1234567ABCD890:outis",
    "details": "User: arn:aws:sts::123456789012:assumed-role/dynamo-testbin/5aUMInJH is not authorized to perform: dynamodb:PutItem on resource: arn:aws:dynamodb:us-east-1:123456789012:table/testbin (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: AccessDeniedException; Request ID: AKQJ987654321AKQJ123456789AKQJ987654321AKQJ987654321)"
}
```

下面是一个[全局日志记录](configure-logging.md#global-logging-cli)功能生成的类似示例日志：

```
2017-12-09 22:49:17.954 TRACEID:ff562535-6964-506a-e141-78d40375fc4e 
PRINCIPALID:ABCDEFG1234567ABCD890:outis [ERROR] EVENT:DynamoActionFailure 
TOPICNAME:test-topic CLIENTID:iotconsole-123456789012-3 
MESSAGE:Dynamo Insert record failed. The error received was User: arn:aws:sts::123456789012:assumed-role/dynamo-testbin/5aUMInJI is not authorized to perform: dynamodb:PutItem on resource: arn:aws:dynamodb:us-east-1:123456789012:table/testbin 
(Service: AmazonDynamoDBv2; Status Code: 400; Error Code: AccessDeniedException; Request ID: AKQJ987654321AKQJ987654321AKQJ987654321AKQJ987654321). 
Message arrived on: test-topic, Action: dynamo, Table: trashbin, HashKeyField: id, HashKeyValue: id, RangeKeyField: None, RangeKeyValue: 123456789012
No newer events found at the moment. Retry.
```

有关更多信息，请参阅 [在 CloudWatch 控制台中查看 AWS IoT 日志](cloud-watch-logs.md#viewing-logs)。

## 诊断外部服务
<a name="diagnosing-rules-ext"></a>

外部服务由最终用户控制。在执行规则之前，请确保已设置链接到规则的外部服务，并且具有足够的应用程序吞吐量和容量单位。

## 诊断 SQL 问题
<a name="diagnosing-rules-sql"></a>

**如果您的 SQL 查询没有返回您期望的数据：**
+ **查看日志中的错误消息。**
+ 

**确认您的 SQL 语法与消息中的 JSON 文档匹配。**  
查看查询中使用的对象和属性名称，以及主题消息有效载荷的 JSON 文档中使用的对象名和属性名称。有关 SQL 查询中 JSON 格式的更多信息，请参阅 [JSON 扩展](iot-sql-json.md)。
+ 

**检查 JSON 对象或属性名称是否包含预留字符或数字字符。**  
有关 SQL 查询中 JSON 对象引用中预留字符的更多信息，请参阅 [JSON 扩展](iot-sql-json.md)。