如何解決在整合 API Gateway 與 Lambda 函數時收到的錯誤?
我想要解決在整合 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)。
輸入日誌格式。如需指引,請選擇 CLF、JSON、XML 或 CSV 來查看該格式的範例。
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 和階段的記錄功能一節中的步驟。
相關資訊
相關內容
- 已提問 2 年前lg...
- 已提問 11 天前lg...
- AWS 官方已更新 3 年前
- AWS 官方已更新 1 年前
- AWS 官方已更新 2 年前