瞭解 Lambda 執行環境生命週期 - AWS Lambda

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

瞭解 Lambda 執行環境生命週期

Lambda 會在執行環境中調用您的函數,該環境可提供安全且隔離的執行時間環境。執行環境會管理執行函式所需的資源。執行環境也會提供函式執行階段的生命週期支援,以及與函式相關聯的任何外部延伸項目

函數的執行階段會使用執行階段與 Lambda 進行API通訊。擴充功能使用擴充能與 Lambda 通訊API。擴充功能也可以使用遙測功能接收記錄訊息和其他遙測API

執行環境的架構圖表。

當您建立 Lambda 函數時,您將指定組態資訊,例如您的函數允許的記憶體數量與執行時間上限。Lambda 會使用此資訊來設定執行環境。

函式的執行階段和每個外部延伸項目都是在執行環境中執行的程序。許可、資源、認證和環境變數會在函式和延伸項目之間共用。

Lambda 執行環境生命週期

Lambda 生命週期階段:初始化、叫用、關閉

每個階段都以 Lambda 傳送到執行階段和所有已註冊延伸項目的事件開始。運行時和每個擴展通過發送NextAPI請求來指示完成。當執行時間和每個延伸項目已完成且沒有擱置的事件時,Lambda 凍結執行環境。

初始化階段

Init 階段中,Lambda 會執行三項任務:

  • 啟動所有延伸項目 (Extension init)

  • Bootstrap 執行時間 (Runtime init)

  • 執行該函式的靜態代碼 (Function init)

  • 執行任何執行beforeCheckpoint階段掛鉤 ( SnapStart 僅限 Lambda)

當運行時和所有擴展通過發送NextAPI請求發送信號它們已準備就緒時,Init階段結束。Init 階段限制為 10 秒。如果所有三項任務都未在 10 秒內完成,Lambda 會在第一次函數調用時以設定的函數逾時重試 Init 階段。

Lambda SnapStart 啟動的情況下,發佈函數版本時會發生 Init 階段。Lambda 會儲存初始化執行環境的記憶體和磁碟狀態快照、保留加密的快照,並快取以進行低延遲存取。如果您有 beforeCheckpoint 執行階段掛鉤,那麼程式碼會在 Init 階段結束時執行。

注意

10 秒逾時不適用於使用佈建並行或的函數。 SnapStart對於佈建的並行 SnapStart 功能,您的初始化程式碼最多可執行 15 分鐘。時間限制為 130 秒或設定的函數逾時 (最長 900 秒),以較長者為準。

使用佈建並行時,當您設定函數的電腦設定,Lambda 會初始化執行環境。Lambda 也可確保初始化的執行環境在調用之前隨時可用。您會發現函數調用和初始化階段之間出現差距。根據函數的執行期和記憶體組態,您也會在初始化的執行環境上第一次調用時看到變數延遲。

對於使用隨需並行的函數,Lambda 偶爾會在調用請求之前初始化執行環境。發生這種情況時,您也會注意到函數初始化和調用階段之間出現時間差。建議您不要依賴此行為。

初始化階段期間出現的失敗

如果在 Init 階段期間函數當機或出現逾時,Lambda 會在 INIT_REPORT 日誌檔中發出錯誤資訊。

範例 -INIT _ 超時REPORT日誌
INIT_REPORT Init Duration: 1236.04 ms Phase: init Status: timeout
範例 -INIT _ 擴展失敗的REPORT日誌
INIT_REPORT Init Duration: 1236.04 ms Phase: init Status: error Error Type: Extension.Crash

如果Init階段成功,除非啟動,INIT_REPORT否則 Lambda 不會發出記錄SnapStart檔。 SnapStart 函數總是發出INIT_REPORT。如需詳細資訊,請參閱監控 Lambda SnapStart

還原階段 ( SnapStart 僅限 Lambda)

當您第一次叫用SnapStart函數並在函數擴展時,Lambda 會從持續快照恢復新的執行環境,而不是從頭開始初始化函數。如果您有 afterRestore() 執行階段掛鉤,程式碼會在 Restore 階段結束時執行。您需支付 afterRestore() 執行階段掛鉤期間的費用。執行階段 (JVM) 必須載入,而afterRestore()執行階段掛接必須在逾時限制 (10 秒) 內完成。否則,你會得到一個 SnapStartTimeoutException. Restore 階段完成時,Lambda 會調用函數處理常式 (調用階段)。

還原階段期間出現的失敗

如果 Restore 階段失敗,Lambda 會在 RESTORE_REPORT 日誌檔中發出錯誤資訊。

