使用 VPC 进行私有联网 - AWS Lambda

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 VPC 进行私有联网

Amazon Virtual Private Cloud (Amazon VPC) 是 AWS 云中的虚拟网络,专用于您的 AWS 账户。您可以使用 Amazon VPC 为资源(如数据库、缓存实例或内部服务)创建专用网络。有关 Amazon VPC 的更多信息,请参阅 Amazon VPC 是什么?

Lambda 函数始终在 Lambda 服务拥有的 VPC 内运行。Lambda 将向此 VPC 应用网络访问和安全规则,并且 Lambda 将会自动维护和监控 VPC。如果 Lambda 函数需要访问您的账户 VPC 中的资源,请配置用于访问 VPC 的函数。Lambda 提供名为 Hyperplane ENI 的托管资源,Lambda 函数使用这些资源从 Lambda VPC 连接到您的账户 VPC 中的 ENI(弹性网络接口)。

使用 VPC 或 Hyperplane ENI 无需额外费用。某些 VPC 组件(如 NAT 网关)需要付费。有关更多信息,请参阅 Amazon VPC 定价

VPC 网络元素

Amazon VPC 网络包括以下网络元素:

  • 弹性网络接口 – 弹性网络接口是 VPC 中表示虚拟网卡的逻辑网络组件。

  • 子网 – 您的 VPC 内的 IP 地址范围。您可以向指定子网添加 AWS 资源。对必须连接互联网的资源使用公有子网,而对不会连接到互联网的资源使用私有子网。

  • 安全组 – 使用安全组控制对每个子网中的 AWS 资源的访问。

  • 访问控制列表 (ACL) – 使用网络 ACL 在子网中提供额外的安全性。默认子网 ACL 允许所有入站和出站流量。

  • 路由表 – 包含一组 AWS 用于导向 VPC 网络流量的路由。您可以将子网与特定路由表显式关联。默认情况下,子网与主路由表关联。

  • 路由 – 路由表中的每个路由用于指定 IP 地址范围以及 Lambda 在该范围内发送流量的目标。此外,路由还指定目标,即通过其发送流量的网关、网络接口或连接。

  • NAT 网关 – 用于控制从私有 VPC 私有子网至互联网的访问的 AWS 网络地址转换 (NAT) 服务。

  • VPC 端点 – 您可以使用 Amazon VPC 端点创建至 AWS 中托管的服务的私有连接,而无需通过互联网,或 NAT 设备、VPN 连接,或者 AWS Direct Connect 连接。有关更多信息,请参阅 AWS PrivateLink 和 VPC 端点

提示

要配置 Lambda 函数访问 VPC 和子网,您可以使用 Lambda 控制台或 API。

请参阅 CreateFunction 中的 VpcConfig 部分来配置函数。有关详细步骤,请参阅 配置 VPC 访问(控制台) 和 配置 VPC 访问 (API)

有关 Amazon VPC 联网定义的更多信息,请参阅《Amazon VPC 开发人员指南》中的 Amazon VPC 的工作原理Amazon VPC 常见问题

将 Lambda 函数连接到您的 VPC

Lambda 函数始终在 Lambda 服务拥有的 VPC 内运行。默认情况下,Lambda 函数不会连接到您账户中的 VPC。在将函数连接到您账户中的 VPC 时,除非 VPC 提供访问权限,否则此函数将无法访问 Internet。

Lambda 使用 Hyperplane ENI 访问 VPC 中的资源。Hyperplane ENI 使用 VPC 到 VPC NAT (V2N) 提供从 Lambda VPC 到您的账户 VPC 的 NAT 功能。V2N 提供从 Lambda VPC 到您的账户 VPC 的连接,但不能提供其他方向的连接。

在您创建 Lambda 函数(或更新其 VPC 设置)时,Lambda 将为函数的 VPC 配置中的每个子网分配 Hyperplane ENI。如果多个函数共享同一个子网和安全组,则 Lambda 函数可以共享一个网络接口。

要连接到另一个 AWS 服务,您可以将 VPC 端点用于 VPC 与受支持的 AWS 服务之间的私有通信。另一种替代方法是使用 NAT 网关将出站流量路由到另一个 AWS 服务。

要使您的函数能够访问 Internet,请将出站流量路由到公有子网中的 NAT 网关。NAT 网关具有公共 IP 地址,可以通过 VPC 的互联网网关连接到互联网。

有关如何配置 Lambda VPC 联网的信息,请参阅 将出站联网连接到 VPC 中的资源 和 连接 Lambda 的入站接口 VPC 端点

