Lambda 函数作为 VPC Lattice 中的目标 - Amazon VPC Lattice

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

Lambda 函数作为 VPC Lattice 中的目标

您可以将 Lambda 函数注册为 VPC Lattice 目标组的目标,并配置侦听器规则,将请求转发到 Lambda 函数的目标组。当服务将请求转发到以 Lambda 函数为目标的目标组时,则会调用 Lambda 函数,并以 JSON 格式将请求内容传递给 Lambda 函数。有关更多信息,请参阅AWS Lambda 开发人员指南中的AWS Lambda 与 Amazon VPC Lattice 搭配使用

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

  • 您可以发送到 Lambda 函数的请求正文最大大小为 6MB。

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

  • 协议必须是 HTTP 或 HTTPS。

准备 Lambda 函数

如果您将 Lambda 函数与 VPC Lattice 服务结合使用,则以下建议适用。

调用 Lambda 函数的权限

当您创建目标组并使用 AWS Management Console 或注册 Lambda 函数时, AWS CLI VPC Lattice 会代表您向您的 Lambda 函数策略添加所需的权限。

您还可以使用以下 API 调用自行添加权限:

aws lambda add-permission \ --function-name lambda-function-arn-with-alias-name \ --statement-id vpc-lattice \ --principal vpc-lattice.amazonaws.com \ --action lambda:InvokeFunction \ --source-arn target-group-arn
Lambda 函数版本控制

您可以为每个目标组注册一个 Lambda 函数。为确保您可以更改 Lambda 函数,并确保 VPC Lattice 服务始终调用当前版本的 Lambda 函数,请创建函数别名,然后在向 VPC Lattice 服务注册 Lambda 函数时,在函数 ARN 中包含该别名。有关更多信息,请参阅开发人员指南中的 Lambda 函数版本为 Lambda 函数创建别名。AWS Lambda

为 Lambda 函数创建目标组

创建一个要在请求路由中使用的目标组。如果请求内容与侦听器规则匹配,并执行将其转发到此目标组的操作,则 VPC Lattice 服务将调用注册的 Lambda 函数。

要使用控制台创建目标组并注册 Lambda 函数
  1. 通过 https://console.aws.amazon.com/vpc/ 打开 Amazon VPC 控制台。

  2. 在导航窗格中的 VPC Lattice 下,选择目标组

  3. 选择创建目标组

  4. 对于选择目标类型,选择 Lambda 函数

  5. 对于目标组名称,输入目标组的名称。

  6. 对于 Lambda 事件结构版本,请选择一个版本。有关更多信息,请参阅 从 VPC Lattice 服务接收事件

  7. (可选)要添加标签,请展开标签,选择添加新标签,然后输入标签键和标签值。

  8. 选择下一步

  9. 对于 Lambda function (Lambda 函数),请执行下列操作之一:

    • 选择现有 Lambda 函数。

    • 创建新的 Lambda 函数并选中。

    • 稍后注册 Lambda 函数。

  10. 选择创建目标组

使用 AWS CLI创建目标组并注册 Lambda 函数

使用create-target-group注册目标命令

从 VPC Lattice 服务接收事件

VPC Lattice 服务支持通过 HTTP 和 HTTPS 调用 Lambda 请求。该服务以 JSON 格式发送事件,并将 X-Forwarded-For 标头添加到每个请求中。

Base64 编码