範例 -RESTORE _ 超時REPORT日誌
RESTORE_REPORT Restore Duration: 1236.04 ms Status: timeout
範例 — RESTORE _ 執行階段掛接失敗的REPORT記錄
RESTORE_REPORT Restore Duration: 1236.04 ms Status: error Error Type: Runtime.ExitError

如需RESTORE_REPORT 日誌的詳細資訊,請參閱 監控 Lambda SnapStart

調用階段

當呼叫 Lambda 函數以回應NextAPI請求時,Lambda 會將Invoke事件傳送至執行階段和每個擴充功能。

該函式的逾時設定會限制整個 Invoke 階段的持續時間。例如,如果您將函式逾時設定為 360 秒,則函式和所有延伸項目都需要在 360 秒內完成。請注意,沒有獨立的調用後階段。持續時間是所有調用時間 (執行階段 + 延伸項目) 的總和,直到函式和所有延伸項目完成執行後才會計算。

調用階段在運行時結束後,所有擴展都通過發送NextAPI請求來完成它們。

調用階段期間出現的故障

如果 Lambda 函數當機或在 Invoke 階段逾時,Lambda 會重設執行環境。下圖會說明發生調用故障時 Lambda 執行環境的行為:

執行環境範例:初始化、呼叫、以錯誤呼叫、呼叫、關閉

在前一張示意圖中:

  • 第一階段是階INIT段,它運行沒有錯誤。

  • 第二個階段是INVOKE階段,它運行沒有錯誤。

  • 假設您的函數在某個時間點發生調用故障 (例如函數逾時或執行階段錯誤)。第三個階段,標記 INVOKEWITHERROR,說明了這種情況。發生此狀況時,Lambda 服務會進行重設。重設的行為會與 Shutdown 事件一樣。首先,Lambda 會關閉執行階段,然後將 Shutdown 事件傳送給每個已註冊的外部延伸項目。事件會包括關閉的原因。如果將此環境用於新的調用,Lambda 便會在下一次調用時重新初始化延伸項目和執行階段。

    請注意,Lambda 重設不會在下一個初始化階段之前清除/tmp目錄內容。這種行為與一般關機階段一致。

    注意

    AWS 目前正在對 Lambda 服務實作變更。由於這些變更,您可能會看到系統記錄訊息的結構和內容,以及. AWS 帳戶

    如果您的函數的系統日誌配置設置為純文本,則此更改會在您的函數遇到調用失敗時影響 CloudWatch 日誌中捕獲的日誌消息。下列範例會顯示新舊格式的記錄輸出。

    這些變更將在未來幾週內實施,除了中國和 GovCloud 地區以 AWS 區域 外的所有功能都將轉換為使用新格式的日誌訊息和追蹤區段。

    範例 CloudWatch 日誌日誌輸出(運行時或擴展崩潰)-舊樣式
    START RequestId: c3252230-c73d-49f6-8844-968c01d1e2e1 Version: $LATEST RequestId: c3252230-c73d-49f6-8844-968c01d1e2e1 Error: Runtime exited without providing a reason Runtime.ExitError END RequestId: c3252230-c73d-49f6-8844-968c01d1e2e1 REPORT RequestId: c3252230-c73d-49f6-8844-968c01d1e2e1 Duration: 933.59 ms Billed Duration: 934 ms Memory Size: 128 MB Max Memory Used: 9 MB
    範例 CloudWatch 日誌日誌輸出(功能超時)-舊樣式
    START RequestId: b70435cc-261c-4438-b9b6-efe4c8f04b21 Version: $LATEST 2024-03-04T17:22:38.033Z b70435cc-261c-4438-b9b6-efe4c8f04b21 Task timed out after 3.00 seconds END RequestId: b70435cc-261c-4438-b9b6-efe4c8f04b21 REPORT RequestId: b70435cc-261c-4438-b9b6-efe4c8f04b21 Duration: 3004.92 ms Billed Duration: 3000 ms Memory Size: 128 MB Max Memory Used: 33 MB Init Duration: 111.23 ms

    CloudWatch 記錄檔的新格式會在該REPORT行中包含其他status欄位。在執行階段或延伸功能損毀的情況下,該REPORT行也會包含欄位ErrorType

    範例 CloudWatch 日誌日誌輸出(運行時或擴展崩潰)-新樣式
    START RequestId: 5b866fb1-7154-4af6-8078-6ef6ca4c2ddd Version: $LATEST END RequestId: 5b866fb1-7154-4af6-8078-6ef6ca4c2ddd REPORT RequestId: 5b866fb1-7154-4af6-8078-6ef6ca4c2ddd Duration: 133.61 ms Billed Duration: 133 ms Memory Size: 128 MB Max Memory Used: 31 MB Init Duration: 80.00 ms Status: error Error Type: Runtime.ExitError
    範例 CloudWatch 日誌日誌輸出(功能超時)-新樣式
    START RequestId: 527cb862-4f5e-49a9-9ae4-a7edc90f0fda Version: $LATEST END RequestId: 527cb862-4f5e-49a9-9ae4-a7edc90f0fda REPORT RequestId: 527cb862-4f5e-49a9-9ae4-a7edc90f0fda Duration: 3016.78 ms Billed Duration: 3016 ms Memory Size: 128 MB Max Memory Used: 31 MB Init Duration: 84.00 ms Status: timeout
  • 第四個階段表示調用失敗後的INVOKE階段。在這裡,Lambda 通過重新運行階段再次初始化環境。INIT(我們將其稱為 隱藏的初始化。) 當隱藏的插入發生時,Lambda 不會在 CloudWatch 記錄中明確報告其他INIT階段。相反,您可能會注意到該REPORT行中的持續時間包括額外的INIT持續時間 + INVOKE持續時間。例如,假設您在中看到下列記錄檔 CloudWatch:

    2022-12-20T01:00:00.000-08:00 START RequestId: XXX Version: $LATEST 2022-12-20T01:00:02.500-08:00 END RequestId: XXX 2022-12-20T01:00:02.500-08:00 REPORT RequestId: XXX Duration: 3022.91 ms Billed Duration: 3000 ms Memory Size: 512 MB Max Memory Used: 157 MB

    在此範例中,REPORT和時間START戳記之間的差異為 2.5 秒。這與報告的 3022.91 毫秒持續時間不符,因為它不考慮 Lambda 執行的額外 INIT(抑制初始化)。在此範例中,您可以推斷實際INVOKE階段需要 2.5 秒。

    若要深入了解此行為,您可以使用 使用遙測存取擴充功能的即時遙測資料 API. 每當在叫用階段之間API發INIT_START生抑制 inits phase=invokeINIT_RUNTIME_DONE,遙測就會發出和INIT_REPORT事件。

  • 第五個階段表示SHUTDOWN階段,執行時不會發生錯誤。