共享子网

VPC 共享允许多个 AWS 账户在共享的集中式管理的虚拟私有云(VPC)中创建自己的应用程序资源,如 Amazon EC2 实例和 Lambda 函数。在此模型中,拥有 VPC 的账户(拥有者)与属于同一 AWS 组织的其他账户(参与者)共享一个或多个子网。

要访问私有资源,请将函数连接到 VPC 中的私有共享子网。子网拥有者必须与您共享一个子网,然后您才能将函数与之连接。子网拥有者也可以稍后取消共享子网,从而断开连接。有关如何在共享子网中共享、取消共享和管理 VPC 资源的详细信息,请参阅《Amazon VPC 指南》中的如何与其他账户共享 VPC

Lambda Hyperplane ENI

Hyperplane ENI 是 Lambda 服务创建和管理的托管网络资源。Lambda VPC 中的多个执行环境可以使用 Hyperplane ENI 安全地访问您账户中的 VPC 内的资源。Hyperplane ENI 提供从 Lambda VPC 到您的账户 VPC 的 NAT 功能。

对于每个子网,Lambda 为每个唯一的安全组集创建一个网络接口。账户中共享相同子网和安全组组合的函数将使用相同的网络接口。即使安全组配置无需跟踪,也会自动跟踪通过超平面层建立的连接。来自 VPC,但与已建立连接不对应的入站数据包将在超平面层被丢弃。有关更多信息,请参阅适用于 Linux 实例的 Amazon EC2 用户指南中的安全组和连接跟踪

由于您账户中的函数共享 ENI 资源,因此 ENI 生命周期比其他 Lambda 资源更复杂。以下章节介绍 ENI 生命周期。

创建 ENI

Lambda 可能会为新创建的支持 VPC 的函数或对现有函数的 VPC 配置更改创建 Hyperplane ENI 资源。在 Lambda 创建所需资源时,该函数处于待处理状态。当 Hyperplane ENI 准备就绪后,该函数将转换为活动状态,并且 ENI 可供使用。Lambda 可能需要几分钟时间来创建 Hyperplane ENI。

对于新创建的支持 VPC 的函数,在函数状态转换为活动状态之前,在该函数上运行的任何调用或其他 API 操作都将失败。

对于对现有函数的 VPC 配置更改,在函数状态转换为活动之前,任何函数调用都将继续使用与旧子网和安全组配置关联的 Hyperplane ENI。

如果 Lambda 函数持续 30 天保持空闲状态,则它将会回收未使用的 Hyperplane ENI,并将函数状态设置为空闲。下一次调用会使 Lambda 重新激活空闲函数。调用失败,在 Lambda 完成 Hyperplane ENI 创建或分配之前,函数将进入挂起状态。

有关函数状态的更多信息,请参阅Lambda 函数状态

管理 ENI

Lambda 使用函数的执行角色中的权限来创建和管理网络接口。为账户中支持 VPC 的函数定义唯一子网和安全组组合时,Lambda 将会创建 Hyperplane ENI。Lambda 将为您账户中使用相同子网和安全组组合的其他支持 VPC 的函数重复使用 Hyperplane ENI。

可使用相同 Hyperplane ENI 的 Lambda 函数数量没有配额。但是,每个 Hyperplane ENI 最多支持 65,000 个连接/端口。如果连接数超过 65,000 个,则 Lambda 会创建新的 Hyperplane ENI 来提供额外连接。

当您更新函数配置以访问不同的 VPC 时,Lambda 会终止与之前 VPC 中的 Hyperplane ENI 的连接。更新至新 VPC 的连接可能需要几分钟的时间。在此期间,对该函数的调用将继续使用之前的 VPC。更新完成后,新调用将开始使用新 VPC 中的 Hyperplane ENI。此时,Lambda 函数不再连接到之前的 VPC。

删除 ENI

当您更新函数以删除其 VPC 配置时,Lambda 最多需要 20 分钟才能删除连接的 Hyperplane ENI。仅当没有其他函数(或已发布的函数版本)使用该 Hyperplane ENI 时,Lambda 才会删除 ENI。

Lambda 依赖于函数执行角色中的权限来删除 Hyperplane ENI。如果您在 Lambda 删除 Hyperplane ENI 之前删除执行角色,则 Lambda 将无法删除该 Hyperplane ENI。您可以手动执行删除。

