

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# Lambda 函數作為 VPC Lattice 中的目標
<a name="lambda-functions"></a>

您可以使用 VPC Lattice 目標群組將 Lambda 函數註冊為目標，並設定接聽程式規則，將請求轉送至 Lambda 函數的目標群組。當服務將請求轉送至具有 Lambda 函數做為目標的目標群組時，它會叫用您的 Lambda 函數，並以 JSON 格式將請求的內容傳遞給 Lambda 函數。

**限制**
+ Lambda 函數和目標群組必須在相同的帳戶中，且在相同的區域內。
+ 您可以傳送到 Lambda 函數的請求內文大小上限為 6 MB。
+ Lambda 函數可傳送的回應 JSON 大小上限為 6 MB。
+ 通訊協定必須是 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 中。如需詳細資訊，請參閱《 *AWS Lambda 開發人員指南*》中的 [Lambda 函數版本](https://docs.aws.amazon.com/lambda/latest/dg/configuration-versions.html)和[建立 Lambda 函數的別名](https://docs.aws.amazon.com/lambda/latest/dg/configuration-aliases.html)。

## 為 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. 選擇 **Create target group (建立目標群組)**。

1. 在**選取目標類型**中，選取 **Lambda 函數**。

1. 針對 **Target group name** (目標群組名稱)，輸入目標群組的名稱。

1. 針對 **Lambda 事件結構版本**，選擇版本。如需詳細資訊，請參閱[從 VPC Lattice 服務接收事件](#receive-event-from-service)。

1. （選用） 若要新增標籤，請展開**標籤**，選擇**新增標籤**，然後輸入標籤索引鍵和標籤值。

1. 選擇**下一步**。

1. 對於 **Lambda function (Lambda 函數)**，請執行以下其中一項：
   + 選取現有的 Lambda 函數。
   + 建立新的 Lambda 函數並選取它。
   + 稍後註冊 Lambda 函數。

1. 選擇 **Create target group (建立目標群組)**。

**使用 建立目標群組並註冊 Lambda 函數 AWS CLI**  
使用 [create-target-group](https://docs.aws.amazon.com/cli/latest/reference/vpc-lattice/create-target-group.html) 和 [register-targets](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 身分驗證成功`AWS_IAM`，則值為 。
如果使用 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"]
```

使用 V1 事件結構時，VPC Lattice 會將值合併為單一字串。例如：

```
"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) 命令。