将 Amazon Lambda 与 Amazon VPC Lattice 结合使用 - Amazon Lambda
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

将 Amazon Lambda 与 Amazon VPC Lattice 结合使用

您可以在 Amazon VPC Lattice 服务网络中将 Lambda 函数注册为目标。这样一来,Lambda 函数会成为网络内的服务,并且有权访问 VPC Lattice 服务网络的客户端可以调用您的服务。如果 Lambda 函数需要访问服务网络内的服务,您可以将函数连接到已与该服务网络关联的 VPC。让服务在 VPC Lattice 网络中运行可帮助您更轻松地发现、连接、访问和监控服务。

VPC Lattice 概念

在本指南中,我们将经常引用以下 VPC Lattice 术语

  • 服务 – 服务是可以在实例、容器上或无服务器函数内运行的任何软件应用程序。本主题仅重点介绍使用 Lambda 函数构建的服务。

  • 服务网络 – 服务网络是包含服务网络的逻辑边界。本主题介绍如何将 Lambda 函数配置为 VPC Lattice 服务网络中的服务。

  • 目标组 – 目标组是运行服务的计算类型目标的集合。Lambda 的目标组只能包含一个 Lambda 函数作为目标。不能将具有多个函数的目标组作为目标。

  • 侦听器 – 侦听器是一个接收流量并将其路由至服务网络内不同目标组的进程。

  • 侦听器规则 – 侦听器规则包含侦听器用于确定将流量路由到何处的优先级、操作和条件。每个侦听器都具有默认的侦听器规则,一个侦听器可以有多个侦听器规则。侦听器规则可以包含以下内容:

    • 协议 – 侦听器用于将请求发送到目标的协议。可以是 HTTP 或 HTTPS。

    • 端口 – 侦听器轮询传入请求的端口。可介于 1 到 65535 之间(含 1 和 65535)。

    • 路径 – 目标资源的路径。对于默认侦听器规则,路径为默认路径 /。一个侦听器规则最多可以有 6 个路径,包括默认路径。

    • 优先级 – 侦听器使用路径的优先级来确定将流量路由到哪个路径。数字越小,表示优先级越高。默认路径的优先级最低。如果添加新路径,则 VPC Lattice 会默认将其分配为第二低的优先级。该优先级仅高于默认路径的优先级,但低于所有其他非默认路径的优先级。

此外,我们将引用以下 Amazon Identity and Access Management(IAM)实体:

  • 网络拥有者 – 网络拥有者是拥有 VPC Lattice 服务网络的 IAM 角色。

  • 服务拥有者 – 服务拥有者是拥有使用 Lambda 函数构建的服务的 IAM 角色。服务拥有者和网络拥有者不必是同一实体。

将 Lambda 与 VPC Lattice 和启用 VPC 的函数结合使用

默认情况下,Lambda 函数无法访问 VPC 中的任何私有资源。当您配置 Lambda 函数以连接到 VPC 中的私有子网时,您允许启用 VPC 的函数访问该 VPC 中的资源。换言之,您只关注单个 VPC 的范围。

在 VPC Lattice 网络中注册为服务的 Lambda 函数与启用 VPC 的函数不同,但它们可以相互补充。当您在 VPC Lattice 网络中将 Lambda 函数注册为服务时,将会从一个或多个 VPC 创建函数的入口路径。此外,函数可能具有指向其他 VPC 的可选出口路径。

将 Lambda 函数注册为服务时,您需要关注入口场景。这包括侦听器用于将流量路由到服务的特定侦听器规则配置。从那里,Lambda 函数可以通过 Hyperplane ENI(弹性网络接口)与 VPC 内的其他 Amazon 服务通信。下图演示了这一点,其中 Lambda 函数是 VPC Lattice 网络中的服务。


          此架构图显示了 VPC Lattice 服务网络的不同组件如何交互,重点关注作为已注册服务的 Lambda 函数。

先决条件和权限

本主题假定您同时拥有 VPC Lattice 服务网络和 Lambda 函数。如果您还没有 VPC Lattice 服务网络,请参阅 VPC Lattice 用户指南来创建一个

当您通过 Lambda 控制台或 Amazon Command Line Interface(Amazon CLI)将 Lambda 函数注册为目标时,Lambda 会自动为您添加必要的权限。

要让 Lambda 自动为您添加权限,以便您可以成功创建 Lambda 函数作为 Lambda 服务的目标,您的角色必须具有以下 IAM 权限:

  • AddPermission

  • CreateListener

  • CreateService

  • CreateServiceNetworkServiceAssociation

  • CreateTargetGroup

  • ListServiceNetworks(仅控制台工作流需要)

  • RegisterTargets

