如何對 Lambda 函數叫用逾時錯誤進行疑難排解?

2 分的閱讀內容
0

我的 AWS Lambda 函數間歇性地逾時,即使沒有部署任何程式碼變更。如何疑難排解並預防 Lambda 函數叫用逾時問題?

解決方案

由於各種原因,Lambda 函數可能會逾時。若要對 Lambda 函數逾時進行疑難排解,請首先使用本文中列出的其中一個 AWS 服務和功能來判定導致問題的原因。然後,根據您的使用案例矯正問題。

若要協助防止您的 Lambda 函數逾時,請參閲本文的防止 Lambda 函數逾時的最佳實務一節。

驗證您的 Lambda 函數是否逾時

在函數的 Amazon CloudWatch 日誌群組中搜尋片語 Task timed out (任務已逾時),來擷取任何逾時叫用的請求 ID。然後,使用關聯逾時叫用的請求 ID 來擷取每個叫用逾時的完整日誌。

如需指示,請參閱我如何判定我的 Lambda 函數是否逾時?

識別導致 Lambda 函數逾時的原因

使用下列一種或多種方法來識別導致函數逾時的故障點:

檢閱 CloudWatch Logs 中的 Lambda 項目

您可以使用 Amazon CloudWatch,檢視函數程式碼產生的所有日誌並識別潛在問題。如需指示,請參閱存取 CloudWatch Logs 中的 Lambda 項目

如果您的函數傳回堆疊追蹤,則堆疊追蹤中的錯誤訊息指定導致錯誤的原因。

重要:Lambda 會針對每個叫用自動產成三個日誌行 (STARTENDREPORT)。如果滿足以下任一條件,則這三行是函數 CloudWatch 日誌中唯一出現的行:

  • Lambda 函數的自訂程式碼中沒有設定任何其他明確的記錄。
  • 在 Lambda 可以執行輸出日誌的函數程式碼之前,已達到函數的持續時間限制。

如果在檢閱日誌之後無法判定導致逾時的原因,請嘗試執行以下一個或多個解決方案:

若要將更多記錄輸出新增到函數的程式碼,請參閲您正在使用之 Lambda 執行時間的下列文件:

使用 AWS X-Ray 識別任何程式碼效能瓶頸

如果您的 Lambda 函數使用下游 AWS 資源、微型服務、資料庫或 HTTP Web API,則可以使用 AWS X-Ray,協助對程式碼效能問題進行疑難排解。

如需詳細資訊,請參閲搭配使用 AWS Lambda 與 AWS X-Ray

使用 Lambda Insights 為您的函數收集系統層級指標

Lambda Insights 會收集系統層級指標,包括 CPU 時間、記憶體、磁碟和網路指標。它還會收集診斷資訊,包括冷啟動和 Lambda 工作者關閉,以協助您隔離 Lambda 函數的問題。

如需詳細資訊,請參閲使用 Lambda Insights

**注意:**使用 Lambda Insights 會對您的 AWS 帳户產生費用。按 Lambda 擴展所使用的叫用時間向您收費,增量單位為 1 毫秒。

使用 VPC Flow Logs 來判定特定叫用請求遭拒或未路由的原因

VPC Flow Logs 允許您查看流入和流出 Amazon Virtual Private Cloud (Amazon VPC) 的所有網路流量。

如需詳細資訊,請參閲對 Lambda 中的聯網問題進行疑難排解

**注意:**如果您選擇設定 VPC Flow Logs,請記住以下事項:

  • 當您將流程日誌發佈到下列任一項時,會收取自動售貨日誌的資料擷取和封存費用:
  • CloudWatch Logs
  • Amazon Simple Storage Service (Amazon S3)

使用 HTTP 線路追蹤,以詳細記錄函數程式碼在叫用期間所產生的網路請求

如需詳細資訊,請參閲記錄 HTTP 線路追蹤

防止 Lambda 函數逾時的最佳實務

確保您的 Lambda 函數具有等冪性

由於暫時性的網路問題,API 呼叫可能需要比預期更長的時間。網路問題也可能導致重試和重複的 API 請求。若要為這些出現的情況做好準備,請確保您的 Lambda 函數具有等冪性。

如需詳細資訊,請參閲如何使我的 Lambda 函數具有等冪性?

在函數處理常式之外初始化函數的靜態邏輯

當您初始化 Lambda 函數時,Lambda 會分配最多 10 秒,讓叫用的初始階段完成。由於這個時間限制,最佳實務是在初始化程式碼中的函數處理常式之外執行以下動作:

  • 匯入程式庫和相依關係
  • 設定初始組態
  • 初始化與其他下游服務和資源的連線

這種靜態初始化允許對每個沙盒初始化這些資源一次,然後在相同的執行階段環境中對所有未來的叫用重複使用這些資源。

如需詳細資訊,請參閲最佳化靜態初始化。亦請參閱《Lambda 操作員指南》中的下游不可用性和《Lambda 開發人員指南》中的函數程式碼

**注意:**Lambda 會移除與下游資源的閒置連線。若要允許您的函數持續連線,請使用與您正在使用的 Lambda 執行時間相關聯的 tcp_keepalive 變數。

驗證您正在使用的 AWS SDK 上的重試計數和逾時設定是否允許您的函數有足夠的時間進行初始化

如果您使用 AWS SDK 進行 API 呼叫,但呼叫失敗,則 AWS SDK 會自動重試呼叫。AWS SDK 重試次數以及時間長短是由每個 AWS SDK 各自不同的設定決定。您函數需要的初始化時間可能超過預設 AWS SDK 設定所允許的。

如需詳細資訊,請參閱在使用 AWS SDK 叫用 Lambda 函數時,如何對重試和逾時問題進行疑難排解?

(選用) 為您的 Lambda 函數設定佈建的並行

佈建的並行會初始化所請求數量的執行階段環境,以便它們準備好立即回應您函數的叫用。若要為您的函數設定佈建的並行,請遵循設定佈建的並行中的指示進行。

**注意:**設定佈建的並行會對您的 AWS 帳户產生費用。您可以在函數的版本或在 Lambda 函數別名上設定佈建的並行。

驗證您的 Lambda 函數是否有足夠的系統資源

分配給 Lambda 函數叫用的網路頻寬和 CPU 數量是由函數的記憶體組態決定。

如需詳細資訊,請參閲《Lambda 操作員指南》中的記憶體和運算能力

在函數處理常式傳回字串之前,請確保 Lambda 函數使用的任何背景程序完成

如需詳細資訊,請參閲了解 AWS Lambda 中的容器重複使用

驗證您的 Lambda 函數是否設定為在任何整合的 AWS 服務的最大逾時設定內運作

即使 Lambda 函數的最大叫用逾時限制為 15 分鐘,其他 AWS 服務仍可能有不同的逾時限制。

例如,對於完成 Lambda 函數代理叫用,Amazon API Gateway 最多等待 29 秒。如需詳細資訊,請參閱如何解決在整合 API Gateway 與 Lambda 函數時收到的錯誤? 亦請參閱搭配使用 AWS Lambda 與其他服務

確認有一個有效的網路路徑,通往您函數試圖到達的端點

若要查看您的網路設定,請遵循如何對在 Amazon VPC 中的 Lambda 函數的逾時問題進行疑難排解?中的指示進行


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