

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

# 创建将设备数据路由到其他服务的 AWS IoT 规则
<a name="iot-rules-tutorial"></a>

这些教程向您展示了如何使用一些更常见的 AWS IoT 规则操作来创建和测试规则。

AWS IoT 规则将数据从您的设备发送到其他 AWS 服务。它们侦听特定的 MQTT 消息，格式化消息有效载荷中的数据，并将结果发送到其它 AWS 服务。

我们建议您按照这里显示的顺序尝试这些功能，即使您的目标是使用 Lambda 或更复杂的函数创建一个规则。这些教程是按照从基本到复杂的顺序提供的。它们以递增方式呈现新概念，从而帮助您了解可用于创建没有特定教程的规则操作的概念。

**注意**  
AWS IoT 规则可帮助您将物联网设备中的数据发送到其他 AWS 服务。但是，要成功完成此操作，您需要了解要向其发送数据的其它服务的工作知识。虽然这些教程提供了完成任务所需的信息，但您可能会发现在解决方案中使用数据之前，了解有关要向其发送数据的服务的详细信息会很有帮助。对其他 AWS 服务的详细说明不在这些教程的范围之内。

**教程场景概览**  
这些教程的场景是定期发布数据的天气传感器设备。在这个虚构系统中有许多这样的传感器设备。但是，本部分中的教程侧重于单个设备，同时展示了如何容纳多个传感器。

本节中的教程向您展示如何使用 AWS IoT 规则对这个虚构的天气传感器设备系统执行以下任务。
+ 

**[教程：重新发布 MQTT 消息](iot-repub-rule.md)**  
本教程介绍如何将从天气传感器收到的 MQTT 消息重新发布为仅包含传感器 ID 和温度值的消息。它只使用 AWS IoT Core 服务，并演示简单 SQL 查询以及如何使用 MQTT 客户端来测试您的规则。
+ 

