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 CLIVPC 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 中包含该别名。有关更多信息,请参阅AWS 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 命令。