

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

# 创建 AWS IoT 规则
<a name="iot-create-rule"></a>

您可以创建 AWS IoT 规则来路由来自互联事物的数据，以便与其他 AWS 服务进行交互。 AWS IoT 规则由以下部分组成：


**规则的组成部分**  

| 组件 | 说明 | 必需/可选 | 
| --- | --- | --- | 
| 规则名称 |   规则的名称。注意，我们建议不要在您的规则名称中使用个人身份信息。  | 必需。 | 
| 规则描述 |  规则的文字说明。注意，我们建议不要在您的规则描述中使用个人身份信息。  | 可选。 | 
| SQL 语句 |  一种简化的 SQL 语法，用于筛选接收的 MQTT 主题相关消息并向其它推送数据。有关更多信息，请参阅 [AWS IoT SQL 参考](iot-sql-reference.md)。  | 必需。 | 
| SQL 版本 |  评估规则时使用的 SQL 规则引擎的版本。尽管该属性是可选的，但我们强烈建议您指定 SQL 版本。默认情况下， AWS IoT Core 控制台将此属性设置`2016-03-23`为。如果未设置此属性，例如在 AWS CLI 命令或 CloudFormation 模板中，`2015-10-08`则使用。有关更多信息，请参阅 [SQL 版本](iot-rule-sql-version.md)。  | 必需。 | 
| 一个或多个操作 | 这些操作是在制定规则时 AWS IoT 执行的。例如，您可以将数据插入 DynamoDB 表、将数据写入 Amazon S3 存储桶、发布至 Amazon SNS 主题或调用 Lambda 函数。 | 必需。 | 
| 错误操作 | 该操作 AWS IoT 在无法执行规则的操作时执行。 | 可选。 | 

