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

2 分的閱讀內容
0

儘管我尚未部署任何程式碼變更,但 AWS Lambda 函數仍會間歇性逾時。

解決方法

Lambda 函數可能會因為多種原因而逾時。若要對 Lambda 功能逾時問題進行疑難排解,請先確定造成問題的原因。然後,根據您的使用情況解決問題。

確認您的 Lambda 函數是否逾時

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

如需說明,請參閱如何確定我的 Lambda 函數是否逾時?

確定導致 Lambda 函數逾時的原因

使用以下一種或多種方法來找出導致函數逾時的失敗點:

檢查 Lambda 的 CloudWatch Logs

您可以使用 Amazon CloudWatch,來檢視函數程式碼產生的所有日誌並識別潛在問題。如需說明,請參閱將 CloudWatch Logs 與 Lambda 結合使用

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

重要: Lambda 會自動為每次調用產生三行日誌 (STARTENDREPORT)。如果符合以下任一情況,這三行將是唯一出現在函數的 CloudWatch 日誌中的內容:

  • Lambda 函數的自訂程式碼中沒有設定其他顯式日誌記錄。
  • 在 Lambda 可以值型輸出日誌的函數程式碼之前,已經達到了函數的持續時間限制。

如果您無法從 CloudWatch 日誌中確定導致逾時的原因,請嘗試以下一個或多個解決方案:

  • 確認您使用的 AWS SDK 上的重試次數和逾時設定是否有足夠的時間來初始化您的函數。
  • 暫時增加 Lambda 函數的逾時設定,以便函數程式碼有足夠的時間產生日誌資料。
  • 增加函數設定的記憶體,以幫助減少調用持續時間的延遲並提高計算能力。

若要在您的函數程式碼中新增更多日誌記錄輸出,請參閱您使用的 Lambda 執行時期版本的以下文件:

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

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

如需詳細資訊,請參閱使用 AWS X-Ray 視覺化 Lambda 函數調用

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

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

**注意:**使用 Lambda Insights 會向您的 AWS 帳戶收取費用。您需要按照 Lambda 延伸所消耗的調用時間,以 1 毫秒為增量收費。

使用 VPC 流程日誌來判斷特定調用請求遭拒或未路由的原因

VPC 流程日誌可讓您查看流向和流出 Amazon Virtual Private Cloud (Amazon VPC) 的所有網路流量。

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

注意: 如果您選擇設定 VPC 流程日誌,則會套用以下變數:

使用 HTTP 線路追蹤詳細日誌記錄函數程式碼在調用期間產生的網路請求

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

防止 Lambda 函數逾時的最佳做法

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

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

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

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

當您初始化 Lambda 函數時,Lambda 會分配最多 10 秒的時間來完成調用的 Init 階段。由於這個時間限制,最佳做法是在初始化程式碼中的函數處理程序之外執行以下操作:

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

此靜態初始化允許每個沙盒對這些資源進行一次初始化,然後重複用於同一執行時期環境中的所有未來調用。

如需詳細資訊,請參閱最佳化靜態初始化

**注意:**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 函數使用的所有背景程序在函數處理常式傳回字串之前完成

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

確認您的 Lambda 函數是否設定為在任何整合式 AWS 服務的最大逾時設定範圍內運作

儘管 Lambda 函數的最大呼叫逾時限制為 15 分鐘,但其他 AWS 服務可能有不同的逾時限制。

例如,Amazon API Gateway 最多等待 29 秒才能完成 Lambda 函數 Proxy 調用。

如需更多資訊,請參閱如何解決在整合 API Gateway 與 Lambda 函數時收到的錯誤? 此外,請參閱使用來自其他 AWS 服務的事件呼叫 Lambda

確認您的函數嘗試連接的端點是否有有效的網路路徑

若要檢閱您的網路設定,請參閱如何對 Amazon VPC 中 Lambda 函數的逾時問題進行疑難排解?

AWS 官方
AWS 官方已更新 2 個月前