

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

# 搭配使用 Lambda 與自我管理 Apache Kafka
<a name="with-kafka"></a>

本主題說明如何搭配使用 Lambda 與自我管理 Kafka 叢集。在 AWS 術語中，自我管理叢集包含非AWS 託管的 Kafka 叢集。例如，您可以透過雲端提供者 (例如 [Confluent Cloud](https://www.confluent.io/confluent-cloud/) 或 [Redpanda](https://www.redpanda.com/)) 託管 Kafka 叢集。

本章說明了如何將自我管理的 Apache Kafka 叢集用作 Lambda 函式的事件來源。將自我管理的 Apache Kafka 與 Lambda 整合的一般流程包含以下步驟：

1. **[叢集與網路設定](with-kafka-cluster-network.md)**：首先，使用正確的聯網組態設定自我管理的 Apache Kafka 叢集，允許 Lambda 存取叢集。

1. **[事件來源映射設定](with-kafka-configure.md)**：接著，建立 Lambda 所需的[事件來源映射](invocation-eventsourcemapping.md)資源，將 Apache Kafka 叢集安全地連線至函式。

1. **[函式與許可設定](with-kafka-permissions.md)**：最後，確保函式已正確設定，並且其[執行角色](lambda-intro-execution-role.md)具有必要許可。

Apache Kafka 作為事件來源時，其運作方式類似於使用 Amazon Simple Queue Service (Amazon SQS) 或 Amazon Kinesis。Lambda 會在內部輪詢事件來源中的新訊息，然後同步調用目標 Lambda 函數。Lambda 會批次讀取訊息，並將這些訊息作為事件酬載提供給函數。最大批次大小可進行設定 (預設為 100 則訊息)。如需詳細資訊，請參閱[批次處理行為](invocation-eventsourcemapping.md#invocation-eventsourcemapping-batching)。

若要最佳化自我管理 Apache Kafka 事件來源映射的輸送量，請設定佈建模式。在佈建模式中，可以定義配置給事件來源映射的事件輪詢器數量下限和上限。這可以提高事件來源映射處理意外訊息尖峰的能力。如需詳細資訊，請參閱[佈建模式](kafka-scaling-modes.md#kafka-provisioned-mode)。

**警告**  
Lambda 事件來源映射至少會處理每個事件一次，而且可能會重複處理記錄。為避免與重複事件相關的潛在問題，強烈建議您讓函數程式碼具有等冪性。若要進一步了解，請參閱 AWS 知識中心中的[如何使 Lambda 函數具有等冪性](https://repost.aws/knowledge-center/lambda-function-idempotent)。

對於基於 Kafka 的事件來源，Lambda 支援處理控制參數，例如批次間隔和批次大小。如需詳細資訊，請參閱[批次處理行為](invocation-eventsourcemapping.md#invocation-eventsourcemapping-batching)。

如需如何使用自我管理的 Kafka 作為事件來源的範例，請參閱 AWS 運算部落格上的[使用自我託管的 Apache Kafka 作為 的事件來源 AWS Lambda](https://aws.amazon.com/blogs/compute/using-self-hosted-apache-kafka-as-an-event-source-for-aws-lambda/)。

**Topics**
+ [範例事件](#smaa-sample-event)
+ [為 Lambda 設定自我管理的 Apache Kafka 叢集與網路](with-kafka-cluster-network.md)
+ [設定 Lambda 執行角色許可](with-kafka-permissions.md)
+ [為 Lambda 設定自我管理的 Apache Kafka 事件來源](with-kafka-configure.md)

## 範例事件
<a name="smaa-sample-event"></a>

Lambda 會在調用 Lambda 函數時，在事件參數中傳送訊息批次。事件酬載包含訊息陣列。陣列中的每個項目包含 Kafka 主題和 Kafka 分割區識別符的詳細資訊，以及時間戳記和 base64 編碼的訊息。

```
{
   "eventSource": "SelfManagedKafka",
   "bootstrapServers":"b-2.demo-cluster-1.a1bcde.c1.kafka.us-east-1.amazonaws.com:9092,b-1.demo-cluster-1.a1bcde.c1.kafka.us-east-1.amazonaws.com:9092",
   "records":{
      "mytopic-0":[
         {
            "topic":"mytopic",
            "partition":0,
            "offset":15,
            "timestamp":1545084650987,
            "timestampType":"CREATE_TIME",
            "key":"abcDEFghiJKLmnoPQRstuVWXyz1234==",
            "value":"SGVsbG8sIHRoaXMgaXMgYSB0ZXN0Lg==",
            "headers":[
               {
                  "headerKey":[
                     104,
                     101,
                     97,
                     100,
                     101,
                     114,
                     86,
                     97,
                     108,
                     117,
                     101
                  ]
               }
            ]
         }
      ]
   }
}
```