在创建 AWS IoT 规则之前，您必须使用允许访问所需 AWS 资源的策略创建 IAM 角色。 AWS IoT 在实施规则时扮演这个角色。有关更多信息，请参阅[授予 AWS IoT 规则所需的访问](https://docs.aws.amazon.com//iot/latest/developerguide/iot-create-role.html)权限和[传递角色权限](https://docs.aws.amazon.com//iot/latest/developerguide/pass-role.html)。

当您创建规则时，请注意在主题上发布的数据量。如果您创建的规则包含通配符主题模式，则这些规则可能会与您的大部分消息匹配。在这种情况下，您可能需要增加目标操作使用的 AWS 资源的容量。我们建议在重新发布规则中避免使用通配符主题模式，以防止重复处理并降低成本。

**注意**  
创建和更新规则是管理员级别操作。有权创建或更新规则的所有用户都能够访问规则处理的数据。

## 创建规则（控制台）
<a name="iot-create-rule-console"></a>

**创建规则 (AWS 管理控制台)**

使用 [AWS 管理控制台](https://console.aws.amazon.com//iot/home#/home) 命令创建规则：

1. 打开 [AWS IoT 控制台](https://console.aws.amazon.com//iot/home#/home)。

1. 在左侧导航栏中，从**管理**部分选择**消息路由**。然后选择**规则**。

1. 在**规则**页面，选择 **创建规则**。

1. 在**指定规则属性**页面上，输入规则的名称。**规则描述**和**标签**为可选。选择**下一步**。

1. 在**配置 SQL 语句**页面上，选择 SQL 版本并输入 SQL 语句。SQL 语句的示例可以是 `SELECT temperature FROM 'iot/topic' WHERE temperature > 50`。有关更多信息，请参阅 [SQL 版本](https://docs.aws.amazon.com//iot/latest/developerguide/iot-rule-sql-version.html)和 [AWS IoT SQL 参考](https://docs.aws.amazon.com//iot/latest/developerguide/iot-sql-reference.html)。

1. 在**附加规则操作**页面上，添加规则操作以将数据路由到其他 AWS 服务。

   1. 在**规则操作**中，从下拉列表中选择规则操作。例如，您可以选择 **Kinesis Stream**。有关规则操作的更多信息，请参阅 [AWS IoT 规则操作](https://docs.aws.amazon.com//iot/latest/developerguide/iot-rule-actions.html)。

   1. 根据您选择的规则操作，输入相关的配置详细信息。例如，如果您选择 **Kinesis Stream**，则需要选择或创建数据流资源，并选择性输入配置详细信息，例如用于在数据流中按分片对数据进行分组的**分区键**。

   1. 在 **IAM 角色**中，选择或创建角色以授予对终端节点的 AWS IoT 访问权限。请注意，这 AWS IoT 将在您选择的 IAM 角色`aws-iot-rule`下自动创建一个前缀为的策略。您可以选择**查看**，从 IAM 控制台中查看您的 IAM 角色和策略。**错误操作**是可选的。您可以在[错误处理（错误操作）](https://docs.aws.amazon.com//iot/latest/developerguide/rule-error-handling.html)中找到更多信息。有关为您的规则创建 IAM 角色的更多信息，请参阅[授予规则所需的访问权限](https://docs.aws.amazon.com//iot/latest/developerguide/iot-create-role.html)。选择**下一步**。

1. 在**查看并创建**页面上，查看所有配置并根据需要进行编辑。选择**创建**。

成功创建规则后，您将在**规则**页面上看到列出该规则。您可以选择一个规则来打开**详细信息**页面，在该页面中可以查看规则、编辑规则、停用规则以及删除规则。

## 创建规则（CLI）
<a name="iot-create-rule-cli"></a>

**创建规则 (AWS CLI)**  
使用 [create-topic-rule](https://docs.aws.amazon.com/cli/latest/reference/iot/create-topic-rule.html) 命令创建规则：

```
aws iot create-topic-rule --rule-name myrule --topic-rule-payload file://myrule.json
```

下面是一个有效载荷文件示例，其中包含将发送至 `iot/test` 主题的所有消息插入指定 DynamoDB 表的规则。SQL 语句筛选消息，ARN 角色授予写入 DynamoDB 表的 AWS IoT 权限。

```
{
	"sql": "SELECT * FROM 'iot/test'",
	"ruleDisabled": false,
	"awsIotSqlVersion": "2016-03-23",
	"actions": [
		{
			"dynamoDB": {
				"tableName": "my-dynamodb-table",
				"roleArn": "arn:aws:iam::123456789012:role/my-iot-role",
				"hashKeyField": "topic",
				"hashKeyValue": "${topic(2)}",
				"rangeKeyField": "timestamp",
				"rangeKeyValue": "${timestamp()}"
			}
		}
	]
}
```

下面是一个有效载荷文件示例，其中包含将发送至 `iot/test` 主题的所有消息插入指定 S3 存储桶的规则。SQL 语句会筛选消息，而角色 ARN 则授予写入 Amazon S3 存储桶的 AWS IoT 权限。

```
{
	"awsIotSqlVersion": "2016-03-23",
	"sql": "SELECT * FROM 'iot/test'",
	"ruleDisabled": false,
	"actions": [
		{
			"s3": {
				"roleArn": "arn:aws:iam::123456789012:role/aws_iot_s3",
				"bucketName": "amzn-s3-demo-bucket",
				"key": "myS3Key"
			}
		}
	]
}
```

以下是载荷文件示例，其中包含将数据推送到 Amazon OpenSearch 服务的规则：

```
{
	"sql": "SELECT *, timestamp() as timestamp FROM 'iot/test'",
	"ruleDisabled": false,
	"awsIotSqlVersion": "2016-03-23",
	"actions": [
		{
			"OpenSearch": {
				"roleArn": "arn:aws:iam::123456789012:role/aws_iot_es",
				"endpoint": "https://my-endpoint",
				"index": "my-index",
				"type": "my-type",
				"id": "${newuuid()}"
			}
		}
	]
}
```

下面的有效载荷文件示例包含调用 Lambda 函数的规则：

```
{
	"sql": "expression",
	"ruleDisabled": false,
	"awsIotSqlVersion": "2016-03-23",
	"actions": [
		{
			"lambda": {
				"functionArn": "arn:aws:lambda:us-west-2:123456789012:function:my-lambda-function"
			}
		}
	]
}
```

下面的有效载荷文件示例包含发布至 Amazon SNS 主题的规则：

```
{
	"sql": "expression",
	"ruleDisabled": false,
	"awsIotSqlVersion": "2016-03-23",
	"actions": [
		{
			"sns": {
				"targetArn": "arn:aws:sns:us-west-2:123456789012:my-sns-topic",
				"roleArn": "arn:aws:iam::123456789012:role/my-iot-role"
			}
		}
	]
}
```

下面的有效载荷文件示例包含在不同 MQTT 主题上重新发布的规则：

```
{
	"sql": "expression",
	"ruleDisabled": false,
	"awsIotSqlVersion": "2016-03-23",
	"actions": [
		{
			"republish": {
				"topic": "my-mqtt-topic",
				"roleArn": "arn:aws:iam::123456789012:role/my-iot-role"
			}
		}
	]
}
```

下面的有效载荷文件示例包含将数据推送至 Amazon Data Firehose 流的规则：

```
{
	"sql": "SELECT * FROM 'my-topic'",
	"ruleDisabled": false,
	"awsIotSqlVersion": "2016-03-23",
	"actions": [
		{
			"firehose": {
				"roleArn": "arn:aws:iam::123456789012:role/my-iot-role",
				"deliveryStreamName": "my-stream-name"
			}
		}
	]
}
```

以下是负载文件示例，其中包含一条规则，如果 MQTT 负载中的数据被归类为 1，则使用 SageMaker Amazon AI `machinelearning_predict` 函数重新发布到主题。

```
{
	"sql": "SELECT * FROM 'iot/test' where machinelearning_predict('my-model', 'arn:aws:iam::123456789012:role/my-iot-aml-role', *).predictedLabel=1",
	"ruleDisabled": false,
	"awsIotSqlVersion": "2016-03-23",
	"actions": [
		{
			"republish": {
				"roleArn": "arn:aws:iam::123456789012:role/my-iot-role",
				"topic": "my-mqtt-topic"
			}
		}
	]
}
```

下面是一个示例有效载荷文件，该文件包含将消息发布到 Salesforce物联网Cloud 输入流的规则。

```
{
	"sql": "expression",
	"ruleDisabled": false,
	"awsIotSqlVersion": "2016-03-23",
	"actions": [
		{
			"salesforce": {
				"token": "ABCDEFGHI123456789abcdefghi123456789",
				"url": "https://ingestion-cluster-id.my-env.sfdcnow.com/streams/stream-id/connection-id/my-event"
			}
		}
	]
}
```

下面是一个有效载荷文件示例，其中包含一个可以开始执行 Step Functions 状态机的规则。

```
{
	"sql": "expression",
	"ruleDisabled": false,
	"awsIotSqlVersion": "2016-03-23",
	"actions": [
		{
			"stepFunctions": {
				"stateMachineName": "myCoolStateMachine",
				"executionNamePrefix": "coolRunning",
				"roleArn": "arn:aws:iam::123456789012:role/my-iot-role"
			}
		}
	]
}
```