要更新 VPC Lattice 网络中的现有服务以指向 Lambda 函数,角色必须具有以下 IAM 权限:

  • CreateService

  • ListListeners(仅控制台工作流需要)

  • ListServices(仅控制台工作流需要)

  • RegisterTargets

您也可以使用以下 Amazon CLI 命令手动添加权限:

aws lambda add-permission --function-name my-function \ --action lambda:InvokeFunction \ --statement-id allow-vpc-lattice \ --principal vpc-lattice.amazonaws.com --source-arn target-group-arn

限制

在 VPC Lattice 网络中使用 Lambda 函数时,请记住以下限制:

  • Lambda 函数和目标组必须位于同一账户和同一区域中。

  • 您可以转发给使用 Lambda 函数创建的服务的请求正文的最大大小为 6MB。

  • Lambda 函数可以返回的响应 JSON 的最大大小为 6MB。

  • 您只能选择 HTTP 和 HTTPS 协议。

在 VPC Lattice 网络中注册 Lambda 函数

您可以使用 Amazon 控制台或 Amazon CLI,在 VPC Lattice 网络中注册任何现有的 Lambda 函数。将函数注册为服务后,它可以立即开始接收请求。

在 VPC Lattice 网络中注册 Lambda 函数(控制台)
  1. 打开 Lambda 控制台的函数页面

  2. 选择要注册的函数的名称。

  3. Function overview(函数概览)下,选择 Add trigger(添加触发器)。

  4. 在下拉菜单中,选择 VPC Lattice 应用程序网络

  5. 对于目的,选择新建

  6. 对于 Service name(服务名称),为您的服务输入一个名称。

  7. 对于 VPC Lattice 网络,选择要将此 Lambda 函数与之关联的服务网络。您也可以输入该服务网络的完整 Amazon 资源名称(ARN)。如果您没有现有服务网络,则可以选择描述中的链接,这会将您引导至 Amazon VPC 控制台,您可以在其中创建 VPC Lattice 网络。

    注意

    您无需选择 VPC Lattice 网络即可完成触发器设置。但是,如果您在不选择网络的情况下创建触发器,则客户端将无法访问服务,直到您将其与 VPC Lattice 网络相关联。

  8. 对于侦听器,配置以下设置:

    • 侦听器名称 – 输入侦听器的名称

    • 协议 – 侦听器用于将请求发送到目标的协议。可以是 HTTP 或 HTTPS。

    • 端口 – 侦听器轮询传入请求的端口。可介于 1 到 65535 之间(含 1 和 65535)。

    • 选择添加侦听器。VPC Lattice 将使用默认路径 / 创建默认路由。创建服务后,您无法更改其名称、协议和端口设置,但仍可以定义新的路由路径。

  9. 选择添加

在 VPC Lattice 网络(Amazon CLI)中注册 Lambda 函数
  1. 使用 create-service 命令创建服务。在响应中记下服务的 ARN。您将在后续步骤中用到它。

    aws vpc-lattice create-service --name my-vpc-lattice-service
  2. 使用 create-target-group 命令创建目标组。在响应中记下目标组的 ARN。您将在后续步骤中用到它。

    aws vpc-lattice create-target-group \ --name my-vpc-lattice-target-group \ --type LAMBDA
    注意

    默认情况下,此命令会创建一个目标组,该目标组使用 V1 事件结构将事件发送到 Lambda 函数。要发送与 Amazon API Gateway 兼容的 V2 事件结构,请指定 LambdaEventStructureVersion 选项。例如,将 --lambda-event-structure-version V2 附加到上一个命令的结尾。

  3. 使用 create-listener 命令在服务网络内创建侦听器。新侦听器会自动使用默认路径 /。将 service 参数的值替换为步骤 1 中服务的 ARN。将 default-action 参数中 TargetGroupArn 的值替换为步骤 2 中的目标组 ARN。

    aws vpc-lattice create-listener \ --name https --service-identifier svc-0e2f2665e1cebb720 \ --protocol HTTPS \ --default-action forward='{targetGroups={targetGroupIdentifier=tg-0e2f2665e1cebb720}}'
  4. 使用 register-targets 命令将 Lambda 函数注册为目标。将 target-group-arn 参数的值替换为步骤 2 中的目标组 ARN。将 targets 参数中 Id 的值替换为 Lambda 函数的 ARN。

    aws vpc-lattice register-targets \ --target-group-identifier arn:aws:vpc-lattice:us-west-2:123456789012:targetgroup/tg-0e2f2665e1cebb720 \ --targets id=arn:aws:lambda:us-west-2:123456789012:function:my-function
    注意

    在前面的 register-targets 命令中,如果 Lambda 函数尚未明确允许 VPC Lattice 调用它,则 VPC Lattice 会自动将必要的权限附加到函数的执行角色。要允许 VPC Lattice 自动附加权限,您的角色需要拥有该AddPermission权限。

  5. 使用 create-service-network-service-association 命令将服务与服务网络相关联。将 service 参数的值替换为步骤 1 中的服务 ARN。将 service-network 参数的值替换为 VPC Lattice 服务网络的 ARN。

    aws vpc-lattice create-service-network-service-association \ --service-identifier arn:aws:vpc-lattice:us-west-2:123456789012:service/svc-0b9b89d907bc8668c \ --service-network-identifier arn:aws:vpc-lattice:us-west-2:123456789012:servicenetwork/03d622a31e5154247