如果 content-encoding 标头存在且内容类型不是以下类型之一,则服务对正文进行 Base64 编码:

  • text/*

  • application/json

  • application/xml

  • application/javascript

如果 content-encoding 标头不存在,Base64 编码取决于内容类型。对于上述内容类型,服务按原样发送正文,不进行 Base64 编码。

事件结构格式

在创建或更新类型为 LAMBDA 的目标组时,您可以指定 Lambda 函数接收的事件结构的版本。可能的版本是 V1V2

例 示例事件:V2
{ "version": "2.0", "path": "/", "method": "GET|POST|HEAD|...", "headers": { "header-key": ["header-value", ...], ... }, "queryStringParameters": { "key": ["value", ...] }, "body": "request-body", "isBase64Encoded": true|false, "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:iam::123456789012:assumed-role/my-role/my-session", "principalOrgID": "o-50dc6c495c0c9188", "sessionName": "i-0c7de02a688bde9f7", "x509IssuerOu": "string", "x509SanDns": "string", "x509SanNameCn": "string", "x509SanUri": "string", "x509SubjectCn": "string" }, "region": "region", "timeEpoch": "1690497599177430" } }
body

请求的正文。仅在协议为 HTTP、HTTPS 或 gRPC 时出现。

headers

请求的 HTTP 标头。仅在协议为 HTTP、HTTPS 或 gRPC 时出现。

identity

身份信息。以下是可能的字段。

  • principal:经过验证的主体。仅当 AWS 身份验证成功时才会出现。

  • principalOrgID:经过验证主体的组织 ID。仅当 AWS 身份验证成功时才会出现。

  • sessionName:经过验证会话的名称。仅当 AWS 身份验证成功时才会出现。

  • sourceVpcArn:发出请求的 VPC 的 ARN。仅在可以识别源 VPC 时才会出现。

  • typeAWS_IAM 如果使用了身份验证策略并且 AWS 身份验证成功,则该值为。

如果使用 Roles Anywhere 凭证且验证成功,则会显示以下字段。

  • x509IssuerOu:发布者(OU)。

  • x509SanDns:使用者备用名称(DNS)。

  • x509SanNameCn:发布者备用名称(名称/CN)。

  • x509SanUri:使用者备用名称(URI)。

  • x509SubjectCn:使用者名称(CN)。

isBase64Encoded

表示正文是否经过 base64 编码。仅当协议为 HTTP、HTTPS 或 gRPC,且请求正文还不是字符串时才会出现。

method

请求中的 HTTP 方法。仅在协议为 HTTP、HTTPS 或 gRPC 时出现。

path

请求的路径。仅在协议为 HTTP、HTTPS 或 gRPC 时出现。

queryStringParameters

HTTP 查询字符串参数。仅在协议为 HTTP、HTTPS 或 gRPC 时出现。

serviceArn

接收请求的服务的 ARN。

serviceNetworkArn

传送请求的服务网络的 ARN。

targetGroupArn

接收请求的目标组的 ARN。

timeEpoch

时间(微秒)。

例 示例事件: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 }

响应 VPC Lattice 服务

来自 Lambda 函数的响应必须包含 Base64 编码状态、状态代码和标头。您可以省略正文。

要在响应的正文中包含二进制内容,您必须对内容进行 Base64 编码并将 isBase64Encoded 设置为 true。服务对内容进行解码以检索二进制内容,并将其发送到 HTTP 响应主体中的客户端。

VPC Lattice 服务不支持 hop-by-hop 标头,例如ConnectionTransfer-Encoding。您可以省略 Content-Length 标头,因为服务在向客户端发送响应之前会对其进行计算。

以下是来自 Lambda 函数的示例响应:

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

多值标头

默认情况下,VPC Lattice 支持来自客户端的请求或来自 Lambda 函数的响应,其中包含具有多个值的标头或多次包含相同的标头。VPC Lattice 还支持同一键具有多个值的查询参数。

对于请求标头,如果多个参数名称相同,VPC Lattice 会将两个值传递给目标。以下是一个示例,其中 header 1 是两个单独标头的名称:

header1 = foo header1 = bar

然后,VPC Lattice 将两个值发送给目标:

"header1": ["foo", "bar"]

对于查询字符串,如果多个参数名称相同,则以最后一个值为准。这意味着,如果参数具有相同的键名,则 _not_ coalesced 将成为一个值。

以下是一个示例,其中 foobar 是同名参数的值,QS1

http://www.example.com?&QS1=foo&QS1=bar

然后,VPC Lattice 将最后一个值发送给目标:

"QS1": "bar"

注销 Lambda 函数

如果您不再需要向您的 Lambda 函数发送流量,则可以将其取消注册。在取消注册 Lambda 函数后,进行中的请求会失败,并显示 HTTP 5XX 错误。

要替换 Lambda 函数,建议您创建新的目标组,向新目标组注册新函数,并将侦听器规则更新为使用新目标组而不是现有目标组。

要使用新控制台取消注销 Lambda 函数
  1. 通过 https://console.aws.amazon.com/vpc/ 打开 Amazon VPC 控制台。

  2. 在导航窗格中的 VPC Lattice 下,选择目标组

  3. 选择目标组的名称以打开其详细信息页面。

  4. Targets (目标) 选项卡上,选择 Deregister (取消注册)

  5. 当系统提示确认时,输入 confirm,然后选择取消注册

要取消注册 Lambda 函数,请使用 AWS CLI

使用 deregister-targets 命令。