

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

# 教程：将设备数据存储在 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)。