更新 VPC Lattice 网络中的服务目标

您可以更新 VPC Lattice 网络中的任何现有服务,以指向 Lambda 函数目标。您可以通过使用 Amazon 控制台或 Amazon CLI 添加新的路由路径来完成此操作。添加新路径时,VPC Lattice 会为该路径分配第二低的优先级,仅高于默认路径(最低的优先级)。

更新服务的目标以指向 Lambda 函数(控制台)
  1. 打开 Lambda 控制台的函数页面

  2. 选择要注册的函数的名称。

  3. Function overview(函数概览)下,选择 Add trigger(添加触发器)。

  4. 在下拉菜单中,选择 VPC Lattice 应用程序网络

  5. 对于目的,选择选择现有

  6. 对于服务名称,选择现有服务。

  7. 对于侦听器,选择现有侦听器。

  8. 对于规则名称,输入新规则的名称。

  9. 对于路径,为侦听器定义一个新的路由路径。

  10. 选择添加

对于以下步骤,您需要使用服务的 ARN 以及要为其添加新规则的侦听器的 ARN。

  1. 使用 create-target-group 命令创建新的目标组。在响应中记下目标组的 ARN,因为您将在后续步骤中用到它。

    aws vpc-lattice create-target-group \ --name my-vpc-lattice-target-group \ --type LAMBDA
  2. 使用 create-rule 命令为现有侦听器创建新规则。此命令假定您的条件位于当前目录中名为 conditions-pattern.json 的文件中。将 listener-arn 参数的值替换为侦听器的 ARN。将 actions 参数中 TargetGroupArn 的值替换为步骤 1 中的目标组 ARN。

    aws vpc-lattice create-rule \ --name my-rule --priority 1 \ --listener-identifier listener-0e9af499f72e5251b \ --service-identifier svc-01755f67d3a427803 --match httpMatch='{pathMatch={match={prefix="/test"}}}' --default action forward='{targetGroups=[{targetGroupIdentifier=tg-042d5b70f1e743940}]}'
  3. 使用 register-targets 命令将 Lambda 函数注册为目标。将 target-group-arn 参数的值替换为步骤 2 中的目标组 ARN。将 targets 参数中 Id 的值替换为 Lambda 函数的 ARN。

    aws vpc-lattice register-targets \ --target-group-identifier arn:aws:vpc-lattice:us-west-2:123456789012:targetgroup/tg-0e2f2665e1cebb720 \ --targets id=arn:aws:lambda:us-west-2:123456789012:function:my-new-function

注销 Lambda 函数目标

要在 VPC Lattice 网络中注销 Lambda 函数目标,请使用 VPC 控制台。有关更多信息,请参阅《VPC Lattice 用户指南》。

或者,您也可以使用以下 Amazon CLI 命令:

aws vpc-lattice deregister-targets \ --target-group-identifier arn:aws:vpc-lattice:us-west-2:123456789012:targetgroup/tg-0e2f2665e1cebb720 \ --targets id=arn:aws:lambda:us-west-2:123456789012:function:my-new-function

您无法从 Lambda 控制台注销使用 Lambda 函数构建的服务。

跨账户联网

VPC Lattice 服务网络中的服务不必都在同一 Amazon 账户中。此外,VPC Lattice 服务网络本身可以位于不同的账户中。这意味着您可以将使用 Lambda 函数构建的服务与不同 Amazon 账户中的服务网络相关联。您需要获得网络拥有者的特定权限才能创建这些服务关联。有关所需权限的更多信息,请参阅《Amazon VPC Lattice 用户指南》中的准备调用 VPC Lattice API

您可以通过 Amazon 控制台在 Lambda 函数与不同账户中的服务网络之间创建关联。为此,请粘贴网络的完整 ARN,而不是从下拉菜单中选择 VPC Lattice 网络(这只会显示您账户中的网络)。

