如何解決在整合 API Gateway 與 Lambda 函數時收到的錯誤?

3 分的閱讀內容
0

我想要解決在整合 Amazon API Gateway 與 AWS Lambda 函數時收到的錯誤。

解決方法

開啟 API 和階段的記錄功能

1.    在 API Gateway 主控台中,找到 API 的階段編輯器

2.    在階段編輯器窗格中,選擇 Logs/Tracing(日誌/追蹤)索引標籤。

3.    在日誌/追蹤索引標籤上,針對 CloudWatch 設定執行下列動作以開啟記錄功能:
選擇 Enable CloudWatch Logs(啟用 CloudWatch 日誌)核取方塊。
日誌層級,選擇 INFO(資訊)以產生所有請求的日誌。或者,選擇 ERROR(錯誤),僅針對造成 API 錯誤的請求產生日誌。
若為 REST API,請選擇 Log full requests/responses data(記錄完整請求/回應資料)核取方塊。或者,如果是 WebSocket API,請選擇 Log full message data(記錄完整訊息資料)核取方塊。

4.    在自訂存取記錄功能下,執行下列動作以開啟存取記錄功能:
選擇 Enable Access Logging(啟用存取記錄功能)核取方塊。
對於存取日誌目的地 ARN,輸入 CloudWatch 日誌群組Amazon Kinesis Data Firehose 串流的 Amazon Resource Name (ARN)。
輸入日誌格式。如需指引,請選擇 CLFJSONXMLCSV 來查看該格式的範例。

5.    選擇 Save Changes(儲存變更)。
**注意:**主控台不會確認設定已儲存。

如需詳細資訊,請參閱使用 API Gateway 主控台設定 CloudWatch API 記錄功能

判斷整合類型、確認錯誤並採取後續步驟

1.    判斷 API Gateway 中是否已設定 Lambda 代理整合或 Lambda 自訂整合。您可以檢閱 Lambda 函數輸出或執行 get-integration 命令來確認整合類型。

2.    確認 API Gateway 中的錯誤對應至 Lambda 中的錯誤。執行下列 CloudWatch Logs Insights 查詢,以尋找指定時間範圍內的錯誤狀態碼:

parse @message '(*) *' as reqId, message
    | filter message like /Method completed with status: \d\d\d/
    | parse message 'Method completed with status: *' as status
    | filter status != 200
    | sort @timestamp asc
    | limit 50

然後,執行下列 CloudWatch Logs Insights 查詢,以在相同的時間範圍內搜尋 Lambda 錯誤日誌:

fields @timestamp, @message
    | filter @message like /(?i)(Exception|error|fail)/
    | sort @timestamp desc
    | limit 20

3.    根據您在日誌中識別的錯誤類型,選擇下列其中一項:

如果您收到下列錯誤,請完成解決並行問題一節中的步驟。

(XXXXX) Lambda invocation failed with status: 429. Lambda request id: XXXXXXXXXX
(XXXXX) Execution failed due to configuration error: Rate Exceeded.
(XXXXX) Method completed with status: 500

如果您收到下列任一錯誤,請完成解決逾時問題一節中的步驟。

若為 Lambda 自訂整合:

< 29 sec:
(XXXXX) Method response body after transformations: {"errorMessage":"2019-08-14T02:45:14.133Z xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx Task timed out after xx.01 seconds"}
> 29 sec:
(XXXXX) Execution failed due to a timeout error

若為 Lambda 代理整合:

< 29 sec:
(XXXXX) Endpoint response body before transformations: {"errorMessage":"2019-08-14T02:50:25.865Z xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx Task timed out after xx.01 seconds"}
> 29 sec:
(XXXXX) Execution failed due to a timeout error

如果您收到下列錯誤,請完成解決函數錯誤一節中的步驟。

(XXXXX) Execution failed due to configuration error: Malformed Lambda proxy response
(XXXXX) Method response body after transformations: {"errorMessage": "Syntax error in module 'lambda_function'"}