關閉階段

當 Lambda 即將關閉執行時間,它會將 Shutdown 事件傳送至每個已註冊外部延伸。延伸項目可以使用此時間進行最終清理工作。該Shutdown事件是對NextAPI請求的響應。

持續時間:整個 Shutdown 階段上限為 2 秒。如果執行時間或任何延伸項目沒有回應,Lambda 會透過訊號 (SIGKILL) 加以終止。

在函數和所有延伸項目完成之後,Lambda 會維護執行環境一段時間,並預期另一個函數調用。不過,Lambda 會每隔幾個小時終止執行環境,以允許執行階段更新和維護,即使是持續叫用的函數也是如此。您不應假設執行環境將無限期持續存在。如需詳細資訊,請參閱在函數中實現無狀態

再次調用該函數時,Lambda 會解凍環境以供重複使用。重複使用執行環境具有下列含義:

  • 在函數處理常式方法外宣告的物件會保持初始化,於再次呼叫函數時提供額外的最佳化。例如,假設您的 Lambda 函數建立資料庫連線,而不是重建連線,那麼在後續呼叫時便會使用原始連線。建議您在程式碼中新增邏輯,在建立連線前先確認是否存在既有連線。

  • 每個執行環境都會在 /tmp 目錄中提供 512 MB 到 10,240 MB 的磁碟空間,增量為 1 MB。執行內容凍結時,目錄環境會凍結,所提供的暫時性可用於多重調用。您可以新增額外的程式碼,確認快取是否具有您已儲存的資料。如需部署大小限制的詳細資訊,請參閱Lambda 配額

  • 如果 Lambda 重複使用執行環境,則會恢復由 Lambda 函數啟動且在函數結束時沒有完成的背景程序或回呼。請確定程式碼中的任何背景程序或回呼在程式碼存在前已完成。

在函數中實現無狀態

撰寫 Lambda 函數程式碼時,請將執行環境視為無狀態環境,假設它只存在於單一叫用中。Lambda 會每隔幾個小時終止執行環境,以允許執行階段更新和維護,即使是連續叫用的函數也是如此。在函數啟動時初始化任何必要的狀態 (例如,從 Amazon DynamoDB 表格擷取購物車)。在退出之前,請將永久性資料變更提交到 Amazon 簡單儲存服務 (Amazon S3)、DynamoDB 或亞馬遜簡單佇列服務 (AmazonSQS) 等耐用存放區。避免仰賴現有的資料結構、暫存檔案或跨越呼叫的狀態,例如計數器或彙總。這可確保您的函數獨立處理每次調用。