在 API Gateway 中設定 Lambda 代理整合與承載回應串流 - Amazon API Gateway

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

在 API Gateway 中設定 Lambda 代理整合與承載回應串流

您可以串流 Lambda 函數的回應,以改善達到第一個位元組的時間 (TTFB) 效能,並在用戶端可用時將部分回應傳回給用戶端。API Gateway 要求您使用 InvokeWithResponseStream Lambda API 來叫用 Lambda 函數。API Gateway 會將事件物件傳遞至 Lambda 函數。後端 Lambda 函數會剖析傳入請求資料,以判斷其所傳回的回應。為了讓 API Gateway 串流 Lambda 輸出,Lambda 函數必須輸出 API Gateway 所需的格式

串流和緩衝回應傳輸模式之間 Lambda 代理整合的差異

以下清單說明 Lambda 代理整合與回應串流的 Lambda 代理整合之間的差異:

  • API Gateway 使用 InvokeWithResponseStream 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 代理整合格式

當 API Gateway 使用回應串流叫用 Lambda 函數時,輸入格式與 Lambda 函數的輸入格式相同,以進行代理整合。如需詳細資訊,請參閱代理整合之 Lambda 函數的輸入格式

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

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

在輸出中:

  • 如果未傳回任何額外的回應標頭multiValueHeaders,則 headerscookies、 和 statusCode金鑰無法指定。

  • headers 鍵只能包含單一值標頭。

  • 輸出預期標頭包含 Transfer-Encoding: chunkedContent-length: number。如果您的函數未傳回其中一個標頭,API Gateway 會附加Transfer-Encoding: chunked到回應標頭。

  • multiValueHeaders 鍵可以包含多值標頭以及單一值標頭。您可以使用 multiValueHeaders 鍵來指定所有額外標頭,包括任何單一值標頭。

  • 如果您同時指定 headersmultiValueHeaders 的值,API Gateway 會將它們合併成一個清單。如果在兩者指定了相同的鍵值對,則只有 multiValueHeaders 中的值會出現在合併清單。

  • 中繼資料必須是有效的 JSON。僅支援 headersmultiValueHeaderscookiesstatusCode金鑰。

  • 在中繼資料 JSON 之後,您必須提供分隔符號。分隔符號必須是 8 個 null 位元組,且必須出現在前 16KB 的串流資料中。

  • API Gateway 不需要方法回應承載的特定格式。

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

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

回應傳輸模式 函數程式碼遵循所需的格式 Lambda 叫用 API API Gateway 支援

串流

InvokeWithResponseStream

是。API Gateway 會串流您的回應。

串流

InvokeWithResponseStream

否。API Gateway 會叫用您的 Lambda 函數並傳回 500 錯誤回應。

串流

Invoke

否。API Gateway 不支援此整合組態。

串流

Invoke

否。API Gateway 不支援此整合組態。

緩衝

InvokeWithResponseStream

否。API Gateway 不支援此整合組態。

緩衝

InvokeWithResponseStream

否。API Gateway 不支援此整合組態。

緩衝

Invoke

API Gateway 會傳回 HTTP 標頭和狀態碼,但不會傳回回應內文。

緩衝

Invoke

是。這是 Lambda 代理整合。如需詳細資訊,請參閱 Lambda 代理整合