

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

# HTTP
<a name="https-rule-action"></a>

HTTPS (`http`) 操作将数据从 MQTT 消息发送到 HTTPS 终端节点，该终端节点可以指向 Web 应用程序或服务。

## 要求
<a name="https-rule-action-requirements"></a>

此规则操作具有以下要求：
+ 您必须先确认并启用 HTTPS 端点，然后规则引擎才能使用它们。有关更多信息，请参阅 [HTTP 操作目的地](http-action-destination.md)。

## 参数
<a name="https-rule-action-parameters"></a>

使用此操作创建 AWS IoT 规则时，必须指定以下信息：

`url`  
使用 HTTP POST 方法发送消息的 HTTPS 端点。如果使用 IP 地址代替主机名，则必须是 IPv4 地址。 IPv6 不支持地址。  
支持[替换模板](iot-substitution-templates.md)：是

`confirmationUrl`  
（可选）如果指定，则 AWS IoT 使用确认 URL 创建匹配的主题规则目标。在 HTTP 操作中使用 HTTP 操作目标之前，必须将其启用。有关更多信息，请参阅 [HTTP 操作目的地](http-action-destination.md)。如果您使用替换模板，则必须先手动创建 HTTP 操作目标，然后才能使用该`http`操作。 `confirmationUrl`前缀必须为`url`。  
`url` 和 `confirmationUrl` 之间的关系由以下内容描述：  
+ 如果`url`是硬编码且`confirmationUrl`未提供，则我们会隐式地将该`url`字段视为. `confirmationUrl` AWS IoT 为创建主题规则目标`url`。
+ 如果`url`和`confirmationUrl`是硬编码，则`url`必须以开头。`confirmationUrl` AWS IoT 为创建主题规则目标`confirmationUrl`。
+ 如果 `url` 包含替换模板，则必须指定 `confirmationUrl` 并且 `url` 必须以 `confirmationUrl` 开头。如果`confirmationUrl`包含替换模板，则必须先手动创建 HTTP 操作目标，然后才能使用该`http`操作。如果`confirmationUrl`不包含替换模板，则为 AWS IoT 创建主题规则目标`confirmationUrl`。
支持[替换模板](iot-substitution-templates.md)：是

`headers`  
（可选）要包含在对端点的 HTTP 请求中的标头列表。每个标头都必须包含以下信息：    
`key`  
标头的键。  
支持[替换模板](iot-substitution-templates.md)：否  
`value`  
标头的值。  
支持[替换模板](iot-substitution-templates.md)：是
当有效负载为 JSON 格式 application/json 时，默认内容类型为。否则，它是 application/octet-stream。您可以在标头中，使用键内容类型（不区分大小写）指定确切的内容类型来覆盖它。

