

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

# 為 Lambda 設定 Amazon MSK 叢集與 Amazon VPC 網路
<a name="with-msk-cluster-network"></a>

若要將 AWS Lambda 函數連線至 Amazon MSK 叢集，您需要正確設定叢集及其所在的 [Amazon Virtual Private Cloud (VPC)](https://docs.aws.amazon.com/vpc/latest/userguide/what-is-amazon-vpc.html)。本頁介紹了如何設定叢集與 VPC。如果叢集與 VPC 已正確設定，請參閱[設定 Lambda 的 Amazon MSK 事件來源](with-msk-configure.md)，設定事件來源映射。

**Topics**
+ [Lambda 與 MSK 整合的網路組態需求概觀](#msk-network-requirements)
+ [為 MSK 事件來源設定 NAT 閘道](#msk-nat-gateway)
+ [設定 MSK 事件來源的 AWS PrivateLink 端點](#msk-vpc-privatelink)

## Lambda 與 MSK 整合的網路組態需求概觀
<a name="msk-network-requirements"></a>

Lambda 與 MSK 整合所需的聯網組態取決於應用程式的網路架構。此整合涉及三種主要資源：Amazon MSK 叢集、Lambda 函式、Lambda 事件來源映射。這些資源各自位於不同的 VPC 內：
+ Amazon MSK 叢集通常位於您管理的 VPC 的私有子網路內。
+ 您的 Lambda 函數位於 Lambda AWS擁有的受管 VPC 中。
+ 您的 Lambda 事件來源映射位於 Lambda AWS擁有的另一個受管 VPC 中，與包含函數的 VPC 分開。

[事件來源映射](invocation-eventsourcemapping.md)是 MSK 叢集與 Lambda 函式之間的媒介資源。事件來源映射有兩個主要任務。首先，其會輪詢 MSK 叢集來取得新訊息。然後，其會使用這些訊息來調用 Lambda 函式。由於這三種資源位於不同的 VPC 內，輪詢與調用操作皆須跨 VPC 網路進行呼叫。

事件來源映射所需的網路組態取決於其是使用[佈建模式](invocation-eventsourcemapping.md#invocation-eventsourcemapping-provisioned-mode)還是隨需模式，如下圖所示：

![隨需模式與佈建模式 Kafka ESM 的網路呼叫比較](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/MSK-esm-network-overview.png)


在這兩種模式下，Lambda 事件來源映射輪詢 MSK 叢集取得新訊息的方式一致。為了在事件來源映射與 MSK 叢集之間建立連線，Lambda 會在私有子網路內建立 [Hyperplane ENI](configuration-vpc.md#configuration-vpc-enis) (或在可用時重複使用現有介面)，以此建立安全連線。如圖所示，此 Hyperplane ENI 會使用 MSK 叢集的子網路和安全群組組態，而不是 Lambda 函式。

從叢集輪詢訊息之後，Lambda 調用函式的方式在每種模式下有所不同：
+ 在佈建模式下，Lambda 會自動處理事件來源映射 VPC 與函式 VPC 之間的連線。因此，無需任何其他聯網元件，即能成功調用函式。
+ 在隨需模式下，Lambda 事件來源映射會透過客戶自管 VPC 的路徑來調用函式。因此，您需要在 VPC 的公有子網路內設定 [NAT 閘道](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html)，或者在 VPC 的私有子網路內設定 [AWS PrivateLink](https://docs.aws.amazon.com/vpc/latest/privatelink/what-is-privatelink.html) 端點，這些端點需提供對 Lambda、[AWS Security Token Service (STS)](https://docs.aws.amazon.com/STS/latest/APIReference/welcome.html) 的存取權，並可選擇性提供對 [AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html) 的存取權。正確設定其中一個選項，即可在 VPC 與 Lambda 受管執行時期 VPC 之間建立連線，這是調用函式的必要條件。

NAT 閘道允許私有子網路內的資源存取公有網際網路。使用此組態表示您的流量在叫用 Lambda 函數之前周遊網際網路。 AWS PrivateLink 端點可讓私有子網路安全地連線至 AWS 服務或其他私有 VPC 資源，而不會周遊公有網際網路。有關如何設定這些資源的詳細資訊，請參閱[為 MSK 事件來源設定 NAT 閘道](#msk-nat-gateway)或[設定 MSK 事件來源的 AWS PrivateLink 端點](#msk-vpc-privatelink)。

截至目前，我們皆假設 MSK 叢集位於 VPC 的私有子網路內，這也是常見情況。不過，即使 MSK 叢集位於 VPC 的公有子網路內，您仍需設定 AWS PrivateLink 端點，才能啟用安全連線。下表根據設定 MSK 叢集和 Lambda 事件來源映射的方式，摘要說明了聯網組態要求：


| MSK 叢集位置 (位於客戶自管 VPC 內) | Lambda 事件來源映射擴展模式 | 必要的聯網組態 | 
| --- | --- | --- | 
| 私有子網路 | 隨需模式 | NAT 閘道 （位於 VPC 的公有子網路中） 或 AWS PrivateLink 端點 （位於 VPC 的私有子網路中），以啟用對 Lambda 的存取 AWS STS，以及選擇性的 Secrets Manager。 | 
| 公有子網路 | 隨需模式 | AWS PrivateLink 端點 （在 VPC 的公有子網路中），以啟用對 Lambda 的存取 AWS STS，以及選用的 Secrets Manager。 | 
| 私有子網路 | 佈建模式 | 無 | 
| 公有子網路 | 佈建模式 | 無 | 

此外，與 MSK 叢集相關聯的安全群組必須允許正確連接埠的流量。確保您已設定下列安全群組規則：
+ **傳入規則**：允許預設代理程式連接埠上的所有流量。MSK 使用的連接埠取決於叢集上的身分驗證類型：`9098` 用於 IAM 身分驗證、`9096` 用於 SASL/SCRAM，`9094` 用於 TLS。或者，您可使用自我參照安全群組規則，允許來自同一安全群組內其他執行個體的存取。
+ **傳出規則** – 如果您的函數需要與其他 `443` AWS 服務通訊，允許外部目的地連接埠上的所有流量。或者，如果您不需要與其他 AWS 服務通訊，您可以使用自我參考安全群組規則來限制對代理程式的存取。
+ **Amazon VPC 端點傳入規則**：若您使用 Amazon VPC 端點，與該端點相關聯的安全群組必須允許來自叢集安全群組 `443` 連接埠的傳入流量。

## 為 MSK 事件來源設定 NAT 閘道
<a name="msk-nat-gateway"></a>

您可以設定 NAT 閘道，允許事件來源映射從叢集輪詢訊息，並透過 VPC 的路徑調用函式。僅在事件來源映射使用隨需模式，且叢集位於 VPC 的私有子網路內時才需要此操作。如果叢集位於 VPC 的公有子網路內，或者事件來源映射使用佈建模式，則無需設定 NAT 閘道。

[NAT 閘道](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html)允許私有子網路內的資源存取公有網際網路。如需與 Lambda 建立私有連線，請改為參閱[設定 MSK 事件來源的 AWS PrivateLink 端點](#msk-vpc-privatelink)。

設定 NAT 閘道之後，必須設定正確的路由表。這將允許來自私有子網路的流量透過 NAT 閘道路由至公有網際網路。

![客戶自管 VPC 示意圖，其中 VPC 使用 NAT 閘道將流量從私有子網路路由至公有網際網路。](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/MSK-NAT-Gateway.png)


下列步驟將引導您使用主控台設定 NAT 閘道。視需要針對每個可用區域 (AZ) 重複這些步驟。

**設定 NAT 閘道和正確路由 (主控台)**

1. 請遵循[建立 NAT 閘道](https://docs.aws.amazon.com/vpc/latest/userguide/nat-gateway-working-with.html)中的步驟，同時注意下列事項：
   + NAT 閘道應始終位於公有子網路內。建立具有[公有連線](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html)的 NAT 閘道。
   + 如果 MSK 叢集跨多個可用區域複寫，請為每個可用區域建立一個 NAT 閘道。例如，在每個可用區域中，VPC 應該有一個包含叢集的私有子網路，以及一個包含 NAT 閘道的公有子網路。對於具有三個可用區域的設定，您將擁有三個私有子網路、三個公有子網路及三個 NAT 閘道。

1. 建立 NAT 閘道之後，開啟 [Amazon VPC 主控台](https://console.aws.amazon.com/vpc/)，然後在左側功能表中選擇**路由表**。

1. 選擇 **Create route table** (建立路由表)。

1. 將此路由表與包含 MSK 叢集的 VPC 建立關聯。或者，輸入路由表的名稱。

1. 選擇 **Create route table** (建立路由表)。

1. 選擇剛剛建立的路由表。

1. 在**子網路關聯**索引標籤中，選擇**編輯子網路關聯**。
   + 將此路由表與包含 MSK 叢集的私有子網路建立關聯。

1. 選擇 **Edit routes** (編輯路由)。

1. 選擇**新增路由**：

   1. 對於 **Destination (目的地)**，請選擇 `0.0.0.0/0`。

   1. 在**目標**欄位中，選擇 **NAT 閘道**。

   1. 在搜尋方塊中，選擇在步驟 1 中建立的 NAT 閘道。這應該是與包含 MSK 叢集的私有子網路 (您在步驟 6 中與此路由表相關聯的私有子網路) 位於同一可用區域中的 NAT 閘道。

1. 選擇**儲存變更**。

## 設定 MSK 事件來源的 AWS PrivateLink 端點
<a name="msk-vpc-privatelink"></a>

您可以將 AWS PrivateLink 端點設定為從叢集輪詢訊息，並透過 VPC 透過路徑叫用函數。這些端點應允許 MSK 叢集存取下列服務：
+ Lambda 服務
+ [AWS Security Token Service (STS)](https://docs.aws.amazon.com/STS/latest/APIReference/welcome.html)
+ (選用) [AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html) 服務。若叢集身分驗證所需的秘密儲存在 Secrets Manager 中，則此為必要項目。

僅在事件來源映射使用隨需模式時，才需要設定 PrivateLink 端點。如果事件來源映射使用佈建模式，Lambda 會代為建立必要連線。

PrivateLink 端點允許安全的私有存取 AWS 服務 AWS PrivateLink。或者，若要設定 NAT 閘道以讓 MSK 叢集存取公有網際網路，請參閱[為 MSK 事件來源設定 NAT 閘道](#msk-nat-gateway)。

設定 VPC 端點之後，MSK 叢集應可直接且透過私有方式存取 Lambda、STS，以及選擇性地存取 Secrets Manager。

![使用 AWS PrivateLink 端點存取 AWS 服務的客戶受管 VPC 圖表。](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/MSK-PrivateLink-Endpoints.png)


下列步驟將引導您使用主控台設定 PrivateLink 端點。視需要針對每個端點 (Lambda、STS、Secrets Manager) 重複這些步驟。

**設定 VPC PrivateLink 端點 (主控台)**

1. 開啟 [Amazon VPC 主控台](https://console.aws.amazon.com/vpc/)，然後在左側功能表中選擇**端點**。

1. 選擇**建立端點**。

1. 或者，輸入端點的名稱。

1. 在**類型**欄位中，選擇 **AWS 服務**。

1. 在**服務**欄位中，開始輸入服務的名稱。例如，若要建立連線至 Lambda 的端點，請在搜尋方塊中輸入 `lambda`。

1. 在結果中，您應能看到目前區域的服務端點。例如，在美國東部 (維吉尼亞北部) 區域，您應該會看到 `com.amazonaws.us-east-2.lambda`。選取該服務。

1. 在**網路設定**欄位中，選取包含 MSK 叢集的 VPC。

1. 在**子網路**欄位中，選取 MSK 叢集所在的可用區域。
   + 對於每個可用區域，在**子網路 ID** 欄位中，選擇包含 MSK 叢集的私有子網路。

1. 在**安全群組**欄位中，選取與 MSK 叢集相關聯的安全群組。

1. 選擇**建立端點**。

根據預設，Amazon VPC 端點具有開放的 IAM 政策，允許廣泛存取資源。最佳實務是限制這些政策，以使用該端點執行所需的動作。例如，對於 Secrets Manager 端點，您可以修改其政策，使其僅允許函式的執行角色存取秘密。

**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"}}
        }
    ]
}
```

對於 AWS STS 和 Lambda 端點，您可以將呼叫委託人限制為 Lambda 服務委託人。但是，請確定在這些政策使用 `"Resource": "*"`。

**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": "*"
        }
    ]
}
```