

# 为 Lambda 配置 Amazon MSK 集群和 Amazon VPC 网络
<a name="with-msk-cluster-network"></a>

要将 Amazon Lambda 函数连接到 Amazon MSK 集群，您需要正确配置集群及其所在的 [Amazon Virtual Private Cloud（VPC）](https://docs.amazonaws.cn/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 事件源配置 Amazon PrivateLink 端点](#msk-vpc-privatelink)

## Lambda 和 MSK 集成的网络配置要求概述
<a name="msk-network-requirements"></a>

Lambda 和 MSK 集成所需的联网配置取决于应用程序的网络架构。此集成涉及三种主要资源：Amazon MSK 集群、Lambda 函数和 Lambda 事件源映射。每种资源都位于不同的 VPC 中：
+ 您的 Amazon MSK 集群通常位于您管理的 VPC 的私有子网中。
+ 您的 Lambda 函数位于 Lambda 拥有的 Amazon 托管 VPC 中。
+ 您的 Lambda 事件源映射位于 Lambda 拥有的另一个 Amazon 托管 VPC 中，与包含函数的 VPC 分开。

[事件源映射](invocation-eventsourcemapping.md)是 MSK 集群和 Lambda 函数之间的中间资源。事件源映射有两个主要任务。首先，它会轮询您的 MSK 集群以获取新消息。然后，它将使用这些消息调用 Lambda 函数。由于这三种资源位于不同的 VPC 中，因此轮询和调用操作都需要跨 VPC 网络调用。

事件源映射的网络配置要求取决于其使用的是[预置模式](invocation-eventsourcemapping.md#invocation-eventsourcemapping-provisioned-mode)还是按需模式，如下图所示：

![\[\]](http://docs.amazonaws.cn/lambda/latest/dg/images/MSK-esm-network-overview.png)


在这两种模式下，Lambda 事件源映射以相同的方式轮询您的 MSK 集群以获取新消息。为了在事件源映射和 MSK 集群之间建立连接，Lambda 会在您的私有子网中创建 [Hyperplane ENI](configuration-vpc.md#configuration-vpc-enis)（或重复使用现有的 Hyperplane ENI，如果可用）来建立安全连接。如图所示，此 Hyperplane ENI 使用 MSK 集群的子网和安全组配置，而不是 Lambda 函数。

轮询集群的消息后，Lambda 在每种模式下以不同的方式调用函数：
+ 在预置模式下，Lambda 会自动处理事件源映射 VPC 和函数 VPC 之间的连接。因此，您不需要任何其他联网组件即可成功调用函数。
+ 在按需模式下，您的 Lambda 事件源映射通过客户托管 VPC 的路径调用函数。因此，您需要在 VPC 的公有子网中配置 [NAT 网关](https://docs.amazonaws.cn/vpc/latest/userguide/vpc-nat-gateway.html)，或者在 VPC 的私有子网中配置 [Amazon PrivateLink](https://docs.amazonaws.cn/vpc/latest/privatelink/what-is-privatelink.html) 端点，以提供对 Lambda、[Amazon Security Token Service（STS）](https://docs.amazonaws.cn/STS/latest/APIReference/welcome.html)以及可选 [Amazon Secrets Manager](https://docs.amazonaws.cn/secretsmanager/latest/userguide/intro.html) 的访问权限。正确配置其中任一选项都可以在您的 VPC 和 Lambda 托管的运行时 VPC 之间建立连接，这是调用您的函数所必需的。

NAT 网关允许私有子网中的资源访问公共互联网。使用此配置意味着您的流量在调用 Lambda 函数之前会遍历互联网。Amazon PrivateLink 端点允许私有子网安全地连接到 Amazon 服务或其他私有 VPC 资源，而无需通过公共互联网。有关如何配置这些资源的详细信息，请参阅[为 MSK 事件源配置 NAT 网关](#msk-nat-gateway)或[为 MSK 事件源配置 Amazon PrivateLink 端点](#msk-vpc-privatelink)。

到目前为止，我们假设您的 MSK 集群位于 VPC 内的私有子网中，这种情况更常见。但是，即使您的 MSK 集群位于 VPC 内的公有子网中，您也必须配置 Amazon PrivateLink 端点以启用安全连接。下表根据您配置 MSK 集群和 Lambda 事件源映射的方式总结了联网配置要求：


| MSK 集群位置（位于客户托管的 VPC 中） | Lambda 事件源映射扩展模式 | 所需的联网配置 | 
| --- | --- | --- | 
|  私有子网  |  按需模式  |  NAT 网关（位于 VPC 的公有子网中），或 Amazon PrivateLink 端点（位于 VPC 的私有子网中），以启用对 Lambda、Amazon STS 以及可选的 Secrets Manager 的访问。  | 
|  公有子网  |  按需模式  |  Amazon PrivateLink 端点（位于 VPC 的公有子网中），以启用对 Lambda、Amazon STS 以及可选的 Secrets Manager 的访问。  | 
|  私有子网  |  预调配模式  |  无  | 
|  公有子网  |  预调配模式  |  无  | 

此外，与您的 MSK 集群关联的安全组必须允许通过正确端口的流量。请确保已配置以下安全组规则：
+ **入站规则**：允许默认代理端口的所有流量。MSK 使用的端口取决于集群上的身份验证类型：`9098` 用于 IAM 身份验证、`9096` 用于 SASL/SCRAM 和 `9094` 用于 TLS。或者，您可以使用自引用安全组规则允许来自同一安全组内的实例进行访问。
+ **出站规则**：如果您的函数需要与其他 Amazon 服务进行通信，则允许端口 `443` 上的所有流量向外部目标传输。或者，如果您不需要与其他 Amazon 服务通信，则可以使用自引用的安全组规则来限制对代理的访问权限。
+ **Amazon VPC 端点入站规则**：如果您正在使用 Amazon VPC 端点，则与该端点关联的安全组必须允许来自集群安全组的端口 `443` 上的入站流量。

## 为 MSK 事件源配置 NAT 网关
<a name="msk-nat-gateway"></a>

您可以配置 NAT 网关，以允许事件源映射轮询来自集群的消息，并通过 VPC 的路径调用该函数。仅当您的事件源映射使用按需模式，并且您的集群位于 VPC 的私有子网中时，才需要这样做。如果您的集群位于 VPC 的公有子网中，或者您的事件源映射使用预置模式，则无需配置 NAT 网关。

[NAT 网关](https://docs.amazonaws.cn/vpc/latest/userguide/vpc-nat-gateway.html)允许私有子网中的资源访问公共互联网。如果您需要与 Lambda 的私有连接，请改为参阅[为 MSK 事件源配置 Amazon PrivateLink 端点](#msk-vpc-privatelink)。

配置 NAT 网关后，必须配置相应的路由表。这允许来自私有子网的流量通过 NAT 网关路由到公共互联网。

![\[\]](http://docs.amazonaws.cn/lambda/latest/dg/images/MSK-NAT-Gateway.png)


以下步骤将指导您使用控制台配置 NAT 网关。根据需要对每个可用区（AZ）重复这些步骤。

**配置 NAT 网关和正确的路由（控制台）**

1. 按照[创建 NAT 网关](https://docs.amazonaws.cn/vpc/latest/userguide/nat-gateway-working-with.html)中的步骤进行操作，注意以下几点：
   + NAT 网关应始终位于公有子网中。创建具有[公有连接](https://docs.amazonaws.cn/vpc/latest/userguide/vpc-nat-gateway.html)的 NAT 网关。
   + 如果您的 MSK 集群跨多个可用区复制，则请为每个可用区创建一个 NAT 网关。例如，在每个可用区中，您的 VPC 应有一个包含集群的私有子网和一个包含 NAT 网关的公有子网。对于具有三个可用区的设置，您将拥有三个私有子网、三个公有子网和三个 NAT 网关。

1. 创建 NAT 网关后，打开 [Amazon VPC 控制台](https://console.amazonaws.cn/vpc/)并在左侧菜单中选择**路由表**。

1. 选择**创建路由表**。

1. 将此路由表与包含 MSK 集群的 VPC 关联。（可选）输入路由表的名称。

1. 选择**创建路由表**。

1. 选择刚刚创建的路由表。

1. 在**子网关联**选项卡下，选择**编辑子网关联**。
   + 将此路由表与包含 MSK 集群的私有子网关联。

1. 选择 **Edit routes (编辑路由)**。

1. 选择**添加路由**：

   1. 对于 **Destination (目标)**，选择 `0.0.0.0/0`。

   1. 对于**目标**，选择 **NAT 网关**。

   1. 在搜索框中，选择已在步骤 1 中创建的 NAT 网关。这应该是与包含您的 MSK 集群的私有子网（您在步骤 6 中与此路由表关联的私有子网）位于同一可用区的 NAT 网关。

1. 选择**保存更改**。

## 为 MSK 事件源配置 Amazon PrivateLink 端点
<a name="msk-vpc-privatelink"></a>

您可以配置 Amazon PrivateLink 端点来轮询来自集群的消息，并通过 VPC 的路径调用该函数。这些端点应允许 MSK 集群访问以下各项：
+ Lambda 服务
+ [Amazon Security Token Service（STS）](https://docs.amazonaws.cn/STS/latest/APIReference/welcome.html)
+ （可选）[Amazon Secrets Manager](https://docs.amazonaws.cn/secretsmanager/latest/userguide/intro.html) 服务。如果集群身份验证所需的密钥存储在 Secrets Manager 中，则需要此项。

仅当事件源映射使用按需模式时，才需要配置 PrivateLink 端点。如果事件源映射使用预置模式，则 Lambda 会为您建立所需的连接。

PrivateLink 端点允许通过 Amazon PrivateLink 安全、私密地访问 Amazon 服务。或者，要配置 NAT 网关以允许您的 MSK 集群访问公共互联网，请参阅[为 MSK 事件源配置 NAT 网关](#msk-nat-gateway)。

配置 VPC 端点后，您的 MSK 集群应该可以直接和私有地访问 Lambda、STS 以及可选的 Secrets Manager。

![\[\]](http://docs.amazonaws.cn/lambda/latest/dg/images/MSK-PrivateLink-Endpoints.png)


以下步骤将指导您使用控制台配置 PrivateLink 端点。根据需要对每个端点（Lambda、STS、Secrets Manager）重复这些步骤。

**配置 VPC PrivateLink 端点（控制台）**

1. 打开 [Amazon VPC 控制台](https://console.amazonaws.cn/vpc/)，然后在左侧菜单中选择**端点**。

1. 选择**创建端点**。

1. （可选）输入端点的名称。

1. 对于**类型**，选择 **Amazon 服务**。

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

对于 Amazon STS 和 Lambda 端点，您可以将调用主体限制为 Lambda 服务主体。但是，请务必在这些政策中使用 `"Resource": "*"`。

**Example VPC 端点策略 – Amazon 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": "*"
        }
    ]
}
```