

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

# Lambda 函数作为 VPC Lattice 中的目标
<a name="lambda-functions"></a>

您可以将 Lambda 函数注册为 VPC Lattice 目标组的目标，并配置侦听器规则，将请求转发到 Lambda 函数的目标组。当服务将请求转发到以 Lambda 函数为目标的目标组时，则会调用 Lambda 函数，并以 JSON 格式将请求内容传递给 Lambda 函数。

**限制**
+ Lambda 函数和目标组必须位于同一账户中，且位于同一区域中。
+ 您可以发送到 Lambda 函数的请求正文最大大小为 6MB。
+ Lambda 函数可以发送的响应 JSON 最大大小为 6MB。
+ 协议必须是 HTTP 或 HTTPS。

## 准备 Lambda 函数
<a name="prepare-lambda-function"></a>

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

**调用 Lambda 函数的权限**  
当您创建目标组并使用 AWS 管理控制台 或注册 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 函数版本](https://docs.aws.amazon.com/lambda/latest/dg/configuration-versions.html)和[为 Lambda 函数创建别名](https://docs.aws.amazon.com/lambda/latest/dg/configuration-aliases.html)。AWS Lambda *

## 为 Lambda 函数创建目标组
<a name="register-lambda-function"></a>

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

**要使用控制台创建目标组并注册 Lambda 函数**

1. 打开位于 [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/) 的 Amazon VPC 控制台。

1. 在导航窗格中的 **VPC Lattice** 下，选择**目标组**。

1. 选择**创建目标组**。

1. 对于**选择目标类型**，选择 **Lambda 函数**。

1. 对于**目标组名称**，输入目标组的名称。

1. 对于 **Lambda 事件结构版本**，请选择一个版本。有关更多信息，请参阅 [从 VPC Lattice 服务接收事件](#receive-event-from-service)。

1. （可选）要添加标签，请展开**标签**，选择**添加新标签**，然后输入标签键和标签值。

1. 选择**下一步**。

1. 对于 **Lambda function (Lambda 函数)**，请执行下列操作之一：
   + 选择现有 Lambda 函数。
   + 创建新的 Lambda 函数并选中。
   + 稍后注册 Lambda 函数。

1. 选择**创建目标组**。

**要创建目标组并使用注册 Lambda 函数 AWS CLI**  
使用[create-target-group](https://docs.aws.amazon.com/cli/latest/reference/vpc-lattice/create-target-group.html)和[注册目标命令](https://docs.aws.amazon.com/cli/latest/reference/vpc-lattice/register-targets.html)。

## 从 VPC Lattice 服务接收事件
<a name="receive-event-from-service"></a>

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 函数接收的事件结构的版本。可能的版本是 `V1` 和 `V2`。<a name="event-structure-v2"></a>

**Example 示例事件：V2**  

```
{
    "version": "2.0",
    "path": "/?query1=value1&query2=value2",
    "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 时才会出现。
+ `type`— `AWS_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`  
时间（微秒）。<a name="event-structure-v1"></a>

**Example 示例事件：V1**  

```
{
    "raw_path": "/path/to/resource?query1=value1&query2=value2",
    "method": "GET|POST|HEAD|...",
    "headers": {"header-key": "header-value", ... },
    "query_string_parameters": {"key": "value", ...},
    "body": "request-body",
    "is_base64_encoded": true|false
}
```

## 响应 VPC Lattice 服务
<a name="respond-to-service"></a>

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

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

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

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

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

## 多值标头
<a name="multi-value-headers"></a>

VPC Lattice 支持来自客户端的请求或来自包含多个值的标头或多次包含相同标头的 Lambda 函数的响应。VPC Lattice 将所有值传递给目标。

在以下示例中，有两个标头header1以不同的值命名。

```
header1 = value1
header1 = value2
```

在 V2 事件结构中，VPC Lattice 以列表形式发送值。例如：

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

VPC Lattice 采用 V1 事件结构，将这些值组合成一个字符串。例如：

```
"header1": "value1, value2"
```

## 多值查询字符串参数
<a name="multi-value-string-parameters"></a>

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

在以下示例中，有两个QS1以不同值命名的参数。

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

在 V2 事件结构中，VPC Lattice 以列表形式发送值。例如：

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

在 V1 事件结构中，VPC Lattice 使用最后一次传递的值。例如：

```
"QS1": "value2"
```

## 注销 Lambda 函数
<a name="deregister-lambda-function"></a>

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

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

**要使用新控制台取消注销 Lambda 函数**

1. 打开位于 [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/) 的 Amazon VPC 控制台。

1. 在导航窗格中的 **VPC Lattice** 下，选择**目标组**。

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

1. 在 **Targets (目标)** 选项卡上，选择 **Deregister (取消注册)**。

1. 当系统提示确认时，输入 **confirm**，然后选择**取消注册**。

**要取消注册 Lambda 函数，请使用 AWS CLI**  
使用 [deregister-targets](https://docs.aws.amazon.com/cli/latest/reference/vpc-lattice/deregister-targets.html) 命令。