

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

# 轉換 Amazon Data Firehose 中的來源資料
<a name="data-transformation"></a>

Amazon Data Firehose 可以調用 Lambda 函數來轉換傳入的來源資料，並將轉換的資料傳遞至目的地。您可以在建立 Firehose 串流時啟用 Amazon Data Firehose 資料轉換。

## 了解資料轉換流程
<a name="data-transformation-flow"></a>

當您啟用 Firehose 資料轉換時，Firehose 會緩衝傳入的資料。緩衝大小提示範圍介於 0.2 MB 到 3MB 之間。除了 Splunk 和 Snowflake 之外，所有目的地的預設 Lambda 緩衝大小提示皆為 1 MB。對於 Splunk 和 Snowflake，預設緩衝提示為 256 KB。Lambda 緩衝間隔提示範圍介於 0 到 900 秒之間。除了 Snowflake 之外，所有目的地的預設 Lambda 緩衝間隔提示都是 60 秒。對於 Snowflake，預設緩衝提示間隔為 30 秒。若要調整緩衝大小，請使用名為 `BufferSizeInMBs`和 的 [ProcessorParameter](https://docs.aws.amazon.com/firehose/latest/APIReference/API_ProcessorParameter.html)，設定 [CreateDeliveryStream](https://docs.aws.amazon.com/firehose/latest/APIReference/API_CreateDeliveryStream.html) 或 [UpdateDestination](https://docs.aws.amazon.com/firehose/latest/APIReference/API_UpdateDestination.html) API 的 [ProcessingConfiguration](https://docs.aws.amazon.com/firehose/latest/APIReference/API_ProcessingConfiguration.html) 參數`IntervalInSeconds`。接著 Firehose 會使用同步調用模式，與每個緩衝批次同步調用指定的 Lambda AWS Lambda 函數。轉換後的資料會從 Lambda 傳送至 Firehose。然後，Firehose 會在達到指定的目的地緩衝大小或緩衝間隔時將其傳送至目的地，以先發生者為準。

**重要**  
在請求和回應方面，Lambda 同步調用模式的​承載大小上限為 6 MB。因此，用來傳送請求至函式的緩衝區大小必須小於或等於 6 MB，且函式所傳回的回應也不得超過 6 MB。

## Lambda 調用持續時間
<a name="data-transformation-execution-duration"></a>

Amazon Data Firehose 支援最長 5 分鐘的 Lambda 調用時間。如果您的 Lambda 函數需要超過 5 分鐘才能完成，您會收到下列錯誤：Firehose 在呼叫 AWS Lambda 時遇到逾時錯誤。支援的函數逾時上限為 5 分鐘。

如需發生此類錯誤時 Amazon Data Firehose 如何處理的資訊，請參閱 [處理資料轉換中的失敗](data-transformation-failure-handling.md)。

# 資料轉換所需的參數
<a name="data-transformation-status-model"></a>

從 Lambda 轉換的所有記錄都必須包含下列參數，否則 Amazon Data Firehose 會拒絕這些參數，並將其視為資料轉換失敗。

------
#### [ For Kinesis Data Streams and Direct PUT ]

從 Lambda 轉換的所有記錄都需要下列參數。
+ `recordId` – 在調用期間，記錄 ID 會從 Amazon Data Firehose 傳遞至 Lambda。轉換記錄必須包含相同的記錄 ID。原始記錄的 ID 與轉換記錄的 ID 若有任何不符，就會視為資料轉換失敗。
+ `result` – 記錄的資料轉換狀態。可能的值包括：`Ok` (記錄轉換成功)、`Dropped` (處理邏輯刻意捨棄記錄)，以及 `ProcessingFailed` (記錄無法轉換)。​ 如果記錄的狀態為 `Ok`或 `Dropped`，Amazon Data Firehose 會將其視為已成功處理。否則，Amazon Data Firehose 會將其視為未成功處理。
+ `data` – 轉換後的資料承載，在 base64 編碼之後。

  以下是一個示例 Lambda 結果輸出：

  ```
   {
      "recordId": "<recordId from the Lambda input>",
      "result": "Ok",
      "data": "<Base64 encoded Transformed data>"
  }
  ```

------
#### [ For Amazon MSK ]

從 Lambda 轉換的所有記錄都需要下列參數。
+ `recordId` – 在調用期間，記錄 ID 會從 Firehose 傳遞至 Lambda。轉換記錄必須包含相同的記錄 ID。原始記錄的 ID 與轉換記錄的 ID 若有任何不符，就會視為資料轉換失敗。
+ `result` – 記錄的資料轉換狀態。可能的值包括：`Ok` (記錄轉換成功)、`Dropped` (處理邏輯刻意捨棄記錄)，以及 `ProcessingFailed` (記錄無法轉換)。​ 如果記錄的狀態為 `Ok`或 `Dropped`，Firehose 會將其視為已成功處理。否則，Firehose 會將其視為未成功處理。
+ `KafkaRecordValue` – 轉換後的資料承載，在 base64 編碼之後。

  以下是一個示例 Lambda 結果輸出：

  ```
   {
      "recordId": "<recordId from the Lambda input>",
      "result": "Ok",
      "kafkaRecordValue": "<Base64 encoded Transformed data>"
  }
  ```

------

# 支援的 Lambda 藍圖
<a name="lambda-blueprints"></a>

這些藍圖示範如何建立和使用 AWS Lambda 函數來轉換 Amazon Data Firehose 資料串流中的資料。

**查看 AWS Lambda 主控台中可用的藍圖**

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/) 開啟 AWS Lambda 主控台。