**[教程：发送 Amazon SNS 通知](iot-sns-rule.md)**  
本教程介绍如何在天气传感器设备的值超过特定值时发送 SNS 消息。它以上一教程中介绍的概念为基础，并添加了如何使用另一项 AWS 服务，即[亚马逊简单通知服务](https://docs.aws.amazon.com//sns/latest/dg/welcome.html) (Amazon SNS)。

  如果您是 Amazon SNS 的新用户，请查看其[入门](https://docs.aws.amazon.com//sns/latest/dg/sns-getting-started.html)练习，然后再开始本教程。
+ 

**[教程：将设备数据存储在 DynamoDB 表中](iot-ddb-rule.md)**  
本教程介绍如何将来自气象传感器设备的数据存储在数据库表中。它使用规则查询语句和替代模板来设置目标服务的消息数据的格式，[Amazon DynamoDB](https://docs.aws.amazon.com//amazondynamodb/latest/developerguide/Introduction.html)。

  如果您是的 DynamoDB 用户，请查看其[入门](https://docs.aws.amazon.com//amazondynamodb/latest/developerguide/GettingStartedDynamoDB.html)练习，然后再开始本教程。
+ 

**[教程：使用 AWS Lambda 函数格式化通知](iot-lambda-rule.md)**  
本教程介绍如何调用 Lambda 函数来重新格式化设备数据，然后将其作为文本消息发送。它在函数中添加了 Python 脚本和 AWS SDK [AWS Lambda](https://docs.aws.amazon.com//lambda/latest/dg/welcome.html)函数，以便使用来自天气传感器设备的消息有效载荷数据进行格式化并发送短信。

  如果您是 Lambda 的新用户，请查看 Lambda 的[入门](https://docs.aws.amazon.com//lambda/latest/dg/getting-started.html)练习，然后再开始本教程。

**AWS IoT 规则概述**  
所有这些教程都创建了 AWS IoT 规则。

对于将数据从设备发送到其他 AWS 服务的 AWS IoT 规则，它使用：


+ 规则查询语句，由以下内容组成：
  + 一个 SQL SELECT 子句，用于从消息有效载荷中选择数据并设置其格式
  + 标识要使用的消息的主题筛选条件（规则查询语句中的 FROM 对象）
  + 可选条件语句（SQL WHERE 子句），用于指定执行操作的特定条件
+ 至少一个规则操作

设备会向主题发布 MQTT 消息。SQL SELECT 语句中的主题筛选条件标识要应用规则的 MQTT 主题。SQL SELECT 语句中指定的字段将来自传入 MQTT 消息有效载荷的数据格式化，以供规则的操作使用。有关规则操作的完整列表，请参阅 [AWS IoT 规则操作](iot-rule-actions.md)。

**Topics**
+ [

# 教程：重新发布 MQTT 消息
](iot-repub-rule.md)
+ [

# 教程：发送 Amazon SNS 通知
](iot-sns-rule.md)
+ [

# 教程：将设备数据存储在 DynamoDB 表中
](iot-ddb-rule.md)
+ [

# 教程：使用 AWS Lambda 函数格式化通知
](iot-lambda-rule.md)

# 教程：重新发布 MQTT 消息
<a name="iot-repub-rule"></a>

本教程演示如何创建在收到指定的 MQTT 消息时发布 MQTT 消息的 AWS IoT 规则。可以在发布之前通过规则修改传入的消息有效载荷。这样就可以创建针对特定应用程序量身定制的消息，而无需更改设备或固件。您还可以使用规则的筛选功能仅在满足特定条件时发布消息。

通过规则重新发布的消息就像任何其他 AWS IoT 设备或客户端发送的消息一样。设备可以订阅重新发布的消息，就像订阅任何其它 MQTT 消息主题一样。

**您将在本教程中学到的内容：**
+ 如何在规则查询语句中使用简单的 SQL 查询和函数
+ 如何使用 MQTT 客户端测试规则 AWS IoT 

完成本教程需要大约 30 分钟。

**Topics**
+ [

## 查看 MQTT 主题和规则 AWS IoT
](#iot-repub-rule-mqtt)
+ [

## 步骤 1：创建 AWS IoT 规则以重新发布 MQTT 消息
](#iot-repub-rule-define)
+ [

## 步骤 2：测试您的新规则
](#iot-repub-rule-test)
+ [

## 步骤 3：查看结果和后续步骤
](#iot-repub-rule-review)

**在开始本教程之前，请确保您具有：**
+ 

**[设置 AWS 账户](setting-up.md)**  
你需要你的 AWS 账户 和 AWS IoT 主机才能完成本教程。
+ 

**审核 [使用 MQTT 客户端查看 AWS IoT MQTT 消息](view-mqtt-messages.md)**  
请确保您可以使用 MQTT 客户端订阅和发布主题。您将使用 MQTT 客户端在此流程中测试新规则。

## 查看 MQTT 主题和规则 AWS IoT
<a name="iot-repub-rule-mqtt"></a>

在讨论 AWS IoT 规则之前，先了解 MQTT 协议会有所帮助。在物联网解决方案中，MQTT 协议相比于其它网络通信协议（如 HTTP）更具优势，这使得它成为物联网设备使用的常用选择。本部分回顾了 MQTT 的关键方面，因为它们适用于本教程。有关如何将 MQTT 与 HTTP 进行比较的信息，请参阅 [为设备通信选择应用程序协议](protocols.md#protocol-selection)。

**MQTT 协议**  
MQTT 协议使用与其主机的 publish/subscribe 通信模型。为了发送数据，设备会向消息代理发布由主题标识的 AWS IoT 消息。要接收来自消息代理的消息，设备通过在订阅请求中向消息代理发送主题筛选条件，来订阅其将接收的主题。 AWS IoT 规则引擎从消息代理接收 MQTT 消息。

**AWS IoT 规则**  
AWS IoT 规则由规则查询语句和一个或多个规则操作组成。当 AWS IoT 规则引擎接收 MQTT 消息，则这些元素将按如下方式操作消息。
+ 

**规则查询语句**  
规则的查询语句描述了要使用的 MQTT 主题，解释消息有效载荷中的数据，并按类似于常用 SQL 数据库使用的语句的 SQL 语句的描述设置数据的格式。查询语句的结果是发送到规则操作的数据。
+ 

**规则操作**  
规则中的每个规则操作都对规则的查询语句生成的数据起作用。 AWS IoT 支持[许多规则操作](iot-rule-actions.md)。但是，在本教程中，您将专注于 [重新发布](republish-rule-action.md) 规则操作，该操作将查询语句的结果发布为带有特定主题的 MQTT 消息。

## 步骤 1：创建 AWS IoT 规则以重新发布 MQTT 消息
<a name="iot-repub-rule-define"></a>

您将在本教程中创建的 AWS IoT 规则订阅了 `device/device_id/data` MQTT 主题，其中*device\$1id*是发送消息的设备的 ID。这些主题由[主题筛选条件](topics.md#topicfilters)描述为 `device/+/data`，其中，`+` 是匹配两个正斜杠字符之间的任何字符串的通配符。

当规则收到来自匹配主题的消息时，它会重新发布 `device_id` 和 `temperature` 的值，以 `device/data/temp` 主题发布为新的 MQTT 消息。

例如，具有 `device/22/data` 主题的 MQTT 消息有效载荷如下所示：

```
{
  "temperature": 28,
  "humidity": 80,
  "barometer": 1013,
  "wind": {
    "velocity": 22,
    "bearing": 255
  }
}
```

该规则将 `temperature` 值从消息有效载荷中取出，将 `device_id` 从主题中取出，并将其作为 MQTT 消息以 `device/data/temp` 为主题和类似下面这样的消息有效载荷重新发布：

```
{
  "device_id": "22",
  "temperature": 28
}
```

使用此规则，只需要设备 ID 和温度数据的设备会订阅 `device/data/temp` 主题以仅接收该信息。

**创建重新发布 MQTT 消息的规则**

1. 打开[AWS IoT 控制台的 “**规则**” 中心](https://console.aws.amazon.com//iot/home#/rulehub)。

1. 在 **Rules**（规则）中，选择 **Create**（创建）并开始创建新规则。

1. 在**创建规则**顶部：

   1. 在 **Name**（名称）下，输入规则的名称。在本教程中，将其命名为 **republish\$1temp**。

      请记住，规则名称在您的账户和区域中必须唯一，并且不能包含任何空格。我们在此名称中使用了下划线字符来分隔规则名称中的两个单词。

   1.  在**说明**中，描述规则。

      有意义的描述可以帮助您记住此规则的作用以及您创建它的原因。描述可以根据需要延长，因此请尽可能详细。

1. 在**创建规则**的**规则查询语句**中：

   1.  在**使用 SQL 版本**中，选择 **2016-03-23**。

   1. 在**规则查询语句**编辑框中，输入语句：

      ```
      SELECT topic(2) as device_id, temperature FROM 'device/+/data'
      ```

      本语句：
      + 侦听主题符合 `device/+/data`主题筛选条件的 MQTT 消息。
      + 从主题字符串中选择第二个元素，并将其分配给 `device_id`字段。
      + 从消息负载中选择 `temperature`字段的值，并将其分配给 `temperature`字段。

1. 在**设置一个或多个操作**中：

   1. 要打开此规则的规则操作列表，请选择**添加操作**。

   1. 在 **“选择操作**” 中，选择 “将**消息重新发布到 AWS IoT 主题**”。

   1. 在操作列表底部，选择 **Configure action**（配置操作）以打开选定操作的配置页面。

1. 在**配置操作**中：

   1.  在 **Topic**（主题）中输入 **device/data/temp**。这是此规则将发布的消息 MQTT 主题。

   1.  在 **Quality of Service**（服务质量）中，选择 **0 - The message is delivered zero or more times**（0-消息传递零次或多次）。

   1.  在**选择或创建角色以授予执行此操作的 AWS IoT 访问权限**中：

      1.  选择**创建角色**。**Create a new role**（创建新角色）对话框打开。

      1. 输入描述新角色的名称。在本教程中，请使用 **republish\$1role**。

         创建新角色时，将创建用于执行规则操作的正确策略并将其附加到新角色。如果更改此规则操作的主题或在其它规则操作中使用此角色，则必须更新该角色的策略以授权新主题或操作。要更新现有角色，请在本部分中选择 **Update role**（更新角色）。

      1. 选择 **Create Role**（创建角色）以创建角色并关闭对话框。

   1. 选择 **Add action**（添加操作）将操作添加到规则并返回到 **Create a rule**（创建规则）页。

1. “将**消息重新发布到 AWS IoT 主题**” 操作现在列在 **“设置一个或多个操作**” 中。

   在新动作的磁贴中，在**将消息重新发布至 AWS IoT 主题**下，您可以看到重新发布操作将发布到的主题。

   这是您将添加到此规则的唯一规则操作。

1. 在 **Create a rule**（创建规则）中，向下滚动到底部，然后选择 **Create rule**（创建规则）以创建规则并完成此步骤。

## 步骤 2：测试您的新规则
<a name="iot-repub-rule-test"></a>

要测试新规则，您将使用 MQTT 客户端发布和订阅此规则所使用的 MQTT 消息。

在新窗口中打开 [AWS IoT 控制台中的 MQTT 客户端](https://console.aws.amazon.com//iot/home#/test)。这将允许您在不丢失 MQTT 客户端配置的情况下编辑规则。如果您让其转到控制台中的其它页面，MQTT 客户端不会保留任何订阅或消息日志。

**如需使用 MQTT 客户端来测试您的规则**

1. 在 [AWS IoT 控制台中的 MQTT 客户端](https://console.aws.amazon.com//iot/home#/test)中，订阅输入主题，在本例中为 `device/+/data`。

   1. 在 MQTT 客户端中，在**订阅**下，选择**订阅主题**。

   1. 在**订阅主题**中，输入输入主题筛选条件的主题，**device/\$1/data**。

   1. 将其它字段保留为默认设置。

   1. 选择**订阅主题**。

      在**订阅**栏，在**发布到主题**项下，将会显示 **device/\$1/data**。

1. 订阅您的规则将发布的主题：`device/data/temp`。

   1. 在 **Subscriptions**（订阅）中，再次选择 **Subscribe to a topic**（订阅主题），并在 **Subscription topic**（订阅主题）中，输入重新发布消息的主题，**device/data/temp**。

   1. 将其它字段保留为默认设置。

   1. 选择 **Subscribe to topic**（订阅主题）。

      在 **Subscriptions**（订阅）栏，在 **device/\$1/data** 下，将会显示 **device/data/temp**。

1. 使用特定设备 ID **device/22/data**向输入主题发布消息。您无法发布到包含通配符的 MQTT 主题。

   1. 在 MQTT 客户端中，在**订阅**下，选择**订阅主题**。

   1. 在**发布**字段中，输入输入主题名称，**device/22/data**。

   1. 复制此处显示的示例数据，然后在主题名称下方的编辑框中粘贴示例数据。

      ```
      {
        "temperature": 28,
        "humidity": 80,
        "barometer": 1013,
        "wind": {
          "velocity": 22,
          "bearing": 255
        }
      }
      ```

   1. 要发送您的 MQTT 消息，请选择**发布到主题**。

1. 查看已发送的消息。

   1. 在 MQTT 客户端中，在 **Subscriptions**（订阅）项下，您之前订阅的两个主题旁边有一个绿点。

      绿色圆点表示自您上次查看它们以来已收到一条或多条新消息。

   1. 在**订阅**下，选择 **device/\$1/data** 来检查消息有效载荷是否与刚刚发布的内容匹配，如下所示：

      ```
      {
        "temperature": 28,
        "humidity": 80,
        "barometer": 1013,
        "wind": {
          "velocity": 22,
          "bearing": 255
        }
      }
      ```

   1. 在 “**订阅**” 下 **device/data/temp**，选择检查重新发布的消息有效负载是否如下所示：

      ```
      {
        "device_id": "22",  
        "temperature": 28
      }
      ```

      请注意，`device_id` 值是一个带引号的字符串，`temperature` 值为数字。这是因为 [https://docs.aws.amazon.com//iot/latest/developerguide/iot-sql-functions.html#iot-function-topic](https://docs.aws.amazon.com//iot/latest/developerguide/iot-sql-functions.html#iot-function-topic)函数从输入消息的主题名称中提取字符串，而 `temperature`值使用输入消息负载中的数值。

      如果您想使 `device_id`值为数值，请在规则查询语句中将 `topic(2)`替换为：

      ```
      cast(topic(2) AS DECIMAL)
      ```

      请注意，将 `topic(2)`值设置为数字值仅在主题的该部分仅包含数字字符时才起作用。

1. 如果您看到已向该**device/data/temp**主题发布了正确的消息，则说明您的规则起作用了。请在下一部分中了解有关“重新发布规则”操作的更多信息。

   如果您没有看到正确的消息已发布到**设备/\$1/data** 或**device/data/temp**主题，请查看疑难解答提示。

### 重新发布消息规则疑难解答
<a name="iot-repub-rule-trouble"></a>

如果您没有看到期望的结果，可检查以下事项。
+ 

**您收到了一个错误的广告条**  
如果在您发布输入消息时出现错误，请先更正该错误。以下步骤可帮助您更正此错误。
+ 

**您未在 MQTT 客户端中看到输入消息**  
每次将输入消息发布到 `device/22/data`主题时，如果您如流程中所述订阅了 `device/+/data`主题筛选条件，则消息应当会在 MQTT 客户端中显示。

**要检查的事项**
  + 

**检查您订阅的主题筛选条件**  
如果您如流程中所述订阅了输入消息主题，则每次发布输入消息时都应看到该输入消息的副本。

    如果没有看到该消息，请检查您订阅的主题名称，并将其与您发布的主题进行比较。主题名称区分大小写，您订阅的主题必须与发布消息负载的主题相同。
  + 

**检查消息发布函数**  
在 MQTT 客户端中，在**订阅**下，选择 **device/\$1/data**，检查发布消息的主题，然后选择**发布到主题**。您应该会看到来自主题下方编辑框中的消息负载出现在消息列表中。
+ 

**您未在 MQTT 客户端中看到您的重新发布的消息**  
要使规则起作用，规则必须具有授权其接收和重新发布消息的正确策略，并且必须接收消息。

**要检查的事项**
  + 

**检查您 AWS 区域 的 MQTT 客户端和您创建的规则**  
您在其中运行 MQTT 客户端的控制台必须位于您所创建规则的同一 AWS 区域。
  + 

**检查规则查询语句中的输入消息主题**  
要使规则起作用，它必须收到一条消息，消息主题名称应与规则查询语句 FROM 子句中的主题筛选条件相匹配。

    检查规则查询语句中主题筛选条件的拼写与 MQTT 客户端中主题的拼写。主题名称区分大小写，消息的主题必须与规则查询语句中的主题筛选条件匹配。
  + 

**检查输入消息负载的内容**  
要使规则起作用，则必须在 SELECT 语句中声明的消息负载中找到数据字段。

    检查规则查询语句 `temperature`字段中的拼写与 MQTT 客户端中消息负载的拼写。字段名称区分大小写，规则查询语句中 `temperature`字段必须与消息负载中的 `temperature`字段相同。

    确保消息负载中的 JSON 文档格式正确。如果 JSON 有任何错误（例如缺少逗号），则规则将无法读取它。
  + 

**在规则操作中检查重新发布的消息主题**  
重新发布规则操作向其发布新消息的主题必须与您在 MQTT 客户端中订阅的主题匹配。

    在控制台中打开您创建的规则，然后检查规则操作将重新发布消息的主题。
  + 

**检查规则所使用的角色**  
规则操作必须具有接收原始主题和发布新主题的权限。

    授权规则接收消息数据并重新发布的策略特定于所使用的主题。如果更改用于重新发布消息数据的主题，则必须更新规则操作的角色，以更新其策略来匹配当前主题。

    如果怀疑这里出现了问题，请编辑“重新发布”规则操作并创建新角色。规则操作创建的新角色将接收执行这些操作所需的授权。

## 步骤 3：查看结果和后续步骤
<a name="iot-repub-rule-review"></a>

**在本教程中：**
+ 您在规则查询语句中使用了一个简单的 SQL 查询和几个函数来生成新的 MQTT 消息。
+ 您创建了重新发布该新消息的规则。
+ 您使用 MQTT 客户端来测试您的 AWS IoT 规则。

**后续步骤**  
使用此规则重新发布几条消息后，请尝试使用该规则进行实验，以了解更改教程的某些方面如何影响重新发布的消息。以下想法可以帮助您开始操作。
+ *device\$1id*在输入消息的主题中更改并观察重新发布的消息有效负载中的效果。
+ 更改规则查询语句中选定的字段，并观察重新发布的消息有效载荷中的效果。
+ 尝试本系列中的下一个教程，了解如何 [教程：发送 Amazon SNS 通知](iot-sns-rule.md)。

本教程中使用的“重新发布规则”操作也可以帮助您调试规则查询语句。例如，您可以将此操作添加到规则中，以查看其规则查询语句如何设置规则操作所使用的数据的格式。

# 教程：发送 Amazon SNS 通知
<a name="iot-sns-rule"></a>

本教程演示如何创建一条 AWS IoT 规则，将 MQTT 消息数据发送到 Amazon SNS 主题，以便可以将其作为 SMS 短信发送。

在本教程中，您将创建一条规则，以在温度超过规则中设置的值时将消息数据从天气传感器发送到 Amazon SNS 主题的所有订阅者。当报告的温度超过规则设置的值时，规则会检测到，并创建一个新的消息有效载荷，其中仅包含设备 ID、报告的温度和超出的温度限制。规则将新消息有效载荷作为 JSON 文档发送到 SNS 主题，该主题会通知 SNS 主题的所有订阅者。

**您将在本教程中学到的内容：**
+ 如何创建和测试 Amazon SNS 通知
+ 如何根据规则调用 Amazon SNS 通知 AWS IoT 
+ 如何在规则查询语句中使用简单的 SQL 查询和函数
+ 如何使用 MQTT 客户端测试规则 AWS IoT 

完成本教程需要大约 30 分钟。

**Topics**
+ [

## 步骤 1：创建 Amazon SNS 主题，发送 SMS 文本消息
](#iot-sns-rule-create-sns-topic)
+ [

## 步骤 2：创建发送短信的 AWS IoT 规则
](#iot-sns-rule-create-rule)
+ [

## 第 3 步：测试 AWS IoT 规则和 Amazon SNS 通知
](#iot-sns-rule-test-rule)
+ [

## 步骤 4：查看结果和后续步骤
](#iot-sns-rule-review-results)

**在开始本教程之前，请确保您具有：**
+ 

**[设置 AWS 账户](setting-up.md)**  
你需要你的 AWS 账户 和 AWS IoT 主机才能完成本教程。
+ 

**审核 [使用 MQTT 客户端查看 AWS IoT MQTT 消息](view-mqtt-messages.md)**  
请确保您可以使用 MQTT 客户端订阅和发布主题。您将使用 MQTT 客户端在此流程中测试新规则。
+ 

**审核 [Amazon Simple Notification Service](https://docs.aws.amazon.com//sns/latest/dg/welcome.html)**  
如果您以前未使用过 Amazon SNS，请查看 [设置 Amazon SNS 的访问权限](https://docs.aws.amazon.com//sns/latest/dg/sns-setting-up.html)。如果您已经完成了其他 AWS IoT 教程，则 AWS 账户 应该已经正确配置了您的教程。

## 步骤 1：创建 Amazon SNS 主题，发送 SMS 文本消息
<a name="iot-sns-rule-create-sns-topic"></a>

此步骤说明如何创建您的天气传感器可以向其发送消息数据的 Amazon SNS 主题。然后，Amazon SNS 主题将通过 SMS 文本消息通知所有订阅者已超过温度限制。

**创建发送 SMS 文本消息的 Amazon SNS 主题**

1. **创建 Amazon SNS 主题。**

   1. 登录 [Amazon SNS 控制台](https://console.aws.amazon.com//sns/home)。

   1. 在左侧导航窗格中，选择**主题**。

   1. 在 **Topics**（主题）页面上，选择 **Create topic**（创建主题）。

   1. 在 **Details**（详细信息）中，选择 **Standard**（标准）类型。默认情况下，控制台会创建 FIFO 主题。

   1. 在 **Name**（名称）中，输入 SNS 主题名称。在本教程中，请输入 **high\$1temp\$1notice**。

   1. 滚动到页面底部，然后选择 **Create topic**（创建主题）。

      控制台会打开新主题的**详细信息**页面。

1. **创建 Amazon SNS 订阅。**
**注意**  
您将在本教程中发送的消息可能会使您在此订阅中使用的电话号码产生短信费用。

   1. 在 **high\$1temp\$1notice** 主题详细信息页面上，选择 **Create subscription**（创建订阅）。

   1. 在 **Create subscripition**（创建订阅），在 **Details**（详细信息）部分中，在 **Protocol**（协议）列表中，选择 **SMS**。

   1. 在 **Endpoint**（端点）中，输入可接收文本消息的电话号码。请务必输入号码，以 `+` 开头，包含国家和地区代码，并且不包括任何其它标点符号字符。

   1. 选择 **Create subscription**（创建订阅）。

1. **测试 Amazon SNS 通知。**

   1. 在 [Amazon SNS 控制台](https://console.aws.amazon.com//sns/home)中，左侧导航窗格内，选择 **Topics**（主题）。

   1. 要打开主题的详细信息页面，请在 **Topics**（主题），在主题列表中，选择 **high\$1temp\$1notice**。

   1. 打开 **Publish message to topic**（将消息发布到主题）页面中的 **high\$1temp\$1notice**详细信息页面，选择 **Publish message**（发布消息）。

   1. 在 **Publish message to topic**（将消息发布到主题），在 **Message body**（消息正文）部分，**Message body to send to the endpoint**（要发送到端点的消息正文）中，输入一条简短的消息。

   1. 滚动到页面底部并选择 **Publish message**（发布消息）。

   1. 在使用您之前创建订阅时使用的号码的电话上，确认已收到消息。

   如果您没有收到测试消息，请仔细检查电话号码和手机的设置。

   确保您可以从 [Amazon SNS 控制台](https://console.aws.amazon.com//sns/home)发布测试消息，然后继续本教程。

## 步骤 2：创建发送短信的 AWS IoT 规则
<a name="iot-sns-rule-create-rule"></a>

您将在本教程中创建的 AWS IoT 规则订阅了 `device/device_id/data` MQTT 主题，其中`device_id`是发送消息的设备的 ID。这些主题在主题筛选条件中描述为 `device/+/data`，其中，`+` 是匹配两个正斜杠字符之间的任何字符串的通配符。此规则还测试消息有效载荷中的 `temperature` 字段值。

当规则收到来自匹配主题的消息时，它会从主题名称中取 `device_id`，从消息有效载荷中取 `temperature` 值，并为正在测试的限制添加一个常量值，并将这些值作为 JSON 文档发送到 Amazon SNS 通知主题。

 例如，来自气象传感器设备编号 32 的 MQTT 消息使用 `device/32/data` 主题，并具有如下所示的消息有效载荷：

```
{
  "temperature": 38,
  "humidity": 80,
  "barometer": 1013,
  "wind": {
    "velocity": 22,
    "bearing": 255
  }
}
```

规则的规则查询语句从消息有效载荷中取 `temperature` 值，从主题名称中取 `device_id`，并添加常量 `max_temperature` 值以向 Amazon SNS 主题发送类似于以下内容的消息有效载荷：

```
{
  "device_id": "32",
  "reported_temperature": 38,
  "max_temperature": 30
}
```

**创建用于检测超限温度值的 AWS IoT 规则并创建要发送至 Amazon SNS 主题的数据**

1. 打开[AWS IoT 控制台的 “**规则**” 中心](https://console.aws.amazon.com//iot/home#/rulehub)。

1. 如果这是您的第一条规则，请选择 **Create**（创建），或者 **Create a rule**（创建规则）。

1. 在 **Create a rule**（创建规则）中：

   1. 在 **Name**（名称）中，输入 **temp\$1limit\$1notify**。

      请记住，规则名称在您的 AWS 账户 和区域内必须是唯一的，并且不能有任何空格。我们在此名称中使用了下划线字符来分隔规则名称中的单词。

   1. 在 **Description**（说明）中，描述规则。

      有意义的描述可以更容易地记住此规则的作用以及您创建它的原因。描述可以根据需要延长，因此请尽可能详细。

1. 在 **Create a rule**（创建规则）的 **Rule query statement**（规则查询语句）中：

   1.  在 **Using SQL version**（使用 SQL 版本）中，选择 **2016-03-23**。

   1. 在 **Rule query statement**（规则查询语句）编辑框中，输入语句：

      ```
      SELECT topic(2) as device_id, 
          temperature as reported_temperature, 
          30 as max_temperature 
        FROM 'device/+/data' 
        WHERE temperature > 30
      ```

      本语句：
      + 侦听主题与 `device/+/data`主题筛选条件相符，并且 `temperature`值大于 30 的 MQTT 消息。
      + 从主题字符串中选择第二个元素，并将其分配给 `device_id`字段。
      + 从消息负载中选择 `temperature`字段的值，并将其分配给 `reported_temperature`字段。
      + 创建常数值 `30` 来表示限制值，并将其赋值给 `max_temperature` 字段。

1. 要打开此规则的规则操作列表，请在 **Set one or more actions**（设置一个或多个操作）中，选择 **Add action**（添加操作）。

1. 在 **Select an action**（选择操作）页面上，选择 **Send a message as an SNS push notification**（将消息发送为 SNS 推送通知）。

1. 要打开选定操作的配置页面，请在操作列表底部选择**配置操作**。

1. 在 **Configure action**（配置操作）中：

   1. 在 **SNS target**（SNS target）中，选择 **Select**（选择），找到您名为 **high\$1temp\$1notice** 的 SNS 主题，然后选择 **Select**（选择）。

   1. 对于 **Message format**（消息格式），请选择 **RAW**。

   1. 在**选择或创建角色以授予执行此操作的 AWS IoT 访问权限**中，选择**创建角色**。

   1. 在 **Create a new role**（创建新角色）中，**Name**（名称）项下，输入新角色的唯一名称。在本教程中，请使用 **sns\$1rule\$1role**。

   1. 选择**创建角色**。

   如果要重复本教程或重复使用现有角色，请选择 **Update role**（更新角色）然后再继续。这将更新角色的策略文档，以便与 SNS 目标配合使用。

1. 选择 **Add action**（添加操作），然后返回到 **Create a rule**（创建规则）页。

   在新操作的磁贴中，在 **Send a message as an SNS push notification**（将消息作为 SNS 推送通知发送）项下，您可以看到规则将调用的 SNS 主题。

   这是您将添加到此规则的唯一规则操作。

1. 要创建规则并完成此步骤，请在 **Create a rule**（创建规则）中，向下滚动到底部，然后选择 **Create rule**（创建规则）。

## 第 3 步：测试 AWS IoT 规则和 Amazon SNS 通知
<a name="iot-sns-rule-test-rule"></a>

要测试新规则，您将使用 MQTT 客户端发布和订阅此规则所使用的 MQTT 消息。

在新窗口中打开 [AWS IoT 控制台中的 MQTT 客户端](https://console.aws.amazon.com//iot/home#/test)。这将允许您在不丢失 MQTT 客户端配置的情况下编辑规则。如果您让 MQTT 客户端转到控制台中的其它页面，它将不会保留任何订阅或消息日志。

**如需使用 MQTT 客户端来测试您的规则**

1. 在 [AWS IoT 控制台中的 MQTT 客户端](https://console.aws.amazon.com//iot/home#/test)中，订阅输入主题，在本例中为 `device/+/data`。

   1. 在 MQTT 客户端中，在**订阅**下，选择**订阅主题**。

   1. 在**订阅主题**中，输入输入主题筛选条件的主题，**device/\$1/data**。

   1. 将其它字段保留为默认设置。

   1. 选择**订阅主题**。

      在 **Subscriptions**（订阅）栏，在 **Publish to a topic**（发布到主题）项下，将会显示 **device/\$1/data**。

1. 使用特定设备 ID **device/32/data**向输入主题发布消息。您无法发布到包含通配符的 MQTT 主题。

   1. 在 MQTT 客户端中，在**订阅**下，选择**订阅主题**。

   1. 在**发布**字段中，输入输入主题名称，**device/32/data**。

   1. 复制此处显示的示例数据，然后在主题名称下方的编辑框中粘贴示例数据。

      ```
      {
        "temperature": 38,
        "humidity": 80,
        "barometer": 1013,
        "wind": {
          "velocity": 22,
          "bearing": 255
        }
      }
      ```

   1. 选择 **Publish to topic**（发布到主题）以发布您的 MQTT 消息。

1. 确认文本消息已发送。

   1. 在 MQTT 客户端的**订阅**下，您之前订阅的主题旁边会有一个绿色圆点。

      绿色圆点表示自上次查看消息以来已收到一条或多条新消息。

   1. 在 **Subscriptions**（订阅）中，选择 **device/\$1/data** 来检查消息负载是否与刚刚发布的内容匹配，如下所示：

      ```
      {
        "temperature": 38,
        "humidity": 80,
        "barometer": 1013,
        "wind": {
          "velocity": 22,
          "bearing": 255
        }
      }
      ```

   1. 检查您用于订阅 SNS 主题的电话，并确认消息负载的内容，如下所示：

      ```
      {"device_id":"32","reported_temperature":38,"max_temperature":30}
      ```

      请注意，`device_id` 值是一个带引号的字符串，`temperature` 值为数字。这是因为 [https://docs.aws.amazon.com//iot/latest/developerguide/iot-sql-functions.html#iot-function-topic](https://docs.aws.amazon.com//iot/latest/developerguide/iot-sql-functions.html#iot-function-topic)函数从输入消息的主题名称中提取字符串，而 `temperature`值使用输入消息负载中的数值。

      如果您想使 `device_id`值为数值，请在规则查询语句中将 `topic(2)`替换为：

      ```
      cast(topic(2) AS DECIMAL)
      ```

      请注意，将 `topic(2)` 值设置为数字，`DECIMAL` 值仅在主题的该部分仅包含数字字符时才起作用。

1. 尝试发送温度未超过限制的 MQTT 消息。

   1. 在 MQTT 客户端中，在 **Subscriptions**（订阅）项下，选择 **Subscribe to a topic**（订阅主题）。

   1. 在**发布**字段中，输入输入主题名称，**device/33/data**。

   1. 复制此处显示的示例数据，然后在主题名称下方的编辑框中粘贴示例数据。

      ```
      {
        "temperature": 28,
        "humidity": 80,
        "barometer": 1013,
        "wind": {
          "velocity": 22,
          "bearing": 255
        }
      }
      ```

   1. 要发送您的 MQTT 消息，请选择**发布到主题**。

   您应该会看到您在 **device/\$1/data** 订阅中发送的消息。但是，由于温度值低于规则查询语句中的最大温度，因此您应无法收到文本消息。

   如果您未看到正确的行为，请检查故障排除提示。

### 对 SNS 消息规则进行故障排除
<a name="iot-sns-rule-trouble"></a>

如果您没有看到期望的结果，可以检查以下事项。
+ 

**您收到了一个错误的广告条**  
如果在您发布输入消息时出现错误，请先更正该错误。以下步骤可帮助您更正此错误。
+ 

**您未在 MQTT 客户端中看到输入消息**  
每次将输入消息发布到 `device/22/data`主题时，如果您如流程中所述订阅了 `device/+/data`主题筛选条件，则消息应当会在 MQTT 客户端中显示。

**要检查的事项**
  + 

**检查您订阅的主题筛选条件**  
如果您如流程中所述订阅了输入消息主题，则每次发布输入消息时都应看到该输入消息的副本。

    如果没有看到该消息，请检查您订阅的主题名称，并将其与您发布的主题进行比较。主题名称区分大小写，您订阅的主题必须与发布消息负载的主题相同。
  + 

**检查消息发布函数**  
在 MQTT 客户端中，在**订阅**下，选择 **device/\$1/data**，检查发布消息的主题，然后选择**发布到主题**。您应该会看到来自主题下方编辑框中的消息负载出现在消息列表中。
+ 

**您没有收到 SMS 消息**  
要使规则起作用，规则必须具有授权其接收消息和发送 SNS 通知的正确策略，并且必须接收消息。

**要检查的事项**
  + 

**检查您 AWS 区域 的 MQTT 客户端和您创建的规则**  
您在其中运行 MQTT 客户端的控制台必须位于您所创建规则的同一 AWS 区域。
  + 

**检查消息负载中的温度值是否超过测试阈值**  
如果温度值小于或等于 30（如规则查询语句中定义），则规则将不会执行其任何操作。
  + 

**检查规则查询语句中的输入消息主题**  
要使规则起作用，它必须收到一条消息，消息主题名称应与规则查询语句 FROM 子句中的主题筛选条件相匹配。

    检查规则查询语句中主题筛选条件的拼写与 MQTT 客户端中主题的拼写。主题名称区分大小写，消息的主题必须与规则查询语句中的主题筛选条件匹配。
  + 

**检查输入消息负载的内容**  
要使规则起作用，则必须在 SELECT 语句中声明的消息负载中找到数据字段。

    检查规则查询语句 `temperature`字段中的拼写与 MQTT 客户端中消息负载的拼写。字段名称区分大小写，规则查询语句中 `temperature`字段必须与消息负载中的 `temperature`字段相同。

    确保消息负载中的 JSON 文档格式正确。如果 JSON 有任何错误（例如缺少逗号），则规则将无法读取它。
  + 

**在规则操作中检查重新发布的消息主题**  
重新发布规则操作向其发布新消息的主题必须与您在 MQTT 客户端中订阅的主题匹配。

    在控制台中打开您创建的规则，然后检查规则操作将重新发布消息的主题。
  + 

**检查规则所使用的角色**  
规则操作必须具有接收原始主题和发布新主题的权限。

    授权规则接收消息数据并重新发布的策略特定于所使用的主题。如果更改用于重新发布消息数据的主题，则必须更新规则操作的角色，以更新其策略来匹配当前主题。

    如果怀疑这里出现了问题，请编辑“重新发布”规则操作并创建新角色。规则操作创建的新角色将接收执行这些操作所需的授权。

## 步骤 4：查看结果和后续步骤
<a name="iot-sns-rule-review-results"></a>

**在本教程中：**
+ 您创建并测试了 Amazon SNS 通知主题和订阅。
+ 您在规则查询语句中使用了简单 SQL 查询和函数来为您的通知创建新消息。
+ 您创建了使用您的自定义消息负载发送 Amazon SNS 通知的 AWS IoT 规则。
+ 您使用 MQTT 客户端来测试您的 AWS IoT 规则。

**后续步骤**  
使用此规则发送了几条文本消息后，请尝试使用它来了解更改教程的某些方面如何影响消息以及发送消息的时间。以下想法可以帮助您开始操作。
+ 更改输入消息主题*device\$1id*中的内容，并观察短信内容中的效果。
+ 更改规则查询语句中选定的字段，并观察文本消息内容中的效果。
+ 将规则查询语句中的测试更改为测试最低温度而不是最高温度。记得更改 `max_temperature` 名称！
+ 添加重新发布规则操作，以便在发送 SNS 通知时发送 MQTT 消息。
+ 尝试本系列中的下一个教程，了解如何 [教程：将设备数据存储在 DynamoDB 表中](iot-ddb-rule.md)。

# 教程：将设备数据存储在 DynamoDB 表中
<a name="iot-ddb-rule"></a>

本教程演示如何创建将消息数据发送到 DynamoDB 表的 AWS IoT 规则。

在本教程中，您将创建一条规则来将消息数据从假想气象传感器设备发送到 DynamoDB 表。该规则将为来自许多气象传感器的数据设置格式，以便将其添加到单个数据库表中。

**在本教程中您将学到**
+ 如何创建 DynamoDB 表
+ 如何通过规则向 DynamoDB 表发送消息数据 AWS IoT 
+ 如何在 AWS IoT 规则中使用替换模板
+ 如何在规则查询语句中使用简单的 SQL 查询和函数
+ 如何使用 MQTT 客户端测试规则 AWS IoT 

完成本教程需要大约 30 分钟。

**Topics**
+ [

## 步骤 1：为本教程创建 DynamoDB 表
](#iot-ddb-rule-ddb-table)
+ [

## 步骤 2：创建向 DynamoDB 表发送数据的 AWS IoT 规则
](#iot-ddb-rule-topic-rule)
+ [

## 步骤 3：测试 AWS IoT 规则和 DynamoDB 表
](#iot-ddb-rule-test)
+ [

## 步骤 4：查看结果和后续步骤
](#iot-ddb-rule-review)

**在开始本教程之前，请确保您具有：**
+ 

**[设置 AWS 账户](setting-up.md)**  
你需要你的 AWS 账户 和 AWS IoT 主机才能完成本教程。
+ 

**审核 [使用 MQTT 客户端查看 AWS IoT MQTT 消息](view-mqtt-messages.md)**  
请确保您可以使用 MQTT 客户端订阅和发布主题。您将使用 MQTT 客户端在此流程中测试新规则。
+ 

**审核 [Amazon DynamoDB](https://docs.aws.amazon.com//amazondynamodb/latest/developerguide/Introduction.html) 概览**  
如果您之前没有使用过 DynamoDB，请查看 [DynamoDB 入门](https://docs.aws.amazon.com//amazondynamodb/latest/developerguide/GettingStartedDynamoDB.html)来熟悉 DynamoDB 的基本概念和操作。

## 步骤 1：为本教程创建 DynamoDB 表
<a name="iot-ddb-rule-ddb-table"></a>

在本教程中，您将创建一个具有以下属性的 DynamoDB 表，以记录来自虚拟气象传感器设备的数据：
+ `sample_time` 是主键，描述了记录样本的时间。
+ `device_id` 是排序键，描述了提供示例的设备 
+ `device_data` 是从设备接收并由规则查询语句格式化的数据

**如需为本教程创建 DynamoDB 表**

1. 打开 [DynamoDB 控制台](https://console.aws.amazon.com//dynamodb/home)，然后选择 **Create table**（创建表格）。

1. 在 **Create table**（创建表）中：

   1.  在 **Table name**（表名称）框中输入表名：**wx\$1data**。

   1. 在 **Partition key**（分区键）中，输入 **sample\$1time**，然后在字段旁边的选项列表中，选择 **Number**。

   1. 在 **Sort key**（排序键）中，输入 **device\$1id**，然后在字段旁边的选项列表中，选择 **Number**。

   1. 在页面底部，选择 **Create**（创建）。

您将在稍后定义 `device_data`，即您配置 DynamoDB 规则操作时。

## 步骤 2：创建向 DynamoDB 表发送数据的 AWS IoT 规则
<a name="iot-ddb-rule-topic-rule"></a>

在此步骤中，您将使用规则查询语句格式化来自虚拟气象传感器设备的数据，以便写入数据库表。

从天气传感器设备接收的示例消息有效载荷如下所示：

```
{
  "temperature": 28,
  "humidity": 80,
  "barometer": 1013,
  "wind": {
    "velocity": 22,
    "bearing": 255
  }
}
```

对于数据库条目，您将使用规则查询语句将消息有效载荷的结构展平如下：

```
{
  "temperature": 28,
  "humidity": 80,
  "barometer": 1013,
  "wind_velocity": 22,
  "wind_bearing": 255
}
```

在这个规则中，您还将使用几个 [替换模板](iot-substitution-templates.md)。替代模板是用于从函数和消息数据中插入动态值的表达式。

**创建向 DynamoDB 表发送数据的 AWS IoT 规则**

1. 打开 [AWS IoT 控制台的 Rules（规则）中心](https://console.aws.amazon.com//iot/home#/rulehub)。或者，您可以在中打开 AWS IoT 主页 AWS 管理控制台 并导航到 “**消息路由” > “规则”。**

1. 要开始在 **Rules**（规则）中创建新规则，请选择 **Create rule**（创建规则）。

1. 在 **Rule properties**（规则属性）中：

   1. 在 **Rule name**（规则名称）中，输入 **wx\$1data\$1ddb**。

      请记住，规则名称在您的 AWS 账户 和区域内必须是唯一的，并且不能有任何空格。我们在此名称中使用了下划线字符来分隔规则名称中的两个单词。

   1. 在 **Rule description**（规则描述）中，描述规则。

      有意义的描述可以更容易地记住此规则的作用以及您创建它的原因。描述可以根据需要延长，因此请尽可能详细。

1. 选择**下一步**以继续。

1. 在 **SQL statement**（SQL 语句）中：

   1. 在 **SQL version**（SQL 版本）中，选择 **2016-03-23**。

   1. 在 **SQL statement**（SQL 语句）编辑框中，输入语句：

      ```
      SELECT temperature, humidity, barometer,
        wind.velocity as wind_velocity,
        wind.bearing as wind_bearing,
      FROM 'device/+/data'
      ```

      本语句：
      + 侦听主题符合 `device/+/data`主题筛选条件的 MQTT 消息。
      + 将 `wind` 属性的元素格式化为单个属性。
      + 传递 `temperature`、`humidity`、`barometer` 属性，使其保持不变。

1. 选择**下一步**以继续。

1. 在 **Rule actions**（规则操作）中：

   1. 要打开此规则的规则操作列表，请在 **Action 1**（操作 1）中，选择 **DynamoDB**。
**注意**  
请务必选择 DynamoDB 而不是 Dyn DBv2 amo 作为规则操作。

   1. 在 **Table name**（表名称）中，选择在上一步中创建的 DynamoDB 表的名称：**wx\$1data**。

      **Partition key type**（分区键类型）和 **Sort key type**（排序键类型）字段将使用 DynamoDB 表中的值填充。

   1. 在**分区键**中，输入 **sample\$1time**。

   1. 在**分区键值**中，输入 **\$1\$1timestamp()\$1**。

      这是您将在此规则中使用第一个 [替换模板](iot-substitution-templates.md)。它将使用 timestamp 函数返回的值，而不是消息有效载荷中的值。要了解更多信息，请参阅*《AWS IoT Core 开发人员指南》*中的[时间戳](iot-sql-functions.md#iot-function-timestamp)。

   1. 在 **Sort key**（排序键）中，输入 **device\$1id**。

   1. 在**排序键值**中，输入 **\$1\$1cast(topic(2) AS DECIMAL)\$1**。

      这是您将在此规则中使用的第二个 [替换模板](iot-substitution-templates.md)。它将第二个元素的值插入到主题名称，即设备的 ID，后面其将投射为十进制值以匹配密钥的数字格式。要了解有关主题的更多信息，请参阅*《AWS IoT Core 开发人员指南》*中的[主题](iot-sql-functions.md#iot-function-topic)。或者，要了解有关强制转换的更多信息，请参阅*《AWS IoT Core 开发人员指南》*中的[强制转换](iot-sql-functions.md#iot-sql-function-cast)。

   1. 在**将消息数据写入到此列**中，输入 **device\$1data**。

      这将在 DynamoDB 表中创建 `device_data` 列。

   1. 将**操作**留空。

   1. 在 **IAM Role**（IAM 角色）中，选择 **Create new role**（创建新角色）。

   1. 在 **Create role**（创建角色）对话框中，为 **Role name**（角色名称）输入 **wx\$1ddb\$1role**。这个新角色将自动包含前缀为 “aws-iot-rule” 的策略，该策略将允许该**wx\$1data\$1ddb**规则将数据发送到您创建的 D **wx\$1data** ynamoDB 表。

   1. 在 **IAM role**（IAM 角色）中，选择 **wx\$1ddb\$1role**。

   1. 在页面底部，选择**下一步**。

1. 在 **Review and create**（审核和创建）页面的底部，选择 **Create**（创建）以创建规则。

## 步骤 3：测试 AWS IoT 规则和 DynamoDB 表
<a name="iot-ddb-rule-test"></a>

要测试新规则，您将使用 MQTT 客户端发布和订阅此测试中使用的 MQTT 消息。

在新窗口中打开 [AWS IoT 控制台中的 MQTT 客户端](https://console.aws.amazon.com//iot/home#/test)。这将允许您在不丢失 MQTT 客户端配置的情况下编辑规则。如果您让其转到控制台中的其它页面，MQTT 客户端不会保留任何订阅或消息日志。您还需要在控制台的 D [ynamoDB 表中心打开一个单独的控制台窗口 AWS IoT ，](https://console.aws.amazon.com//dynamodb/home#tables:)以查看您的规则发送的新条目。

**如需使用 MQTT 客户端来测试您的规则**

1. 在 [AWS IoT 控制台中的 MQTT 客户端](https://console.aws.amazon.com//iot/home#/test)中，订阅输入主题，`device/+/data`。

   1. 在 MQTT 客户端中，选择 **Subscribe to a topic**（订阅主题）。

   1. 对于 **Topic filter**（主题筛选条件）中，输入输入主题筛选条件的主题，**device/\$1/data**。

   1. 选择**订阅**。

1. 现在，使用特定设备 ID **device/22/data** 向输入主题发布消息。您无法发布到包含通配符的 MQTT 主题。

   1. 在 MQTT 客户端中，选择 **Publish to a topic**（发布到主题）。

   1. 对于 **Topic name**（主题名称），输入输入主题名称 **device/22/data**。

   1. 对于**消息有效载荷**，输入以下示例数据。

      ```
      {
        "temperature": 28,
        "humidity": 80,
        "barometer": 1013,
        "wind": {
          "velocity": 22,
          "bearing": 255
        }
      }
      ```

   1. 要发布 MQTT 消息，请选择 **Publish**（发布）。

   1. 现在，在 MQTT 客户端中，选择 **Subscribe to a topic**（订阅主题）。在**订阅**栏中，选择 **device/\$1/data** 订阅。确认上一步骤中的示例数据是否显示在此处。

1. 检查以查看您的规则创建的 DynamoDB 表中的行。

   1. **在控制台的 D [ynamoDB 表中心中 AWS IoT](https://console.aws.amazon.com//dynamodb/home#tables:)，**选择 wx\$1data，然后选择**项目选项卡。**

      如果您已经在 **Items**（项目）选项卡上，则可能需要通过选择表格标题右上角的刷新图标来刷新显示。

   1. 请注意，表中的 **sample\$1time** 值是链接，请打开一个。如果您刚刚发送了第一条消息，那么这将是列表中唯一的消息。

      此链接显示表的该行中所有的数据。

   1. 展开 **device\$1data** 条目以查看规则查询语句生成的数据。

   1. 浏览此显示中可用数据的不同表示形式。您也可以编辑此显示中的数据。

   1. 查看完此行数据后，要保存所做的任何更改，请选择 **Save**（保存），或者要退出而不保存任何更改，请选择 **Cancel**（取消）。

如果您未看到正确的行为，请检查故障排除提示。

### 故障排除 DynamoDB 规则
<a name="iot-ddb-rule-trouble"></a>

如果您没有看到期望的结果，可检查以下事项。
+ 

**您收到了一个错误的广告条**  
如果在您发布输入消息时出现错误，请先更正该错误。以下步骤可帮助您更正此错误。
+ 

**您未在 MQTT 客户端中看到输入消息**  
每次将输入消息发布到 `device/22/data`主题时，如果您如流程中所述订阅了 `device/+/data`主题筛选条件，则消息应当会在 MQTT 客户端中显示。

**要检查的事项**
  + 

**检查您订阅的主题筛选条件**  
如果您如流程中所述订阅了输入消息主题，则每次发布输入消息时都应看到该输入消息的副本。

    如果没有看到该消息，请检查您订阅的主题名称，并将其与您发布的主题进行比较。主题名称区分大小写，您订阅的主题必须与发布消息负载的主题相同。
  + 

**检查消息发布函数**  
在 MQTT 客户端中，在**订阅**下，选择 **device/\$1/data**，检查发布消息的主题，然后选择**发布到主题**。您应该会看到来自主题下方编辑框中的消息负载出现在消息列表中。
+ 

**您在 DynamoDB 表中看不到您的数据**  
要做的第一件事是通过选择表格标题右上角的刷新图标来刷新显示。如果没有显示您要查找的数据，请检查以下内容。

**要检查的事项**
  + 

**检查您 AWS 区域 的 MQTT 客户端和您创建的规则**  
您在其中运行 MQTT 客户端的控制台必须位于您所创建规则的同一 AWS 区域。
  + 

**检查规则查询语句中的输入消息主题**  
要使规则起作用，它必须收到一条消息，消息主题名称应与规则查询语句 FROM 子句中的主题筛选条件相匹配。

    检查规则查询语句中主题筛选条件的拼写与 MQTT 客户端中主题的拼写。主题名称区分大小写，消息的主题必须与规则查询语句中的主题筛选条件匹配。
  + 

**检查输入消息负载的内容**  
要使规则起作用，则必须在 SELECT 语句中声明的消息负载中找到数据字段。

    检查规则查询语句 `temperature`字段中的拼写与 MQTT 客户端中消息负载的拼写。字段名称区分大小写，规则查询语句中 `temperature`字段必须与消息负载中的 `temperature`字段相同。

    确保消息负载中的 JSON 文档格式正确。如果 JSON 有任何错误（例如缺少逗号），则规则将无法读取它。
  + 

**检查规则操作中使用的键名和字段名称**  
主题规则中使用的字段名称必须与已发布消息的 JSON 消息有效载荷中找到的字段名称匹配。

    打开在控制台中创建的规则，并检查规则操作配置中的字段名称与 MQTT 客户端中使用的字段名称。
  + 

**检查规则所使用的角色**  
规则操作必须具有接收原始主题和发布新主题的权限。

    授权规则接收消息数据和更新 DynamoDB 表的策略特定于所使用的主题。如果更改规则使用的主题或 DynamoDB 表名称，则必须更新规则操作的角色以更新其策略来匹配。

    如果您怀疑存在问题，请编辑规则操作并创建新角色。规则操作创建的新角色将接收执行这些操作所需的授权。

## 步骤 4：查看结果和后续步骤
<a name="iot-ddb-rule-review"></a>

使用此规则向 DynamoDB 表发送几条消息后，请尝试对其进行试验，以了解更改教程中的某些方面如何影响写入表的数据。以下想法可以帮助您开始操作。
+ 更改输入消息主题*device\$1id*中的并观察其对数据的影响。您可以使用它来模拟从多个气象传感器接收数据。
+ 更改规则查询语句中选定的字段，并观察对数据的影响。您可以使用它筛选存储在表中的数据。
+ 添加重新发布规则操作，以便为添加到表中的每一行发送 MQTT 消息。您可以使用它进行调试。

完成本教程后，检查 [教程：使用 AWS Lambda 函数格式化通知](iot-lambda-rule.md)。

# 教程：使用 AWS Lambda 函数格式化通知
<a name="iot-lambda-rule"></a>

本教程演示如何将 MQTT 消息数据发送到 AWS Lambda 操作以进行格式化并发送到其他 AWS 服务。在本教程中， AWS Lambda 操作使用 AWS 软件开发工具包将格式化的消息发送到您在教程中创建的有关如何操作的 Amazon SNS 主题。[教程：发送 Amazon SNS 通知](iot-sns-rule.md)

在有关如何 [教程：发送 Amazon SNS 通知](iot-sns-rule.md) 的教程中，则由规则的查询语句生成的 JSON 文档将作为文本消息的正文发送。结果是一条文本消息，示例如下：

```
{"device_id":"32","reported_temperature":38,"max_temperature":30}
```

在本教程中，您将使用 AWS Lambda 规则操作来调用一个 AWS Lambda 函数，该函数将规则查询语句中的数据格式化为更友好的格式，例如以下示例：

```
Device 32 reports a temperature of 38, which exceeds the limit of 30.
```

您将在本教程中创建的 AWS Lambda 函数使用规则查询语句中的数据格式化消息字符串，并调用 [S AWS DK 的 SNS 发布](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/sns.html#SNS.Client.publish)函数来创建通知。

**在本教程中您将学到**
+ 如何创建和测试 AWS Lambda 函数
+ 如何在 AWS Lambda 函数中使用 AWS 软件开发工具包发布 Amazon SNS 通知
+ 如何在规则查询语句中使用简单的 SQL 查询和函数
+ 如何使用 MQTT 客户端测试规则 AWS IoT 

完成本教程需要大约 45 分钟。

**Topics**
+ [

## 步骤 1：创建发送短信的 AWS Lambda 函数
](#iot-lambda-rule-create-lambda)
+ [

## 步骤 2：使用 AWS IoT 规则操作创建 AWS Lambda 规则
](#iot-lambda-rule-create-rule)
+ [

## 步骤 3：测试 AWS IoT 规则和 AWS Lambda 规则操作
](#iot-lambda-rule-test-rule)
+ [

## 步骤 4：查看结果和后续步骤
](#iot-lambda-rule-next-steps)

**在开始本教程之前，请确保您具有：**
+ 

**[设置 AWS 账户](setting-up.md)**  
你需要你的 AWS 账户 和 AWS IoT 主机才能完成本教程。
+ 

**审核 [使用 MQTT 客户端查看 AWS IoT MQTT 消息](view-mqtt-messages.md)**  
请确保您可以使用 MQTT 客户端订阅和发布主题。您将使用 MQTT 客户端在此流程中测试新规则。
+ 

**完成本部分中的其它规则教程**  
本教程需要您在如何 [教程：发送 Amazon SNS 通知](iot-sns-rule.md) 的教程中创建的 SNS 通知主题。本教程还假定您已完成本部分中其它与规则相关的教程。
+ 

**审核 [AWS Lambda](https://docs.aws.amazon.com//lambda/latest/dg/welcome.html)概览**  
如果您 AWS Lambda 以前从未使用过，请查看[AWS Lambda](https://docs.aws.amazon.com//lambda/latest/dg/welcome.html)并[开始使用 Lambda](https://docs.aws.amazon.com//lambda/latest/dg/getting-started.html)，以了解其术语和概念。

## 步骤 1：创建发送短信的 AWS Lambda 函数
<a name="iot-lambda-rule-create-lambda"></a>

本教程中的 AWS Lambda 函数接收规则查询语句的结果，将元素插入文本字符串，然后将生成的字符串作为通知中的消息发送到 Amazon SNS。

与使用 AWS IoT 规则操作发送通知的操作方法教程不同，本教程使用软件开发工具包的函数从 Lambda 函数发送通知。[教程：发送 Amazon SNS 通知](iot-sns-rule.md) AWS 但是，本教程中使用的实际 Amazon SNS 通知主题与您在有关如何 [教程：发送 Amazon SNS 通知](iot-sns-rule.md) 的教程中使用的主题相同。

**创建发送短信的 AWS Lambda 函数**

1. 创建新 AWS Lambda 函数。

   1. 在 [AWS Lambda 控制台](https://console.aws.amazon.com//lambda/home)中，选择 **Create function**（创建函数）。

   1. 在 **Create function**（创建函数）中，选择 **Use a blueprint**（使用蓝图）。

      搜索并选择 **hello-world-python** 蓝图，然后选择**配置**。

   1. 在 **Basic information**（基本信息）中：

      1. 在 **Function name**（函数名称）中，输入函数的名称，**format-high-temp-notification**。

      1. 在**执行角色**中，选择**从 AWS 策略模板创建新角色**。

      1. 在 Role name（角色名称）中，为新角色输入名称，**format-high-temp-notification-role**。

      1. 在**策略模板 - *可选***中，搜索并选择 **Amazon SNS 发布策略**。

      1. 选择 **Create function**（创建函数）。

1. 修改蓝图代码以格式化并发送 Amazon SNS 通知。

   1. 创建函数后，您应该会看到**format-high-temp-notification**详细信息页面。如果您不这样做，请从 [Lambda **Functions**](https://console.aws.amazon.com//lambda/home#/functions)（Lambda 函数）页打开它。

   1. 在**format-high-temp-notification**详细信息页面中，选择**配置**选项卡，然后滚动到**函数代码**面板。

   1. 在 **Function code**（函数代码）窗口中的 **Environment**（环境）窗格中，选择 Python 文件，`lambda_function.py`。

   1. 在 **Function code**（函数代码）窗口中，从蓝图中删除所有原始程序代码，并将其替换为此代码。

      ```
      import boto3
      #
      #   expects event parameter to contain:
      #   {
      #       "device_id": "32",
      #       "reported_temperature": 38,
      #       "max_temperature": 30,
      #       "notify_topic_arn": "arn:aws:sns:us-east-1:57EXAMPLE833:high_temp_notice"
      #   }
      # 
      #   sends a plain text string to be used in a text message
      #
      #      "Device {0} reports a temperature of {1}, which exceeds the limit of {2}."
      #   
      #   where:
      #       {0} is the device_id value
      #       {1} is the reported_temperature value
      #       {2} is the max_temperature value
      #
      def lambda_handler(event, context):
      
          # Create an SNS client to send notification
          sns = boto3.client('sns')
      
          # Format text message from data
          message_text = "Device {0} reports a temperature of {1}, which exceeds the limit of {2}.".format(
                  str(event['device_id']),
                  str(event['reported_temperature']),
                  str(event['max_temperature'])
              )
      
          # Publish the formatted message
          response = sns.publish(
                  TopicArn = event['notify_topic_arn'],
                  Message = message_text
              )
      
          return response
      ```

   1. 选择 **Deploy**（部署）。

1. 在新窗口中，从关于如何 [教程：发送 Amazon SNS 通知](iot-sns-rule.md) 的教程中查找 Amazon SNS 主题的 Amazon 资源名称（ARN）。

   1. 在新窗口中，打开 [Topics page of the Amazon SNS console](https://console.aws.amazon.com//sns/v3/home#/topics)（Amazon SNS 控制台主题页面）。

   1. 在**主题**页面上，在 Amazon SNS 主题列表中找到 **high\$1temp\$1notice** 通知主题。

   1. 查找 **high\$1temp\$1notice** 通知主题的 **ARN**，以在下一步中使用。

1. 为您的 Lambda 函数创建一个测试使用案例。

   1. 在控制台的 [Lambda F **un**](https://console.aws.amazon.com//lambda/home#/functions) ctions 页面的**format-high-temp-notification**详细信息页面上，**选择页面右上角的选择测试事件**（尽管它看起来已禁用），然后选择**配置测试**事件。

   1. 在 **Configure test event**（配置测试事件）中，选择 **Create new test event**（创建新测试事件）。

   1. 在 **Event name**（事件名称）中，输入 **SampleRuleOutput**。

   1. 在 **Event name**（事件名称）下方的 JSON 编辑器中，请粘贴此示例 JSON 文档。这是您的 AWS IoT 规则将向 Lambda 函数发送的内容的示例。

      ```
      {
        "device_id": "32",
        "reported_temperature": 38,
        "max_temperature": 30,
        "notify_topic_arn": "arn:aws:sns:us-east-1:57EXAMPLE833:high_temp_notice"
      }
      ```

   1. 请参阅具有 **high\$1temp\$1notice**通知主题的 **ARN** 的窗口并复制 ARN 值。

   1. 在 JSON 编辑器中将 `notify_topic_arn` 值替换成您通知主题中的 ARN。

      保持此窗口打开状态，以便在创建 AWS IoT 规则时再次使用该 ARN 值。

   1. 选择 **Choose**（创建）。

1. 使用示例数据测试函数。

   1. 在页面右上角的**format-high-temp-notification**详细信息页面中，确认**SampleRuleOutput**显示在 “**测试**” 按钮旁边。如果没有，请从可用测试事件列表中选择它。

   1. 要将示例规则输出消息发送到您的函数，请选择 **Test**（测试）。

如果函数和通知都有效，您将在订阅通知的手机上收到一条文本消息。

如果您在手机上没有收到文本消息，请检查操作结果。在 **Function code**（函数代码）面板中的 **Execution result**（执行结果）选项卡上，查看响应以查找发生的任何错误。请勿继续执行下一步，直到您的函数可以将通知发送到您的手机。

## 步骤 2：使用 AWS IoT 规则操作创建 AWS Lambda 规则
<a name="iot-lambda-rule-create-rule"></a>

在此步骤中，您将使用规则查询语句格式化来自虚拟气象传感器设备的数据，以发送到 Lambda 函数，该函数将格式化并发送文本消息。

从天气设备接收的示例消息有效载荷如下所示：

```
{
  "temperature": 28,
  "humidity": 80,
  "barometer": 1013,
  "wind": {
    "velocity": 22,
    "bearing": 255
  }
}
```

在此规则中，您将使用规则查询语句为 Lambda 函数创建消息有效载荷，如下所示：

```
{
  "device_id": "32",
  "reported_temperature": 38,
  "max_temperature": 30,
  "notify_topic_arn": "arn:aws:sns:us-east-1:57EXAMPLE833:high_temp_notice"
}
```

这包含 Lambda 函数格式化和发送正确文本消息所需的所有信息。

**创建调用 Lambda 函数的 AWS IoT 规则**

1. 打开[AWS IoT 控制台的 “**规则**” 中心](https://console.aws.amazon.com//iot/home#/rulehub)。

1. 要在 **Rule**（规则）中创建新规则，请选择 **Create**（创建）。

1. 在 **Create a rule**（创建规则）顶部：

   1. 在 **Name**（名称）中，输入规则的名称，**wx\$1friendly\$1text**。

      请记住，规则名称在您的 AWS 账户 和区域内必须是唯一的，并且不能有任何空格。我们在此名称中使用了下划线字符来分隔规则名称中的两个单词。

   1.  在 **Description**（说明）中，描述规则。

      有意义的描述可以更容易地记住此规则的作用以及您创建它的原因。描述可以根据需要延长，因此请尽可能详细。

1. 在**创建规则**的**规则查询语句**中：

   1.  在**使用 SQL 版本**中，选择 **2016-03-23**。

   1. 在**规则查询语句**编辑框中，输入语句：

      ```
      SELECT 
        cast(topic(2) AS DECIMAL) as device_id, 
        temperature as reported_temperature,
        30 as max_temperature,
        'arn:aws:sns:us-east-1:57EXAMPLE833:high_temp_notice' as notify_topic_arn
      FROM 'device/+/data' WHERE temperature > 30
      ```

      本语句：
      + 侦听主题与 `device/+/data`主题筛选条件相符，并且 `temperature`值大于 30 的 MQTT 消息。
      + 从主题字符串中选择第二个元素，将其转换为十进制数，然后将其分配给 `device_id` 字段。
      + 从消息有效载荷中选择 `temperature` 字段的值，并将其分配给 `reported_temperature` 字段。
      + 创建常数值 `30` 来表示限制值，并将其赋值给 `max_temperature` 字段。
      + 为 `notify_topic_arn` 字段创建常数值。

   1. 请参阅具有 **high\$1temp\$1notice** 通知主题的 **ARN** 的窗口并复制 ARN 值。

   1. 将规则查询语句编辑器中的 ARN 值 (*arn:aws:sns:us-east-1:57EXAMPLE833:high\$1temp\$1notice*) 替换为通知主题的 ARN。

1. 在**设置一个或多个操作**中：

   1. 要打开此规则的规则操作列表，请选择 **Add action**（添加操作）。

   1. 在 **Select an action**（选择操作）中，选择 **Send a message to a Lambda function**（向 Lambda 函数发送消息）。

   1. 要打开选定操作的配置页面，请在操作列表底部选择 **Configure action**（配置操作）。

1. 在 **Configure action**（配置操作）中：

   1. 在 **Function name**（函数名称）中，选择 **Select**（选择）。

   1. 选择 **format-high-temp-notification**。

   1. 在 **Configure action**（配置操作）底部，选择 **Add action**（添加操作）。

   1. 要创建规则，请在 **Create a rule**（创建一条规则）底部，选择 **Create rule**（创建规则）。

## 步骤 3：测试 AWS IoT 规则和 AWS Lambda 规则操作
<a name="iot-lambda-rule-test-rule"></a>

要测试新规则，您将使用 MQTT 客户端发布和订阅此规则所使用的 MQTT 消息。

在新窗口中打开 [AWS IoT 控制台中的 MQTT 客户端](https://console.aws.amazon.com//iot/home#/test)。现在，您可以在不丢失 MQTT 客户端配置的情况下编辑规则。如果您离开 MQTT 客户端并转到控制台中的其它页面，则将丢失您的订阅或消息日志。

**如需使用 MQTT 客户端来测试您的规则**

1. 在 [AWS IoT 控制台中的 MQTT 客户端](https://console.aws.amazon.com//iot/home#/test)中，订阅输入主题，在本例中为 `device/+/data`。

   1. 在 MQTT 客户端中，在**订阅**下，选择**订阅主题**。

   1. 在**订阅主题**中，输入输入主题筛选条件的主题，**device/\$1/data**。

   1. 将其它字段保留为默认设置。

   1. 选择**订阅主题**。

      在 **Subscriptions**（订阅）栏，在 **Publish to a topic**（发布到主题）项下，将会显示 **device/\$1/data**。

1. 使用特定设备 ID **device/32/data**向输入主题发布消息。您无法发布到包含通配符的 MQTT 主题。

   1. 在 MQTT 客户端中，在**订阅**下，选择**订阅主题**。

   1. 在**发布**字段中，输入输入主题名称，**device/32/data**。

   1. 复制此处显示的示例数据，然后在主题名称下方的编辑框中粘贴示例数据。

      ```
      {
        "temperature": 38,
        "humidity": 80,
        "barometer": 1013,
        "wind": {
          "velocity": 22,
          "bearing": 255
        }
      }
      ```

   1. 如需发布 MQTT 消息，请选择 **Publish to topic**（发布到主题）。

1. 确认文本消息已发送。

   1. 在 MQTT 客户端的**订阅**下，您之前订阅的主题旁边会有一个绿色圆点。

      绿色圆点表示自上次查看消息以来已收到一条或多条新消息。

   1. 在 **Subscriptions**（订阅）中，选择 **device/\$1/data** 来检查消息负载是否与刚刚发布的内容匹配，如下所示：

      ```
      {
        "temperature": 38,
        "humidity": 80,
        "barometer": 1013,
        "wind": {
          "velocity": 22,
          "bearing": 255
        }
      }
      ```

   1. 检查您用于订阅 SNS 主题的电话，并确认消息负载的内容，如下所示：

      ```
      Device 32 reports a temperature of 38, which exceeds the limit of 30.
      ```

      如果您更改消息主题中的主题 ID 元素，请记住，将 `topic(2)` 值投射为数字值仅在消息主题中的元素仅包含数字字符时才起作用。

1. 尝试发送温度未超过限制的 MQTT 消息。

   1. 在 MQTT 客户端中，在 **Subscriptions**（订阅）项下，选择 **Subscribe to a topic**（订阅主题）。

   1. 在**发布**字段中，输入输入主题名称，**device/33/data**。

   1. 复制此处显示的示例数据，然后在主题名称下方的编辑框中粘贴示例数据。

      ```
      {
        "temperature": 28,
        "humidity": 80,
        "barometer": 1013,
        "wind": {
          "velocity": 22,
          "bearing": 255
        }
      }
      ```

   1. 要发送您的 MQTT 消息，请选择 **Publish to topic**（发布到主题）。

   您应在 **device/\$1/data** 订阅中看到您发送的消息；但是，由于温度值低于规则查询语句中的最大温度，因此您不应收到文本消息。

   如果您未看到正确的行为，请检查故障排除提示。

### 对您的 AWS Lambda 规则和通知进行故障排除
<a name="iot-lambda-rule-troubleshoot"></a>

如果您没有看到期望的结果，可以检查以下事项。
+ 

**您收到了一个错误的广告条**  
如果在您发布输入消息时出现错误，请先更正该错误。以下步骤可帮助您更正此错误。
+ 

**您未在 MQTT 客户端中看到输入消息**  
每次将输入消息发布到 `device/32/data`主题时，如果您如流程中所述订阅了 `device/+/data`主题筛选条件，则消息应当会在 MQTT 客户端中显示。

**要检查的事项**
  + 

**检查您订阅的主题筛选条件**  
如果您如流程中所述订阅了输入消息主题，则每次发布输入消息时都应看到该输入消息的副本。

    如果没有看到该消息，请检查您订阅的主题名称，并将其与您发布的主题进行比较。主题名称区分大小写，您订阅的主题必须与发布消息负载的主题相同。
  + 

**检查消息发布函数**  
在 MQTT 客户端中，在**订阅**下，选择 **device/\$1/data**，检查发布消息的主题，然后选择**发布到主题**。您应该会看到来自主题下方编辑框中的消息负载出现在消息列表中。
+ 

**您没有收到 SMS 消息**  
要使规则起作用，规则必须具有授权其接收消息和发送 SNS 通知的正确策略，并且必须接收消息。

**要检查的事项**
  + 

**检查您 AWS 区域 的 MQTT 客户端和您创建的规则**  
您在其中运行 MQTT 客户端的控制台必须位于您所创建规则的同一 AWS 区域。
  + 

**检查消息负载中的温度值是否超过测试阈值**  
如果温度值小于或等于 30（如规则查询语句中定义），则规则将不会执行其任何操作。
  + 

**检查规则查询语句中的输入消息主题**  
要使规则起作用，它必须收到一条消息，消息主题名称应与规则查询语句 FROM 子句中的主题筛选条件相匹配。

    检查规则查询语句中主题筛选条件的拼写与 MQTT 客户端中主题的拼写。主题名称区分大小写，消息的主题必须与规则查询语句中的主题筛选条件匹配。
  + 

**检查输入消息负载的内容**  
要使规则起作用，则必须在 SELECT 语句中声明的消息负载中找到数据字段。

    检查规则查询语句 `temperature`字段中的拼写与 MQTT 客户端中消息负载的拼写。字段名称区分大小写，规则查询语句中 `temperature`字段必须与消息负载中的 `temperature`字段相同。

    确保消息负载中的 JSON 文档格式正确。如果 JSON 有任何错误（例如缺少逗号），则规则将无法读取它。
  + 

**查看 Amazon SNS 通知**  
在 [步骤 1：创建 Amazon SNS 主题，发送 SMS 文本消息](iot-sns-rule.md#iot-sns-rule-create-sns-topic)中，请参阅步骤 3，该步骤介绍如何测试 Amazon SNS 通知并测试通知以确保通知有效。
  + 

**检查 Lambda 函数**  
在 [步骤 1：创建发送短信的 AWS Lambda 函数](#iot-lambda-rule-create-lambda) 中，请参阅步骤 5，该步骤介绍如何使用测试数据测试 Lambda 函数并测试 Lambda 函数。
  + 

**检查规则所使用的角色**  
规则操作必须具有接收原始主题和发布新主题的权限。

    授权规则接收消息数据并重新发布的策略特定于所使用的主题。如果更改用于重新发布消息数据的主题，则必须更新规则操作的角色，以更新其策略来匹配当前主题。

    如果怀疑这里出现了问题，请编辑“重新发布”规则操作并创建新角色。规则操作创建的新角色将接收执行这些操作所需的授权。

## 步骤 4：查看结果和后续步骤
<a name="iot-lambda-rule-next-steps"></a>

**在本教程中：**
+ 您创建了一 AWS IoT 条规则来调用 Lambda 函数，该函数使用您的自定义消息负载发送了 Amazon SNS 通知。
+ 您在规则查询语句中使用了简单的 SQL 查询和函数来为 Lambda 函数创建新的消息有效载荷。
+ 您使用 MQTT 客户端来测试您的 AWS IoT 规则。

**后续步骤**  
使用此规则发送了几条文本消息后，请尝试使用它来了解更改教程的某些方面如何影响消息以及发送消息的时间。以下想法可以帮助您开始操作。
+ 更改输入消息主题*device\$1id*中的内容，并观察短信内容中的效果。
+ 更改规则查询语句中选定的字段，更新 Lambda 函数以在新消息中使用这些字段，并观察文本消息内容中的效果。
+ 将规则查询语句中的测试更改为测试最低温度而不是最高温度。更新 Lambda 函数以格式化新消息，并记得更改 `max_temperature` 名称。
+ 要详细了解如何查找在开发和使用 AWS IoT 规则时可能出现的错误，请参阅[监控 AWS IoT](monitoring_overview.md)。