AWS Lambda 中錯誤處理和自動重試 - AWS Lambda

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

AWS Lambda 中錯誤處理和自動重試

當您叫用函式時,可能發生兩種錯誤。當叫用請求在您的函示收到前遭到拒絕時,就會發生叫用錯誤。當您函式的程式碼或執行時間傳回錯誤時,就會發生函式錯誤。根據類型錯誤、叫用類型,以及叫用函式的用戶端或服務,重試行為和用於管理錯誤的策略會有所不同。

請求、呼叫端或帳戶相關問題,可能會導致叫用錯誤。叫用錯誤包含回應中表示造成錯誤的錯誤類型和狀態碼。

常見的叫用錯誤
  • Request (請求) - 請求事件太大或不是有效的 JSON;函數不存在;參數值是錯誤類型。

  • Caller (呼叫者) - 沒有叫用函數許可的使用者或服務。

  • Account (帳戶) - 最大數量的函數執行個體已在執行中,或太快進行請求。

用戶端 (例如 AWS CLI 和 AWS SDK) 會在用戶端逾時、調節錯誤 (429),以及其他並非由錯誤請求造成的錯誤時重試。如需叫用錯誤的完整清單,請參閱叫用

當您的函式程式碼或其使用的執行時間傳回錯誤時,就會發生函式錯誤。

常見的函數錯誤
  • Function (函數) - 函數的程式碼會擲回例外狀況或傳回錯誤物件。

  • Runtime (執行時間) - 因為時間不夠、偵測到語法錯誤,或無法將回應物件封送到 JSON 中,而終止您函數的執行時間。函式因為錯誤碼而結束。

與叫用錯誤不同,函數錯誤不會導致 Lambda 傳回 400 系列或 500 系列狀態碼。如果函數傳回錯誤,則 Lambda 會包含名為 X-Amz-Function-Error 的標頭,以及含有錯誤訊息和其他詳細資訊的 JSON 格式回應。如需每種語言的函式錯誤範例,請參閱下列主題。

直接叫用函數時,您可以決定處理函數程式碼相關錯誤的策略。Lambda 不會自動代您重試這類錯誤。若要進行重試,您可以手動重新叫用函數、將失敗的事件傳送到佇列進行偵錯,或忽略錯誤。您函式的程式碼可能已完全執行、部分執行或完全未執行。如果您重試,請確保您函式的程式碼可處理相同的事件很多次,而不會導致重複的交易或其他不想要的副作用。

當您間接叫用函式時,您需要留意叫用端的重試行為及任何遭遇請求的服務。這包括以下案例。

  • Asynchronous invocation (非同步叫用) - Lambda 會重試函數錯誤兩次。如果函式沒有足夠的容量來處理所有傳入的請求,事件可能在佇列中等待數小時或數天才會傳送到函式。您可以在函式上設定無效信件佇列,以擷取未成功處理的事件。如需詳細資訊,請參閱 非同步調用

  • Event source mappings (事件來源映射) - 從串流中讀取的事件來源映射會重試整批項目。在錯誤解決或項目過期前,重複的錯誤會阻礙受影響碎片的處理。若要偵測已停滯的碎片,您可以監控反覆運算器年齡指標。

    對於從佇列讀取的事件來源映射,您可藉由設定來源佇列的可見性逾時和再驅動政策,決定重試之間的時間長度和失敗事件的目的地。如需詳細資訊,請參閱 Lambda 事件來源映射AWS Lambda 搭配其他服務使用 下的服務特定主題。

  • AWS services (AWS 服務) - AWS 服務會以同步或非同步方式叫用您的函數。對於同步叫用,服務會決定是否要重試。例如,如果 Lambda 函數傳回 TemporaryFailure 回應代碼,則 Amazon S3 批次操作會重試該操作。代理來自上游使用者或用戶端之請求的服務可能有重試策略,或可能會將錯誤回應轉送回請求者。例如,API Gateway 一律會將錯誤回應轉送回請求者。

    對於非同步叫用,行為與您以同步方式叫用函式時相同。如需詳細資訊,請參閱 AWS Lambda 搭配其他服務使用 之下的服務特定主題和叫用服務的文件。

  • Other accounts and clients (其他帳戶和用戶端) - 當您授與其他帳戶的存取權時,您可使用以資源為基礎的政策來限制其可設定的服務或資源,以叫用您的函數。為了保護您的函數以免過載,請考慮透過 Amazon API Gateway 在您的函數前面放置 API 層。

為了協助您處理 Lambda 應用程式中的錯誤,Lambda 會與 Amazon CloudWatch 和AWS X-Ray. 您可以使用日誌、指標、警示和追蹤的組合,快速偵測及識別您的函式程式碼、API 或其他支援您應用程式的資源中的問題。如需詳細資訊,請參閱 監控與疑難排解 Lambda 函數

如需使用 CloudWatch 記錄訂閱、X-Ray 追蹤和 Lambda 函數偵測和處理錯誤的範例應用程式,請參閱適用於 AWS Lambda 的錯誤處理器範例應用程式