通常,您可以使用 create-service-network-service-association Amazon CLI 命令在任何服务和任何服务网络之间创建关联。这意味着您可以在中央账户中管理服务网络,并在 Amazon 组织的其他账户中使用 Lambda 函数构建服务。在以下示例中,请注意,serviceservice-network 位于两个不同的账户中:

aws vpc-lattice create-service-network-service-association \ --service arn:aws:vpc-lattice:us-west-2:123456789012:service/svc-0b9b89d907bc8668c \ --service-network arn:aws:vpc-lattice:us-west-2:444455556666:servicenetwork/03d622a31e5154247

从 VPC Lattice 接收事件

VPC Lattice 服务通过 HTTP 和 HTTPS 路由 Lambda 调用请求。函数接收的事件结构版本取决于创建目标组时的 LambdaEventStructureVersion 设置。

V1 事件结构示例

以下是 Lambda 函数可能从 VPC Lattice 接收的 JSON 格式的 V1 事件示例:

{ "raw_path": "/path/to/resource", "method": "GET|POST|HEAD|...", "headers": {"header-key": "header-value", ... }, "query_string_parameters": {"key": "value", ...}, "body": "request-body", "is_base64_encoded": true|false }

如果 content-encoding 标头不存在,Base64 编码取决于内容类型。对于内容类型 text/*application/jsonapplication/xmlapplication/javascript,服务按原样发送正文,并将 isBase64Encoded 设置为 false

注意

如果以纯文本形式发送,则请求正文的最大大小可以为 1023KiB,如果采用 Base64 编码,则最大大小为 767KiB。请求标头的列表最多可以有 50 个键值对。

V2 事件结构示例

以下是 Lambda 函数可能从 VPC Lattice 接收的 JSON 格式的 V2 事件示例:

{ "version": "2.0", "path": "/", "method": "GET|POST|HEAD|...", "headers": {"header-key": "header-value", ... }, "requestContext": { "serviceNetworkArn": "arn:aws:vpc-lattice:region:123456789012:servicenetwork/sn-0bf3f2882e9cc805a", "serviceArn": "arn:aws:vpc-lattice:region:123456789012:service/svc-0a40eebed65f8d69c", "targetGroupArn": "arn:aws:vpc-lattice:region:123456789012:targetgroup/tg-6d0ecf831eec9f09", "identity": { "sourceVpcArn": "arn:aws:ec2:region:123456789012:vpc/vpc-0b8276c84697e7339", "type" : "AWS_IAM", "principal": "arn:aws:sts::123456789012:assumed-role/example-role/057d00f8b51257ba3c853a0f248943cf", "sessionName": "057d00f8b51257ba3c853a0f248943cf", "x509SanDns": "example.com" }, "region": "region", "timeEpoch": "1690497599177430" } }

将响应发送回 VPC Lattice

当您将来自 Lambda 函数的响应发送回 VPC Lattice 时,该响应必须包含 Base64 编码状态、状态代码和相关标头。正文是可选的。以下是 JSON 格式的响应示例:

{ "isBase64Encoded": false, "statusCode": 200, "statusDescription": "200 OK", "headers": { "Set-Cookie": "cookies", "Content-Type": "application/json" }, "body": "Hello from Lambda (optional)" }

要在响应正文中包含二进制内容,您必须对内容进行 Base64 编码并将 isBase64Encoded 设置为 true。这会指示 VPC Lattice 在将响应发送到客户端之前对内容进行解码。

VPC Lattice 不支持ConnectionTransfer-Encoding之类的 hop-by-hop 标题。此外,您可以省略 Content-Length 标头,因为 VPC Lattice 会在将响应发送到客户端之前自动计算它。

注意

如果以纯文本形式发送,则响应正文的最大大小可以为 1023KiB,如果采用 Base64 编码,则最大大小为 767KiB。响应标头的列表最多可以有 50 个键值对。

监控 VPC Lattice 网络中的服务

为了监控在 VPC 莱迪思网络中使用 Lambda 函数构建的服务,VPC Lattice 提供了 CloudWatch 亚马逊指标Amazon CloudTrail、日志和访问日志。这些工具可以帮助您跟踪关键性能指标,例如对服务的请求总数和连接超时次数。

默认情况下,Lambda 会自动向发送指标 CloudWatch 并向发送事件历史日志。 CloudTrail访问日志是可选的,默认情况下,Lambda 会将其停用。有关监控的更多信息,请参阅《VPC Lattice 用户指南》中的监控 Amazon VPC Lattice