

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

# 為 Lambda 設定自我管理的 Apache Kafka 叢集與網路
<a name="with-kafka-cluster-network"></a>

若要將 Lambda 函式連線至自我管理的 Apache Kafka 叢集，需要正確設定叢集及其所在的網路。本頁介紹了如何設定叢集與網路。如果叢集與網路已正確設定，請參閱[為 Lambda 設定自我管理的 Apache Kafka 事件來源](with-kafka-configure.md)，設定事件來源映射。

**Topics**
+ [自我管理的 Apache Kafka 叢集設定](#kafka-cluster-setup)
+ [設定網路安全](#services-kafka-vpc-config)

## 自我管理的 Apache Kafka 叢集設定
<a name="kafka-cluster-setup"></a>

您可以透過雲端提供者 (例如 [Confluent Cloud](https://www.confluent.io/confluent-cloud/) 或 [Redpanda](https://www.redpanda.com/)) 託管自我管理的 Apache Kafka 叢集，也可以在自訂的基礎結構上執行該叢集。確保叢集已正確設定，並且可從 Lambda 事件來源映射所要連線的網路進行存取。

## 設定網路安全
<a name="services-kafka-vpc-config"></a>

若要透過事件來源映射授予 Lambda 對自我管理的 Apache Kafka 的完整存取權，您的叢集必須使用公有端點 (公有 IP 位址)，或者您必須提供建立叢集之 Amazon VPC 的存取權。

當您將自我管理的 Apache Kafka 與 Lambda 搭配使用時，請建立 [AWS PrivateLink VPC 端點](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html)，為您的函數提供 Amazon VPC 中資源的存取權。

**注意**  
具有事件來源映射的函數需要使用 AWS PrivateLink VPC 端點，該映射使用事件輪詢器的預設 (隨需) 模式。如果您的事件來源映射使用[佈建模式](invocation-eventsourcemapping.md#invocation-eventsourcemapping-provisioned-mode)，則不需要設定 AWS PrivateLink VPC 端點。

建立端點以提供對下列資源的存取權：
+  Lambda：為 Lambda 服務主體建立端點。
+  AWS STS：為 AWS STS 建立端點，以便服務主體代表您擔任角色。
+  Secrets Manager：如果您的叢集使用 Secrets Manager 來儲存憑證，則請為 Secrets Manager 建立端點。

或者，在 Amazon VPC 中的每個公有子網路上設定一個 NAT 閘道。如需更多詳細資訊，請參閱 [啟用 VPC 連線的 Lambda 函數的網際網路存取](configuration-vpc-internet.md)。

當您為自我管理的 Apache Kafka 建立事件來源映射時，Lambda 會檢查是否已存在彈性網絡介面 (ENI)，適用於為您的 Amazon VPC 設定的子網路和安全群組。如果 Lambda 找到現有的 ENI，它會嘗試重複使用它們。否則，Lambda 會建立新的 ENI 以連線至事件來源並調用您的函數。

**注意**  
Lambda 函數一律會在 Lambda 服務所擁有的 VPC 內執行。函數的 VPC 組態不會影響事件來源映射。只有事件來源的聯網組態會決定 Lambda 如何連線至您的事件來源。

為包含叢集的 Amazon VPC 設定安全群組。根據預設，自我管理的 Apache Kafka 會使用下列連接埠：`9092`。
+ 傳入規則：允許與事件來源相關聯之安全群組的預設代理程式連接埠上的所有流量。或者，您可使用自我參照安全群組規則，允許來自同一安全群組內其他執行個體的存取。
+ 傳出規則：如果函式需要與 AWS 服務通訊，則允許外部目的地連接埠 `443` 上的所有流量。或者，如果不需要與其他 AWS 服務通訊，您也可以使用自我參照安全群組規則來限制代理程式的存取權。
+ Amazon VPC 端點傳入規則：如果您使用的是 Amazon VPC 端點，與您的 Amazon VPC 端點相關聯的安全群組必須允許來自叢集安全群組的連接埠 `443` 上的傳入流量。

如果您的叢集使用身分驗證，則您也可以限制 Secrets Manager 端點的端點政策。若要呼叫 Secrets Manager API，Lambda 會使用您的函數角色，而不是 Lambda 服務主體。

**Example VPC 端點政策 — Secrets Manager 端點**  

```
{
      "Statement": [
          {
              "Action": "secretsmanager:GetSecretValue",
              "Effect": "Allow",
              "Principal": {
                  "AWS": [
                      "arn:aws::iam::123456789012:role/{{my-role}}"
                  ]
              },
              "Resource": "arn:aws::secretsmanager:{{us-west-2}}:123456789012:secret:{{my-secret}}"
          }
      ]
  }
```

當您使用 Amazon VPC 端點時，AWS 會使用端點的彈性網絡介面 (ENI) 來路由您的 API 呼叫，以調用您的函數。Lambda 服務主體需要在使用這些 ENI 的任何角色和函數上呼叫 `lambda:InvokeFunction`。

根據預設，Amazon VPC 端點具有開放的 IAM 政策，允許廣泛存取資源。最佳實務是限制這些政策，以使用該端點執行所需的動作。為了確保事件來源映射能夠調用 Lambda 函數，VPC 端點政策必須允許 Lambda 服務主體呼叫 `sts:AssumeRole` 和 `lambda:InvokeFunction`。限制您的 VPC 端點政策以僅允許源自您組織內部的 API 呼叫，可阻止事件來源映射正常運作，因此在這些政策中需要 `"Resource": "*"`。

下列範例 VPC 端點政策展示了如何授予 Lambda 服務主體對 AWS STS 和 Lambda 端點的必要存取權。

**Example VPC 端點政策 – AWS STS 端點**  

```
{
      "Statement": [
          {
              "Action": "sts:AssumeRole",
              "Effect": "Allow",
              "Principal": {
                  "Service": [
                      "lambda.amazonaws.com"
                  ]
              },
              "Resource": "*"
          }
      ]
    }
```

**Example VPC 端點政策 – Lambda 端點**  

```
{
      "Statement": [
          {
              "Action": "lambda:InvokeFunction",
              "Effect": "Allow",
              "Principal": {
                  "Service": [
                      "lambda.amazonaws.com"
                  ]
              },
              "Resource": "*"
          }
      ]
  }
```