解決並行問題

當其他請求從 API Gateway 傳入的速度超過 Lambda 函數可擴展的速度時,您會收到 429 限流錯誤或 500 錯誤。

若要解決這些錯誤,請分析 CloudWatch 中的計數 (API Gateway)、限流 (Lambda) 和 ConcurrentExecutions (Lambda) 指標。請考慮以下事項:

  • 計數 (API Gateway) 是指定期間內的 API 請求總數。
  • 限流 (Lambda) 是受限流的調用請求數量。當所有函數執行個體都在處理請求,且沒有可縱向擴展的並行時,Lambda 會拒絕其他請求並顯示 TooManyRequestsException 錯誤。受限流的請求和其他調用錯誤不會計為調用或錯誤。
  • ConcurrentExecutions (Lambda) 是正在處理事件的函數執行個體數量。如果此數量達到 AWS 區域的並行執行配額,便會對其他調用請求限流。當函數執行個體的數量達到您在函數上設定的保留並行上限時,也會對調用請求限流。

**注意:**如需詳細資訊,請參閱 API Gateway 指標使用 Lambda 函數指標

如果您在 Lambda 函數中設定保留並行,請為 Lambda 函數設定較高的保留並行值。或者,從 Lambda 函數中移除保留並行值。該函數隨即從未保留的並行執行集區中提取。

如果您未在 Lambda 函數中設定保留並行,請檢查 ConcurrentExecutions 指標以找出用量。如需詳細資訊,請參閱 Lambda 配額

解決逾時問題

所有 API Gateway 整合的整合逾時為 29 秒 (硬性限制)。使用 Lambda 整合建置 API Gateway API 時,可能會遇到兩種情況,也就是逾時小於 29 秒或大於 29 秒。

如果 Lambda 函數逾時小於 29 秒,請檢查您的 Lambda 日誌以調查此問題。如果您的 Lambda 函數必須在 29 秒後執行,請考慮以非同步方式調用 Lambda 函數。

若要進行 Lambda 自訂整合,請完成下列步驟:

1.    開啟 API Gateway 主控台

2.    在導覽窗格中,選擇 API,然後選擇您的 API。

3.    選擇 Resources(資源),然後選擇您的方法。

4.    選擇 Integration Request(整合請求)。

5.    選擇 Method Request(方法請求)。

6.    展開 ** HTTP 請求標頭**。

7.    選擇 Add header(新增標頭)。

8.    在名稱中,輸入您的標頭名稱。例如: X-Amz-Invocation-Type

**重要事項:**您必須從「事件」對應標頭 (需使用單引號)。

若為 Lambda 代理整合:

使用兩個 Lambda 函數:函數 A 和函數 B。API Gateway 會先同步調用函數 A。接著,函數 A 會以非同步方式調用函數 B。函數 A 可以在非同步調用函數 B 時,傳回成功回應至 API Gateway。

如果您使用的是 Lambda 代理整合,請考慮將其變更為自訂整合。但是,您必須設定對應範本以將請求/回應轉換為所需的格式。如需詳細資訊,請參閱設定後端 Lambda 函數的非同步調用

**注意:**由於非同步 Lambda 函數會在背景執行,因此您的用戶端無法直接從 Lambda 函數接收資料。您必須擁有中繼資料庫才能儲存任何持續性資料。

解決函數錯誤

如果您在調用 API 時收到函數錯誤,請檢查 Lambda 函數是否有任何語法錯誤。如果您的 Lambda 函數未傳回 API Gateway 預期進行代理整合的有效 JSON 物件,也會出現此錯誤。

若要解決此錯誤,請完成開啟 API 和階段的記錄功能一節中的步驟。


相關資訊

處理 API Gateway 中的標準 Lambda 錯誤

處理 API Gateway 中的自訂 Lambda 錯誤

AWS 官方
AWS 官方已更新 2 年前