

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

# Apache Kafka 串流作為 EventBridge 管道中的來源
<a name="eb-pipes-kafka"></a>

Apache Kafka 是開源事件串流平台，可支援資料管道和串流分析等工作負載。您可以使用 [Amazon Managed Streaming for Apache Kafka](eb-pipes-msk.md) (Amazon MSK) 或自我管理的 Apache Kafka 叢集。在 AWS 術語中，*自我管理*叢集是指任何非 託管的 Apache Kafka 叢集 AWS。這包括您自行管理的叢集，以及由第三方供應商託管的叢集，例如 [https://www.confluent.io/](https://www.confluent.io/)、 [https://www.cloudkarafka.com/](https://www.cloudkarafka.com/)或 [https://redpanda.com/](https://redpanda.com/)。

如需叢集其他 AWS 託管選項的詳細資訊，請參閱 *AWS 大數據部落格*上的[在 上執行 Apache Kafka 的最佳實務 AWS](https://aws.amazon.com/blogs/big-data/best-practices-for-running-apache-kafka-on-aws/)。

Apache Kafka 做為來源的運作方式類似於使用 Amazon Simple Queue Service (Amazon SQS) 或 Amazon Kinesis。EventBridge 會在內部輪詢來源中的新訊息，然後同步調用目標。EventBridge 會批次讀取訊息，並將這些訊息作為事件裝載提供給函數。批次大小上限可設定。(預設值為 100 則訊息。)

針對基於 Apache Kafka 的來源，EventBridge 支援處理控制參數，例如批次間隔和批次大小。

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

**範例事件**

下列範例事件顯示管道接收的資訊。您可以使用此事件來建立和篩選事件模式，或定義輸入轉換。並非所有欄位都可以篩選。如需有關所能篩選欄位的詳細資訊，請參閱 [Amazon EventBridge 管道中的事件篩選](eb-pipes-event-filtering.md)。

```
[
  {
    "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",
    "eventSourceKey": "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
        ]
      }
    ]
  }
]
```

## Apache Kafka 叢集身分驗證
<a name="pipes-smaa-authentication"></a>

EventBridge 支持多種方法來進行您自我管理 Apache Kafka 叢集的身分驗證。請確保您已設定 Apache Kafka 叢集使用其中一種支援的身分驗證方法。如需有關 Apache Kafka 安全性的詳細資訊，請參閱 Kafka 文件的[安全性](http://kafka.apache.org/documentation.html#security)區段。

### VPC 存取
<a name="pipes-smaa-auth-vpc"></a>

如果您使用的是自我管理的 Apache Kafka 環境，其中只有 VPC 中的 Apache Kafka 使用者可以存取您的 Apache Kafka 代理程式，您必須在 Apache Kafka 來源中設定 Amazon Virtual Private Cloud (Amazon VPC)。

### SASL/SCRAM 身分驗證
<a name="pipes-smaa-auth-sasl"></a>

EventBridge 管道支援 Simple Authentication and Security Layer/Salted Challenge Response Authentication Mechanism (SASL/SCRAM) 身分驗證與 Transport Layer Security (TLS) 加密。EventBridge 管道會傳送加密的憑證，以便向叢集進行身分驗證。如需 SASL/SCRAM 身分驗證的詳細資訊，請參閱 [RFC 5802](https://tools.ietf.org/html/rfc5802)。

EventBridge 管道支援 SASL/PLAIN 身分驗證與 TLS 加密。使用 SASL/PLAIN 身分驗證時， EventBridge 管道會以純文字 (未加密) 將憑證傳送到伺服器。

若使用 SASL 身分驗證，您需將登入憑證儲存為 AWS Secrets Manager中的秘密。

### 交互 TLS 驗證
<a name="pipes-smaa-auth-mtls"></a>

相互 TLS (mTLS) 可提供用戶端與伺服器之間的雙向身分驗證。用戶端會將憑證傳送至伺服器以供伺服器驗證用戶端，而伺服器會將憑證傳送至用戶端以供用戶端驗證伺服器。

在自我管理 Apache Kafka 中，EventBridge 管道會以用戶端的身分運作。您可以設定用戶端憑證 (做為 Secrets Manager 中的機密) 來驗證 EventBridge 管道與 Kafka 代理程式。客户憑證必須由伺服器信任存放區中的憑證授權機構 (CA) 簽署。

Apache Kafka 叢集會傳送伺服器憑證到 EventBridge 管道，通过 EventBridge 管道來驗證 Kafka 代理程式。伺服器憑證可以是公有憑證授權機構憑證或私有憑證授權機構/自行簽署的憑證。公有 CA 憑證必須由 EventBridge 管道信任存放區中的 CA 簽署。若為私有憑證授權機構/自行簽署的憑證，您可以設定伺服器根憑證授權機構憑證 (做為 Secrets Manager 中的機密)。EventBridge 管道使用根憑證來驗證 Apache Kafka 代理程式。

如需有關 mTLS 的詳細資訊，請參閱[將 Amazon MSK 的相互 TLS 身分驗證作為來源](https://aws.amazon.com/blogs/compute/introducing-mutual-tls-authentication-for-amazon-msk-as-an-event-source)。

### 設定用戶端憑證機密
<a name="pipes-smaa-auth-secret"></a>

CLIENT\_CERTIFICATE\_TLS\_AUTH 機密必須有憑證欄位和私有金鑰欄位。若為加密的私有金鑰，機密需要私有金鑰密碼。憑證與私有金鑰均必須為 PEM 格式。

**注意**  
EventBridge 管道支援 [PBES1](https://datatracker.ietf.org/doc/html/rfc2898/#section-6.1) (但不支援 PBES2) 私有金鑰加密演算法。

憑證欄位必須包含憑證清單，以用戶端憑證開頭，隨後則是任何中繼憑證，並以根憑證結尾。每個憑證均必須以新的一行開始，結構如下：

```
-----BEGIN CERTIFICATE-----  
        <certificate contents>
-----END CERTIFICATE-----
```

Secrets Manager 支援高達 65,536 個位元組的機密，此空間足以容納長憑證鏈。

私有金鑰必須為 [PKCS \#8](https://datatracker.ietf.org/doc/html/rfc5208) 格式，結構如下：

```
-----BEGIN PRIVATE KEY-----  
         <private key contents>
-----END PRIVATE KEY-----
```

對於已加密的私有金鑰，請使用下列結構：

```
-----BEGIN ENCRYPTED PRIVATE KEY-----  
          <private key contents>
-----END ENCRYPTED PRIVATE KEY-----
```

下列範例顯示的是使用了已加密私有金鑰之 mTLS 身分驗證的機密內容。若為加密的私有金鑰，請在機密中包含私有金鑰密碼。

```
{
 "privateKeyPassword": "testpassword",
 "certificate": "-----BEGIN CERTIFICATE-----
MIIE5DCCAsygAwIBAgIRAPJdwaFaNRrytHBto0j5BA0wDQYJKoZIhvcNAQELBQAw
...
j0Lh4/+1HfgyE2KlmII36dg4IMzNjAFEBZiCRoPimO40s1cRqtFHXoal0QQbIlxk
cmUuiAii9R0=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFgjCCA2qgAwIBAgIQdjNZd6uFf9hbNC5RdfmHrzANBgkqhkiG9w0BAQsFADBb
...
rQoiowbbk5wXCheYSANQIfTZ6weQTgiCHCCbuuMKNVS95FkXm0vqVD/YpXKwA/no
c8PH3PSoAaRwMMgOSA2ALJvbRz8mpg==
-----END CERTIFICATE-----",
 "privateKey": "-----BEGIN ENCRYPTED PRIVATE KEY-----
MIIFKzBVBgkqhkiG9w0BBQ0wSDAnBgkqhkiG9w0BBQwwGgQUiAFcK5hT/X7Kjmgp
...
QrSekqF+kWzmB6nAfSzgO9IaoAaytLvNgGTckWeUkWn/V0Ck+LdGUXzAC4RxZnoQ
zp2mwJn2NYB7AZ7+imp0azDZb+8YG2aUCiyqb6PnnA==
-----END ENCRYPTED PRIVATE KEY-----"
}
```

### 設定伺服器根憑證授權機構憑證機密
<a name="pipes-smaa-auth-ca-cert"></a>

如果您的 Kafka 代理程式使用 TLS 加密與私有憑證授權機構簽署的憑證，則您建立此機密。您可以使用 TLS 加密以供 VPC、SASL/SCRAM、SASL/PLAIN 或 mTLS 身分驗證之用。

伺服器根 CA 憑證密碼必須有包含 PEM 格式的 Apache Kafka 代理程式根 CA 憑證的欄位。下列範例說明機密的結構。

```
{
     "certificate": "-----BEGIN CERTIFICATE-----       
  MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx
  EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT
  HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs
  ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dG...
  -----END CERTIFICATE-----"
```

## 網路組態
<a name="pipes-kafka-vpc-config"></a>

如果您使用的是使用私有 VPC 連線的自我管理 Apache Kafka 環境，EventBridge 必須能夠存取與您的 Apache Kafka 代理程式相關聯的 Amazon Virtual Private Cloud (Amazon VPC) 資源。
+ 若要存取 Apache Kafka 叢集的 VPC，EventBridge 可以使用來源子網路的傳出網際網路存取。對於私有子網路，它可以是 NAT 閘道，也可以是您自己的 NAT。確定 NAT 具有公有 IP 地址，可連線至網際網路。對於公有子網路，您必須使用 VPC 端點 （如下所述）。
+ EventBridge 管道也支援透過 交付事件[AWS PrivateLink](https://aws.amazon.com/privatelink/)，可讓您從位於 Amazon Virtual Private Cloud (Amazon VPC) 的事件來源將事件傳送至管道目標，而無須周遊公有網際網路。您可以使用管道從 Amazon Managed Streaming for Apache Kafka (Amazon MSK)、自我管理的 Apache Kafka 和位於私有子網路中的 Amazon MQ 來源輪詢，而不需要部署網際網路閘道、設定防火牆規則或設定代理伺服器。您也可以使用 VPC 端點來支援從公有子網路中的 Kafka 叢集交付。

  若要設定 VPC 端點，請參閱*AWS PrivateLink 《 使用者指南*》中的[建立 VPC 端點](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html#create-interface-endpoint-aws)。針對服務名稱，選取 `com.amazonaws.{{region}}.pipes-data`。

使用下列規則 (最低限度) 設定 Amazon VPC 安全群組：
+ 傳入規則 – 允許 Apache Kafka 代理程式連接埠上針對來源指定的安全群組的所有流量。
+ 傳出規則：針對所有目的地，允許連接埠 443 上的所有流量。允許 Apache Kafka 代理程式連接埠上針對來源指定的安全群組的所有流量。

  中介裝置連接埠包括：
  + 適用於純文字的 9092
  + 適用於 TLS 的 9094
  + 9096 for SASL
  + 適用於 IAM 的 9098

## 使用 Apache Kafka 來源進行消費者自動擴展
<a name="pipes-kafka-ops-scaling"></a>

當您最初建立 Apache Kafka 來源時，EventBridge 會分配一個取用者來處理 Kafka 主題的所有分割區。每個取用者都有多個並行運行的處理器以處理增加的工作負載。此外，EventBridge 會根據工作負載自動縱向擴展或縮小取用者數量。為了保留每個分割區中的訊息順序，主題中每個分割區的取用者數上限是一個取用者。

每隔 1 分鐘，EventBridge 會評估主題中所有分割區的取用者偏移延遲。如果延遲太高，則表示分割區接收訊息的速度比 EventBridge 處理訊息的速度更快。如有必要，EventBridge 會新增或移除主題取用者。新增或刪除取用者的擴展過程，將在三分鐘的評估期間內完成。

如果您的目標過載，則 EventBridge 會減少取用者的數量。此動作可透過減少取用者可擷取和傳送至函數的訊息數量，減少函數的工作負載。