

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

# 在 API Gateway 中設定 Lambda 代理整合與承載回應串流
<a name="response-transfer-mode-lambda"></a>

您可以串流 Lambda 函數的回應，以改善達到第一個位元組的時間 (TTFB) 效能，並在用戶端可用時將部分回應傳回給用戶端。API Gateway 要求您使用 [InvokeWithResponseStream](https://docs.aws.amazon.com/lambda/latest/api/API_InvokeWithResponseStream.html) Lambda API 來叫用 Lambda 函數。API Gateway 會將事件物件傳遞至 Lambda 函數。後端 Lambda 函數會剖析傳入請求資料，以判斷其所傳回的回應。為了讓 API Gateway 串流 Lambda 輸出，Lambda 函數必須輸出 API Gateway 所需的[格式](#response-transfer-mode-lambda-format)。

## 串流和緩衝回應傳輸模式之間 Lambda 代理整合的差異
<a name="response-transfer-mode-lambda-comparison"></a>

下列清單說明 Lambda 代理整合與回應串流的 Lambda 代理整合之間的差異：
+ API Gateway 使用 [InvokeWithResponseStream](https://docs.aws.amazon.com/lambda/latest/api/API_InvokeWithResponseStream.html) API 來叫用 Lambda 代理整合以進行回應串流。這會產生不同的 URI，如下所示：

  ```
  arn:aws:apigateway:us-west-1:lambda:path/2021-11-15/functions/arn:aws:lambda:us-west-1:111122223333:function:my-function-name/response-streaming-invocations
  ```

  相較於 Lambda 代理整合，此 ARN 使用不同的 API 版本日期和服務動作。

  如果您使用 API Gateway 主控台進行回應串流，主控台會為您使用正確的 URI。
+ 在 Lambda 代理整合中，API Gateway 只會在收到 Lambda 的完整回應後將回應傳送至用戶端。在回應串流的 Lambda 代理整合中，API Gateway 會在從 Lambda 收到有效的中繼資料和分隔符號後開始承載串流。
+ 回應串流的 Lambda 代理整合使用與代理整合相同的輸入格式，但需要不同的輸出格式。

## 用於回應串流的 Lambda 代理整合格式
<a name="response-transfer-mode-lambda-format"></a>

當 API Gateway 使用回應串流叫用 Lambda 函數時，輸入格式與 Lambda 函數的輸入格式相同，以進行代理整合。如需詳細資訊，請參閱[代理整合之 Lambda 函數的輸入格式](set-up-lambda-proxy-integrations.md#api-gateway-simple-proxy-for-lambda-input-format)。

當 Lambda 將回應串流至 API Gateway 時，回應必須遵循下列格式。此格式使用分隔符號來分隔中繼資料 JSON 和原始承載。在此情況下，承載資料會在串流 Lambda 函數傳輸時串流：

```
{
  "headers": {"headerName": "headerValue", ...},
  "multiValueHeaders": { "headerName": ["headerValue", "headerValue2", ...], ... },
  "cookies" : ["cookie1", "cookie2"],
  "statusCode": httpStatusCode
}<DELIMITER>PAYLOAD1 | PAYLOAD2 | PAYLOAD3
```

在輸出中：
+ 如果沒有傳回額外的回應標頭`headers``multiValueHeaders`，則無法指定 、`cookies`、 和 `statusCode`金鑰。
+ `headers` 鍵只能包含單一值標頭。
+ 輸出預期標頭包含 `Transfer-Encoding: chunked`或 `Content-length: number`。如果您的函數未傳回其中一個標頭，API Gateway 會附加`Transfer-Encoding: chunked`到回應標頭。
+ `multiValueHeaders` 鍵可以包含多值標頭以及單一值標頭。您可以使用 `multiValueHeaders` 鍵來指定所有額外標頭，包括任何單一值標頭。
+ 如果您同時指定 `headers` 和 `multiValueHeaders` 的值，API Gateway 會將它們合併成一個清單。如果在兩者指定了相同的鍵值對，則只有 `multiValueHeaders` 中的值會出現在合併清單。
+ 中繼資料必須是有效的 JSON。僅支援 `headers`、 `multiValueHeaders``cookies`和 `statusCode`金鑰。
+ 您必須在中繼資料 JSON 之後提供分隔符號。分隔符號必須是 8 個 null 位元組，且必須出現在串流資料的前 16KB 內。
+ API Gateway 不需要方法回應承載的特定格式。

如果您使用函數 URL 串流 Lambda 函數，則必須修改 Lambda 函數的輸入和輸出，以滿足這些要求。

如果您的 Lambda 函數輸出不符合此格式的要求，API Gateway 可能仍會叫用您的 Lambda 函數。下表顯示 API Gateway 支援的 API 整合請求設定和 Lambda 函數程式碼的組合。這包括緩衝的回應傳輸模式支援的組合。


| 回應傳輸模式 | 函數程式碼遵循所需的格式 | Lambda 叫用 API | API Gateway 支援 | 
| --- | --- | --- | --- | 
|  串流  |  是  |   [InvokeWithResponseStream](https://docs.aws.amazon.com/lambda/latest/api/API_InvokeWithResponseStream.html)  |  是。API Gateway 會串流您的回應。  | 
|  串流  |  否  |   [InvokeWithResponseStream](https://docs.aws.amazon.com/lambda/latest/api/API_InvokeWithResponseStream.html)  |  否。API Gateway 會叫用您的 Lambda 函數並傳回 500 錯誤回應。  | 
|  串流  |  是  |   [Invoke](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html)  |  否。API Gateway 不支援此整合組態。  | 
|  串流  |  否  |   [Invoke](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html)  |  否。API Gateway 不支援此整合組態。  | 
|  緩衝  |  是  |   [InvokeWithResponseStream](https://docs.aws.amazon.com/lambda/latest/api/API_InvokeWithResponseStream.html)  |  否。API Gateway 不支援此整合組態。  | 
|  緩衝  |  否  |   [InvokeWithResponseStream](https://docs.aws.amazon.com/lambda/latest/api/API_InvokeWithResponseStream.html)  |  否。API Gateway 不支援此整合組態。  | 
|  緩衝  |  是  |   [Invoke](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html)  |  API Gateway 會傳回 HTTP 標頭和狀態碼，但不會傳回回應內文。  | 
|  緩衝  |  否  |   [Invoke](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html)  |  是。這是 Lambda 代理整合。如需詳細資訊，請參閱 [Lambda 代理整合](set-up-lambda-proxy-integrations.md)。  | 