

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 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)。

## Parameters
<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。您可以在標頭中使用重要的 content-type 指定確切的內容類型 (不區分大小寫) 來覆寫它。

`auth`  
(選用) 規則引擎用來連線至 `url` 引數中所指定端點 URL 的身分驗證。目前，Signature 第 4 版是唯一支援的身分驗證類型。如需詳細資訊，請參閱 [HTTP 授權](https://docs.aws.amazon.com/iot/latest/apireference/API_HttpAuthorization.html)。  
支援[替代範本](iot-substitution-templates.md)：否

`enableBatching`  
（選用） 是否將 HTTP 動作訊息處理為特定 URL 的單一請求。值可以是 true 或 false。如需批次處理的詳細資訊，請參閱[批次處理 HTTP 動作訊息](http_batching.md)。  
布林值  
支援[替代範本](iot-substitution-templates.md)：否

`batchConfig`  
（選用） 批次處理的組態設定。啟用後，必須指定`batchConfig`參數。如果未指定`batchConfig`參數，則會使用預設值。    
`maxBatchOpenMs`  
傳出訊息等待其他訊息建立批次的時間上限 （以毫秒為單位）。設定越高，批次 HTTP 動作的延遲就越長。  
最小值：5 毫秒。最大值：200 毫秒。  
預設值：20 ms  
支援[替代範本](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。您可以在標頭中使用重要的 content-type 指定確切的內容類型 (不區分大小寫) 來覆寫它。

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

下列 JSON 範例使用 HTTP 動作定義 AWS IoT 規則。

```
{
    "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 動作：
+ 規則引擎會嘗試傳送訊息至少一次。
+ 規則引擎最多重試兩次。嘗試次數上限為三次。
+ 在下列情況下，規則引擎不會嘗試重試：
  + 上一次嘗試提供了大於 16,384 個位元組的回應。
  + 下游 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/)。

當您在 IoT 規則動作的定義中啟用批次處理時，下列參數將可用於組態：

`maxBatchOpenMs`  
傳出訊息等待其他訊息建立批次的時間上限 （以毫秒為單位）。設定越高，批次 HTTP 動作的延遲就越長。  
最小值：5 毫秒。最大值：200 毫秒。  
預設值：20 ms  
支援[替代範本](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 規則中的[編碼函數](iot-sql-functions.html#iot-function-encode)來編碼二進位承載。或者，您可以在 IoT 裝置中編碼二進位承載並將其發佈到 AWS IoT Core。

## 批次處理的錯誤動作
<a name="batching_errors"></a>

您將無法在錯誤動作定義中定義個別的批次邏輯。不過，如果您已在主要動作中定義批次邏輯，您的錯誤動作將支援批次處理。

當批次請求失敗時， AWS IoT Core Rules 引擎將遵循 [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。目的地資源可以由不同的規則共用。

在 AWS IoT Core 可以傳送資料到另一個 Web 服務之前，它必須確認它可以存取服務的端點。

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

HTTP 動作目的地是指支援確認 URL 和一或多個資料收集 URLs Web 服務。目的地資源包含 Web 服務的確認 URL。當您設定 HTTP 動作時，您可以指定應接收資料之端點的實際 URL，以及 Web 服務的確認 URL。在確認了您的目的地之後，主題規則會將 SQL 陳述式的結果傳送至 HTTPS 端點 (而非確認 URL)。

HTTP 動作目的地可以處於下列其中一種狀態：

ENABLED  
目的地已確認，且可由規則動作使用。目的地必須處於 `ENABLED` 狀態，才能在規則中使用它。您只能啟用處於 DISABLED 狀態的目的地。

DISABLED  
目的地已確認，但無法由規則動作使用。如果您想暫時防止流量傳至端點，而不必再次進行確認程序，這會很有用。您只能停用處於 ENABLED 狀態的目的地。

IN\$1PROGRESS  
正在確認目的地。

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 動作目的地的 Amazon Resource Name (ARN)。

confirmationToken  
傳送的確認字符 AWS IoT Core。範例中的字符會被截斷。您的字符將更長。您需要此字符來使用 AWS IoT Core確認目的地。

enableUrl  
您瀏覽以確認主題規則目的地的 URL。

messageType  
訊息的類型。

### 確認 HTTP 動作目的地
<a name="http-action-destination-confirming"></a>

若要完成端點確認程序，如果您使用的是 AWS CLI，您必須在確認 URL 收到確認請求後執行下列步驟。

1. 

**確認目的地已準備好接收訊息**  
若要確認 HTTP 動作目的地已準備好接收 IoT 訊息，請在確認請求`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`。

## 憑證授權機構支援
<a name="http-action-destination-certificates"></a>

**注意**  
不支援自我簽署憑證。

 HTTP 動作目的地中的 HTTPS 端點支援[AWS 私有憑證授權單位和 Lets Encrypt 發行的憑證](https://www.amazontrust.com/repository/)。 [https://letsencrypt.org/certificates/](https://letsencrypt.org/certificates/)