本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
瞭解 Lambda 執行環境生命週期
Lambda 會在執行環境中調用您的函數,該環境可提供安全且隔離的執行時間環境。執行環境會管理執行函式所需的資源。執行環境也會提供函式執行階段的生命週期支援,以及與函式相關聯的任何外部延伸項目。
函數的執行階段會使用執行階段與 Lambda 進行API通訊。擴充功能使用擴充功能與 Lambda 通訊API。擴充功能也可以使用遙測功能接收記錄訊息和其他遙測API。
當您建立 Lambda 函數時,您將指定組態資訊,例如您的函數允許的記憶體數量與執行時間上限。Lambda 會使用此資訊來設定執行環境。
函式的執行階段和每個外部延伸項目都是在執行環境中執行的程序。許可、資源、認證和環境變數會在函式和延伸項目之間共用。
Lambda 執行環境生命週期
每個階段都以 Lambda 傳送到執行階段和所有已註冊延伸項目的事件開始。運行時和每個擴展通過發送Next
API請求來指示完成。當執行時間和每個延伸項目已完成且沒有擱置的事件時,Lambda 凍結執行環境。
初始化階段
在 Init
階段中,Lambda 會執行三項任務:
-
啟動所有延伸項目 (
Extension init
) -
Bootstrap 執行時間 (
Runtime init
) -
執行該函式的靜態代碼 (
Function init
) -
執行任何執行
beforeCheckpoint
階段掛鉤 ( SnapStart 僅限 Lambda)
當運行時和所有擴展通過發送Next
API請求發送信號它們已準備就緒時,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 函數以回應Next
API請求時,Lambda 會將Invoke
事件傳送至執行階段和每個擴充功能。
該函式的逾時設定會限制整個 Invoke
階段的持續時間。例如,如果您將函式逾時設定為 360 秒,則函式和所有延伸項目都需要在 360 秒內完成。請注意,沒有獨立的調用後階段。持續時間是所有調用時間 (執行階段 + 延伸項目) 的總和,直到函式和所有延伸項目完成執行後才會計算。
調用階段在運行時結束後,所有擴展都通過發送Next
API請求來完成它們。
調用階段期間出現的故障
如果 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
生抑制 initsphase=invoke
時INIT_RUNTIME_DONE
,遙測就會發出和INIT_REPORT
事件。 -
第五個階段表示SHUTDOWN階段,執行時不會發生錯誤。
關閉階段
當 Lambda 即將關閉執行時間,它會將 Shutdown
事件傳送至每個已註冊外部延伸。延伸項目可以使用此時間進行最終清理工作。該Shutdown
事件是對Next
API請求的響應。
持續時間:整個 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) 等耐用存放區。避免仰賴現有的資料結構、暫存檔案或跨越呼叫的狀態,例如計數器或彙總。這可確保您的函數獨立處理每次調用。