1. 選擇 **Create function (建立函式)**，接著選擇 **Use a blueprint (使用藍圖)**。

1. 在**藍圖**欄位中，搜尋關鍵字`firehose`以尋找 Amazon Data Firehose Lambda 藍圖。

藍圖清單：
+ **傳送至 Amazon Data Firehose 串流的程序記錄 (Node.js、Python)**

  此藍圖顯示如何使用 AWS Lambda 處理 Firehose 資料串流中資料的基本範例。

  *最新發佈日期：*2016 年 11 月。

  *發行說明：*無。
+ **處理傳送至 Firehose 的 CloudWatch Logs **

  此藍圖已棄用。請勿使用此藍圖。當解壓縮的 CloudWatch Logs 資料超過 6MB (Lambda 限制） 時，可能會產生高費用。如需有關處理傳送至 Firehose 的 CloudWatch Logs 的資訊，請參閱[使用 CloudWatch Logs 寫入 Firehose](https://docs.aws.amazon.com/firehose/latest/dev/writing-with-cloudwatch-logs.html)。
+ **將 syslog 格式的 Amazon Data Firehose 串流記錄轉換為 JSON (Node.js)**

  此藍圖顯示如何將 RFC3164 Syslog 格式的輸入記錄轉換為 JSON。

  *最新發佈日期：*2016 年 11 月。

  *發行說明：*無。

**若要查看 中可用的藍圖 AWS Serverless Application Repository**

1. 前往 [AWS Serverless Application Repository](https://aws.amazon.com/serverless/serverlessrepo)。

1. 選擇**瀏覽所有應用程式**。

1. 在 **Applications (應用程式) ** 欄位中，搜尋關鍵字 `firehose`。

您也可以在不使用藍圖的情況下建立 Lambda 函數。請參閱 [AWS Lambda 入門](https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html)。

# 處理資料轉換中的失敗
<a name="data-transformation-failure-handling"></a>

如果您的 Lambda 函數調用因為網路逾時或因為您已達到 Lambda 調用限制而失敗，Amazon Data Firehose 預設會重試調用三次。如果調用不成功，Amazon Data Firehose 會略過該批次的記錄。略過的記錄會視為未處理成功。您可以使用 [CreateDeliveryStream](https://docs.aws.amazon.com/firehose/latest/APIReference/API_CreateDeliveryStream.html) 或 `[UpdateDestination](https://docs.aws.amazon.com/firehose/latest/APIReference/API_UpdateDestination.html)` API 來指定或覆寫重試選項。若發生這類失敗，您可以將調用錯誤記錄至 Amazon CloudWatch Logs。如需詳細資訊，請參閱[使用 CloudWatch Logs 監控 Amazon Data Firehose](monitoring-with-cloudwatch-logs.md)。

如果記錄的資料轉換狀態為 `ProcessingFailed`，Amazon Data Firehose 會將記錄視為未成功處理。若發生此類失敗，您可透過 Lambda 函數將錯誤日誌發送到 Amazon CloudWatch Logs。如需詳細資訊，請參閱《AWS Lambda 開發人員指南》**中的[存取 AWS Lambda的 Amazon CloudWatch Logs](https://docs.aws.amazon.com/lambda/latest/dg/monitoring-functions-logs.html)。

如果資料轉換失敗，未成功處理的記錄會傳送到 `processing-failed` 資料夾中的 S3 儲存貯體。記錄的格式如下：

```
{
    "attemptsMade": "count",
    "arrivalTimestamp": "timestamp",
    "errorCode": "code",
    "errorMessage": "message",
    "attemptEndingTimestamp": "timestamp",
    "rawData": "data",
    "lambdaArn": "arn"
}
```

`attemptsMade`  
嘗試叫用請求的次數。

`arrivalTimestamp`  
Amazon Data Firehose 收到記錄的時間。

`errorCode`  
Lambda 傳回 HTTP 錯誤代碼。

`errorMessage`  
Lambda 傳回錯誤訊息。

`attemptEndingTimestamp`  
Amazon Data Firehose 停止嘗試 Lambda 調用的時間。

`rawData`  
Base64 編碼記錄資料。

`lambdaArn`  
 Lambda 函數的 Amazon Resource Name (ARN)。

# 備份來源記錄
<a name="data-transformation-source-record-backup"></a>

Amazon Data Firehose 可以同時將所有未轉換的記錄備份到 S3 儲存貯體，同時將轉換的記錄交付到目的地。您可以在建立或更新 Firehose 串流時啟用來源記錄備份。啟用來源記錄備份後，便不能停用。