Lambda 无法删除账户中的函数或函数版本正在使用的网络接口。您可以使用 Lambda ENI 查找器识别正在使用 Hyperplane ENI 的函数或函数版本。对于不再需要的任何函数或函数版本,您可以删除 VPC 配置,以便 Lambda 删除 Hyperplane ENI。

连接

Lambda 支持两种类型的连接:TCP(传输控制协议)和 UDP(用户数据报协议)。

当您创建 VPC 时,Lambda 将会自动创建 DHCP 选项集,并将它们与 VPC 相关联。您可以为 VPC 配置自己的 DHCP 选项集。有关更多详细信息,请参阅 Amazon VPC DHCP 选项

Amazon 为您的 VPC 提供 DNS 服务器 (Amazon Route 53 Resolver)。有关更多信息,请参阅 VPC 的 DNS 支持

IPv6 支持

Lambda 支持与 Lambda 的公共双堆栈端点的入站连接,以及通过 IPv6 与双堆栈 VPC 子网的出站连接。

入站

要通过 IPv6 调用您的函数,请使用 Lambda 的公共双堆栈端点。双堆栈端点同时支持 IPv4 和 IPv6。Lambda 双堆栈端点使用以下语法:

protocol://lambda.us-east-1.api.aws

您也可以使用 Lambda 函数 URL 通过 IPv6 调用函数。函数 URL 的端点具有以下格式:

https://url-id.lambda-url.us-east-1.on.aws
出站

您的函数可以通过 IPv6 连接到双堆栈 VPC 子网中的资源。默认情况下,此选项处于关闭状态。要允许出站 IPv6 流量,请使用控制台或使用带有 create-functionupdate-function-configuration 命令的 --vpc-config Ipv6AllowedForDualStack=true 选项。

注意

要在 VPC 中允许出站 IPv6 流量,连接到该函数的所有子网都必须是双堆栈子网。Lambda 不支持 VPC 中针对仅限 IPv6 的子网的出站 IPv6 连接,不支持针对未连接到 VPC 的函数的出站 IPv6 连接,也不支持使用 VPC 端点(AWS PrivateLink)的入站 IPv6 连接。

您可以更新函数代码以通过 IPv6 显式连接到子网资源。以下 Python 示例会打开一个套接字并连接到 IPv6 服务器。

例 :连接到 IPv6 服务器
def connect_to_server(event, context): server_address = event['host'] server_port = event['port'] message = event['message'] run_connect_to_server(server_address, server_port, message) def run_connect_to_server(server_address, server_port, message): sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM, 0) try: # Send data sock.connect((server_address, int(server_port), 0, 0)) sock.sendall(message.encode()) BUFF_SIZE = 4096 data = b'' while True: segment = sock.recv(BUFF_SIZE) data += segment # Either 0 or end of data if len(segment) < BUFF_SIZE: break return data finally: sock.close()

安全性

AWS 提供可用于在 VPC 中提高安全性的两个功能:安全组网络 ACL。安全组可以控制您的资源的入站和出站流量,网络 ACL 可以控制您的子网的入站和出站流量。安全组为大多数子网提供足够的访问控制。如果需要为 VPC 增加额外安全保护,您可以使用网络 ACL。有关更多信息,请参阅 Amazon VPC 中的互联网络流量隐私。您创建的每个子网均自动与 VPC 的默认网络 ACL 关联。您可以更改关联,以及更改默认网络 ACL 的内容。

有关一般安全最佳实践,请参阅 VPC 安全最佳实践。有关如何使用 IAM 管理对 Lambda API 和资源的访问的详细信息,请参阅 AWS Lambda 权限

您可以将特定于 Lambda 的条件键用于 VPC 设置,从而为您的 Lambda 函数提供额外的权限控制。有关 VPC 条件键的更多信息,请参阅将 IAM 条件键用于 VPC 设置

注意

Lambda 函数可以从公有互联网或 AWS PrivateLink 端点调用。您只能通过公有互联网访问自己的函数 URL。虽然 Lambda 函数确实支持 AWS PrivateLink,但函数 URL 并不支持。

可观察性

您可以使用 VPC 流日志捕获有关在您的 VPC 中传入和传出网络接口的 IP 流量的信息。您可以将流日志数据发布到 Amazon CloudWatch Logs 或 Amazon S3。创建流日志后,您可以在选定目标中检索和查看其数据。

注意:当您将函数连接到 VPC 时,CloudWatch 日志消息不使用 VPC 路由。Lambda 使用日志的常规路由发送日志消息。