`auth`  
（可选）规则引擎在连接到 `url` 参数中指定的端点 URL 时使用的身份验证。目前，Signature Version 4 是唯一支持的身份验证类型。有关更多信息，请参阅 [HTTP 授权](https://docs.aws.amazon.com/iot/latest/apireference/API_HttpAuthorization.html)。  
支持[替换模板](iot-substitution-templates.md)：否

`enableBatching`  
（可选）是否将 HTTP 操作消息处理成对给定网址的单个请求。值可以是真或假。有关批处理的更多信息，请参阅[批处理 HTTP 操作消息](http_batching.md)。  
布尔值  
支持[替换模板](iot-substitution-templates.md)：否

`batchConfig`  
（可选）批处理的配置设置。启用后，必须指定`batchConfig`参数。如果未指定`batchConfig`参数，则将使用默认值。    
`maxBatchOpenMs`  
传出消息等待其他消息创建批次的最长时间（以毫秒为单位）。设置越高，批处理 HTTP 操作的延迟时间就越长。  
最小值：5 毫秒。最大值：200 毫秒。  
默认值：20 毫秒  
支持[替换模板](iot-substitution-templates.md)：否  
`maxBatchSize`  
在单个操作执行中批处理的最大消息数。  
支持[替换模板](iot-substitution-templates.md)：否  
最小值：2 条消息。最大值：10 条消息  
默认值：10 条消息  
`maxBatchSizeBytes`  
消息批处理的最大大小，以字节为单位。  
最小值：100 字节。最大值：131,072 字节  
默认值：5,120 字节  
支持[替换模板](iot-substitution-templates.md)：否
当有效负载为 JSON 格式 application/json 时，默认内容类型为。否则，它是 application/octet-stream。您可以在标头中，使用键内容类型（不区分大小写）指定确切的内容类型来覆盖它。

## 示例
<a name="https-rule-action-examples"></a>

以下 JSON 示例定义了一 AWS IoT 条带有 HTTP 操作的规则。

```
{
    "topicRulePayload": {
        "sql": "SELECT * FROM 'some/topic'", 
        "ruleDisabled": false,
        "awsIotSqlVersion": "2016-03-23", 
        "actions": [
            { 
                "http": { 
                    "url": "https://www.example.com/subpath",
                    "confirmationUrl": "https://www.example.com", 
                    "headers": [
                        { 
                            "key": "static_header_key", 
                            "value": "static_header_value" 
                        },
                        { 
                            "key": "substitutable_header_key", 
                            "value": "${value_from_payload}" 
                        }
                    ] 
                } 
            }
        ]
    }
}
```

```
"http": { 
    "url": "https://www.example.com/subpath",
    "confirmationUrl": "https://www.example.com", 
    "headers": [
        { 
            "key": "Content-Type",
            "value": "application/json"
          }
    ],
    "enableBatching": true, 
    "batchConfig": {     
      "maxBatchOpenMs": 123, 
      "maxBatchSize": 5, 
      "maxBatchSizeBytes": 131072,
     }
 },
 "errorAction": { 
        "http": { 
            "url": "https://www.example.com/subpath",
            "confirmationUrl": "https://www.example.com"
            // batchConfig is not allowed here
        }
}
```

## HTTP 操作重试逻辑
<a name="https-rule-action-retry-logic"></a>

 AWS IoT 规则引擎将根据以下规则重试 HTTP 操作：
+ 规则引擎尝试至少发送一次消息。
+ 规则引擎最多重试两次。最大尝试次数为三次。
+ 在下列情况中，规则引擎不会尝试重试：
  + 之前的尝试提供了大于 16384 字节的响应。
  + 下游 Web 服务或应用程序在尝试之后关闭了 TCP 连接。
  + 完成包括重试在内的请求总用时超过了请求超时限制。
  + 该请求返回除 429、500-599 之外的 HTTP 状态代码。

**注意**  
[标准数据传输费用](https://aws.amazon.com/ec2/pricing/on-demand/)适用于重试操作。

## 另请参阅
<a name="https-rule-action-see-also"></a>
+ [批处理 HTTP 操作消息](http_batching.md)
+ [HTTP 操作目的地](http-action-destination.md)
+ 通过 AWS博客*上的物联网将数据直接路由 AWS IoT Core 到您的* [Web 服务](https://aws.amazon.com/blogs/iot/route-data-directly-from-iot-core-to-your-web-services/)

# 批处理 HTTP 操作消息
<a name="http_batching"></a>

您可以使用批处理在单个请求中发送多个 HTTP 操作消息。

## 概述
<a name="batching_overview"></a>

批处理使您可以将消息从 AWS IoT Core 规则引擎批量发送到您的 HTTP 终端节点。此功能可通过减少 HTTP 操作执行次数来帮助您降低成本，并通过减少与建立新连接相关的开销来提高效率。

**注意**  
批处理的 HTTP 操作按单个操作计量。根据 AWS IoT Core 规则引擎向下游服务发射的出站批处理有效载荷的大小，以 5 KiB 为增量进行计量。有关更多信息，请参阅 [AWS IoT Core 价格页面](https://aws.amazon.com/iot-core/pricing/)。

当您在物联网规则操作的定义中启用批处理时，将可以使用以下参数进行配置：

`maxBatchOpenMs`  
传出消息等待其他消息创建批次的最长时间（以毫秒为单位）。设置越高，批处理 HTTP 操作的延迟时间就越长。  
最小值：5 毫秒。最大值：200 毫秒。  
默认值：20 毫秒  
支持[替换模板](iot-substitution-templates.md)：否

`maxBatchSize`  
在单个 IoT 规则操作执行中批处理的最大消息数。  
最小值：2 条消息。最大值：10 条消息  
默认值：10 条消息  
支持[替换模板](iot-substitution-templates.md)：否

`maxBatchSizeBytes`  
消息批处理的最大大小，以字节为单位。  
最小值：100 字节。最大值：131,072 字节  
默认值：5120 字节  
支持[替换模板](iot-substitution-templates.md)：否

**重要**  
当您指定多个批处理参数时，批处理将在达到第一个限制时完成。例如，如果您将 100 毫秒指定为最大批处理打开时间，将 5 KiB 指定为最大批处理大小，而规则引擎在 100 毫秒内仅批处理 2 KiB，则将创建并发送 2 KiB 的批处理。

## 批量使用 HTTP 标头
<a name="batching_http_headers"></a>

当您在 HTTP 操作中使用标头时，批处理请求会使用最后一条添加到批处理中的消息（不一定是您发布的最后一条消息）中的标头值。我们建议使用以下任一标题值：
+ 批次中的所有消息都相同
+ 适用于所有消息（例如，身份验证凭据）

标头与 HTTP 请求一起发送，不是消息正文的一部分。

**注意**  
启用批处理后：  
批处理请求会自动包含`Content-Type: application/json`标头，因为批处理是作为 JSON 数组发送的。
我们无法保证批次中的最后一条消息是您发布的最后一条消息。这是进入批次的最后一条消息。

## 有效载荷示例
<a name="batching_payload"></a>

以下示例显示了发送到您的 HTTP 终端节点的批量消息负载的结构：

```
[
  {
    "user_id": "user1",
    "steps_today": 1000
  },
  {
    "user_id": "user2",
    "steps_today": 21000
  },
  {
    "user_id": "user8",
    "steps_today": 1500
  },
  ...
]
```

## 限制
<a name="batching_limitations"></a>

以下是批处理的限制：
+ AWS IoT Core 不能保证消息的整体顺序。批处理是在每台主机上本地执行的，这可能会导致批处理中的消息的顺序与接收顺序不同。
+ AWS IoT Core 不在接收方提供消息处理支持。您有责任确保将下游服务配置为批量接受和处理数据。
+ 不支持跨账户批处理，即使消息的目的地是相同的资源标识符（HTTP URL 或资源 ARN）。
+ AWS IoT Core 不能保证批量大小符合您指定的配置。根据时间和消息流，批次可能会小于您配置的限制。
+ 启用批处理后，不支持二进制负载（非 UTF-8 数据）。只接受 UTF-8 文本负载（例如 JSON）。要发送二进制数据，请先对其进行base64编码，然后再将其发送到 HTTP 操作，然后在接收端点对其进行解码。例如，您可以使用物联网规则中的[编码功能](iot-sql-functions.html#iot-function-encode)对二进制有效负载进行编码。或者，您可以对物联网设备中的二进制有效负载进行编码并将其发布到。 AWS IoT Core

## 批处理的错误操作
<a name="batching_errors"></a>

您将无法在错误操作定义中定义单独的批处理逻辑。但是，如果您在主操作中定义了批处理逻辑，则您的错误操作将支持批处理。

当批量请求失败时， AWS IoT Core 规则引擎将遵循 [HTTP 操作重试逻辑](https-rule-action.md#https-rule-action-retry-logic)。在最后一次重试尝试之后，将对整个失败的批次调用错误操作。

以下是启用批处理时出现的错误操作消息的示例：

```
{
    "ruleName": "FailedTopicRule",
    "topic": "topic/rulesengine",
    "payloadsWithMetadata": [
        {
            "id": 1,
            "cloudwatchTraceId": "bebd6d93-6d4a-899e-9e40-56e82252d2be",
            "clientId": "Test",
            "sourceIp": "10.0.0.0",
            "base64OriginalPayload": "eyJ1c2VyX2lkIjogInVzZXI1NjQ3IiwgInN0ZXBzX3RvZGF5IjogMTMzNjUsICJ0aW1lc3RhbXAiOiAiMjAyNS0xMC0wOVQwNzoyMjo1OC45ODQ3OTAxNzZaIn0="
        },
        {
            "id": 2,
            "cloudwatchTraceId": "af94d3b8-0b18-1dbf-2c7d-513f5cb9e2e1",
            "clientId": "Test",
            "sourceIp": "10.0.0.0",
            "base64OriginalPayload": "eyJ1c2VyX2lkIjogInVzZXI1NjQ3IiwgInN0ZXBzX3RvZGF5IjogMTMzNjUsICJ0aW1lc3RhbXAiOiAiMjAyNS0xMC0wOVQwNzoyMjo1OC45ODQ3OTAxNzZaIn0="
        },
        {
            "id": 3,
            "cloudwatchTraceId": "ca441266-c2ce-c916-6aee-b9e5c7831675",
            "clientId": "Test",
            "sourceIp": "10.0.0.0",
            "base64OriginalPayload": "eyJ1c2VyX2lkIjogInVzZXI1NjQ3IiwgInN0ZXBzX3RvZGF5IjogMTMzNjUsICJ0aW1lc3RhbXAiOiAiMjAyNS0xMC0wOVQwNzoyMjo1OC45ODQ3OTAxNzZaIn0="
        }
    ],
    "failures": [
        {
            "affectedIds": [
                1,
                2,
                3
            ],
            "failedAction": "HttpAction",
            "failedResource": "https://example.foobar.com/HttpAction",
            "errorMessage": "HttpAction failed to make a request to the specified endpoint. StatusCode: 500. Reason: Internal Server Error."
        },
        {
            "affectedIds": [
                3
            ],
            "failedAction": "S3Action",
            "failedResource": "amzn-s3-demo-bucket",
            "errorMessage": "Failed to put S3 object. The error received was The specified bucket does not exist"
        },
        {
            "affectedIds": [
                3
            ],
            "failedAction": "LambdaAction",
            "failedResource": "arn:aws:lambda:us-west-2:123456789012:function:dummy",
            "errorMessage": "Failed to invoke lambda function. Received Server error from Lambda. The error code is 403"
        }
    ]
}
```

**注意**  
批量操作失败还会生成更大的错误操作有效负载，这可能会增加由于大小而导致错误操作失败的概率。您可以使用该`ErrorActionFailure`指标监控错误操作失败。请参阅[规则操作指标](metrics_dimensions.md#rule-action-metrics)了解更多信息。

## 使用批处理 HTTP 操作消息 AWS CLI
<a name="batching_procedure"></a>

### 使用批处理创建或更新规则操作
<a name="batching_create_update_rule"></a>

1. 使用相应的 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
     ```
   + 要更新现有规则，请使用以下[replace-topic-rule](https://docs.aws.amazon.com/cli/latest/reference/iot/replace-topic-rule.html)命令：

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

1. 通过在主题规则负载中将 enableBatching 参数设置为 true 来启用批处理功能：

   ```
   {
           "topicRulePayload": {
           "sql": "SELECT * FROM 'some/topic'", 
           "ruleDisabled": false,
           "awsIotSqlVersion": "2016-03-23", 
           "actions": [
               { 
                   "http": { 
                       "url": "https://www.example.com/subpath",
                       "confirmationUrl": "https://www.example.com", 
                       "headers": [
                           { 
                               "key": "static_header_key", 
                               "value": "static_header_value" 
                           },
                           { 
                               "key": "substitutable_header_key", 
                               "value": "${value_from_payload}" 
                            }
                       ],
                       "enableBatching": true,
                       "batchConfig": {
                          "maxBatchOpenMs": 100,
                          "maxBatchSize": 5,
                          "maxBatchSizeBytes": 1024
                       }
                   }
               }
         ]
   }
   ```

1. 配置批处理参数。您无需指定所有批处理参数。您可以选择指定 1、2 或全部 3 个批处理参数。如果您未指定批处理参数，则规则引擎将使用默认值更新该参数。有关批处理参数及其默认值的更多信息，请参阅 [HTTP 参数](https-rule-action.md#https-rule-action-parameters)。

# HTTP 操作目的地
<a name="http-action-destination"></a>

HTTP 操作目标是一项 Web 服务，规则引擎可以将主题规则中的数据路由到该服务。 AWS IoT Core 资源描述了 Web 服务 AWS IoT。目标资源可以由不同的规则共享。

在向其他 Web 服务发送数据之前 AWS IoT Core ，它必须确认自己可以访问该服务的终端节点。

## 概述
<a name="http-action-destination-overview"></a>

HTTP 操作目标指的是支持确认 URL 和一个或多个数据收集的 Web 服务 URLs。目标资源包含您的 Web 服务的确认 URL。配置 HTTP 操作时，需要指定应接收数据的端点的实际 URL 以及 Web 服务的确认 URL。确认目标后，主题规则会将 SQL 语句的结果发送到 HTTPS 端点（而不是发送到确认 URL）。

HTTP 操作目标可以处于以下状态之一：

已启用  
已经确认目标，可以由规则操作使用。目标必须处于 `ENABLED` 状态才能在规则中使用。您只能启用处于 DISABLED 状态的目标。

DISABLED  
已经确认目标，但规则操作无法使用。如果您希望暂时阻止流入端点的流量而无需再次完成确认流程，则此功能非常有用。您只能禁用处于 ENABLED 状态的目标。

进行中  
正在确认目标。

ERROR  
目标确认超时。

在确认并启用 HTTP 操作目标后，它可以与您账户中的任何规则一起使用。

## 管理 HTTP 操作目标
<a name="http-action-destination-managing"></a>

您可以使用以下操作来管理您的 HTTP 操作目标。

### 创建 HTTP 操作目标
<a name="http-action-destination-creating"></a>

您可以通过调用`CreateTopicRuleDestination`操作或使用 AWS IoT 控制台创建 HTTP 操作目标。

创建目标后， AWS IoT 向确认 URL 发送确认请求。确认请求的格式如下：

```
HTTP POST {confirmationUrl}/?confirmationToken={confirmationToken}
Headers:
x-amz-rules-engine-message-type: DestinationConfirmation
x-amz-rules-engine-destination-arn:"arn:aws:iot:us-east-1:123456789012:ruledestination/http/7a280e37-b9c6-47a2-a751-0703693f46e4"
Content-Type: application/json
Body:
{
    "arn":"arn:aws:iot:us-east-1:123456789012:ruledestination/http/7a280e37-b9c6-47a2-a751-0703693f46e4",  
    "confirmationToken": "AYADeMXLrPrNY2wqJAKsFNn-…NBJndA",
    "enableUrl": "https://iot.us-east-1.amazonaws.com/confirmdestination/AYADeMXLrPrNY2wqJAKsFNn-…NBJndA",
    "messageType": "DestinationConfirmation"
}
```

确认请求的内容包含以下信息：

arn  
要确认的 HTTP 操作目标的亚马逊资源名称 (ARN)。

confirmationToken  
发送的确认令牌 AWS IoT Core。示例中是已截断的令牌。您的令牌会更长。您需要此令牌用 AWS IoT Core来确认您的目的地。

enableUrl  
您需要浏览以确认主题规则目标的 URL。

messageType  
消息类型。

### 正在确认 HTTP 操作目的地
<a name="http-action-destination-confirming"></a>

要完成端点确认过程，如果您使用 AWS CLI，则必须在确认 URL 收到确认请求后执行以下步骤。

1. 

**确认目标已准备好接收消息**  
要确认 HTTP 操作目标已准备好接收物联网消息，请在确认请求`enableUrl`中调用，或者执行 `ConfirmTopicRuleDestination` API 操作并传递确认请求`confirmationToken`中的。

1. 

**将主题规则状态设置为已启用**  
确认目标可以接收消息后，必须执行 `UpdateTopicRuleDestination` API 操作才能将主题规则的状态设置为 `ENABLED`。

如果您使用的是 AWS IoT 控制台，请将其复制`confirmationToken`并粘贴到控制 AWS IoT 台中目标的确认对话框中。然后，您就可以启用主题规则。

### 发送新确认请求
<a name="trigger-confirm"></a>

要为目标激活新的确认消息，请调用 `UpdateTopicRuleDestination` 并将主题规则目标的状态设置为 `IN_PROGRESS`。

发送新的确认请求后，重复确认过程。

### 禁用和删除 HTTP 操作目标
<a name="http-action-destination-deleting"></a>

要禁用目标，请调用 `UpdateTopicRuleDestination` 并将主题规则目标的状态设置为 `DISABLED`。可以再次启用处于 DISABLED 状态的主题规则，而无需发送新的确认请求。

要删除 HTTP 操作目标，请调用`DeleteTopicRuleDestination`。

## 证书颁发机构 Support
<a name="http-action-destination-certificates"></a>

**注意**  
不支持自签名证书。

 HTTP 操作目标中的 HTTPS 端点支持[AWS 私有证书颁发机构和 Lets E [ncrypt](https://letsencrypt.org/certificates/) 颁发的证书](https://www.amazontrust.com/repository/)。