Lambda在莱迪思中用作目标 VPC - Amazon VPC Lattice

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

Lambda在莱迪思中用作目标 VPC

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

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

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

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

  • 协议必须是HTTP或HTTPS。

准备 Lambda 函数

如果您将Lambda函数与VPC莱迪思服务一起使用,则以下建议适用。

调用 Lambda 函数的权限

当您创建目标组并使用 AWS Management Console 或注册 Lambda 函数时 AWS CLI,VPC莱迪思会代表您向您的 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莱迪思服务始终调用当前版本的 Lambda 函数,ARN请在向莱迪思服务注册 Lambda 函数时创建一个函数别名并在函数中包含该别名。VPC有关更多信息,请参阅开发人员指南中的 Lambda 函数版本为 Lambda 函数创建别名。AWS Lambda

为 Lambda 函数创建目标组

创建一个要在请求路由中使用的目标组。如果请求内容与带有将其转发给该目标组的操作的侦听器规则相匹配,则VPC莱迪思服务将调用已注册的 Lambda 函数。

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

  2. 在导航窗格上的 VPCLattice 下,选择目标群组

  3. 选择创建目标组

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

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

  6. 对于 Lambda 事件结构版本,请选择一个版本。有关更多信息,请参阅 接收来自VPC莱迪思服务的事件

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

  8. 选择下一步

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

    • 选择现有 Lambda 函数。

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

    • 稍后注册 Lambda 函数。

  10. 选择创建目标组

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

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

接收来自VPC莱迪思服务的事件

VPC莱迪思服务支持通过和对请求进行 Lambda 调用。HTTP HTTPS该服务以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

请求的正文。仅当协议为HTTPHTTPS、或 g 时才存在RPC。

headers

请求的HTTP标头。仅当协议为HTTPHTTPS、或 g 时才存在RPC。

identity

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

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

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

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

  • sourceVpcArn— 请求ARN的VPC起源地。只有在VPC可以识别来源时才会出现。

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

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

  • x509IssuerOu:发布者(OU)。

  • x509SanDns— 主题备用名称 (DNS)。

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

  • x509SanUri— 主题备用名称 (URI)。

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

isBase64Encoded

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

method

请求HTTP的方法。仅当协议为HTTPHTTPS、或 g 时才存在RPC。

path

请求的路径。仅当协议为HTTPHTTPS、或 g 时才存在RPC。

queryStringParameters

HTTP查询字符串参数。仅当协议为HTTPHTTPS、或 g 时才存在RPC。

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莱迪思服务

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

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

VPC莱迪思服务不支持标 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莱迪思支持来自客户端的请求或来自包含多个值的标头或多次包含相同标头的Lambda函数的响应。 VPC莱迪思将所有值传递给目标。

在以下示例中,有两个标头名为 header1 具有不同的值。

header1 = value1 header1 = value2

使用V2事件结构,VPC莱迪思以列表形式发送值。例如:

"header1": ["value1", "value2"]

VPC莱迪思采用V1事件结构,将这些值组合成一个字符串。例如:

"header1": "value1, value2"

多值查询字符串参数

VPC莱迪思支持同一密钥具有多个值的查询参数。

在以下示例中,有两个名为的参数 QS1 具有不同的值。

http://www.example.com?&QS1=value1&QS1=value2

使用V2事件结构,VPC莱迪思以列表形式发送值。例如:

"QS1": ["value1", "value2"]

在V1事件结构中,VPC莱迪思使用最后一次传递的值。例如:

"QS1": "value2"

注销 Lambda 函数

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

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

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

  2. 在导航窗格上的 VPCLattice 下,选择目标群组

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

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

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

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

使用 deregister-targets 命令。