本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
Lambda 執行環境
Lambda 會在執行環境中調用您的函數,該環境可提供安全且隔離的執行時間環境。執行環境會管理執行函式所需的資源。執行環境也會提供函式執行階段的生命週期支援,以及與函式相關聯的任何外部延伸項目。
函數的執行時間會使用 Runtime API 與 Lambda 進行通訊。延伸項目會使用 Extensions API 與 Lambda 進行通訊。延伸項目還可以透過使用遙測 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 階段,執行期間未發生錯誤。
-
假設您的函數在某個時間點發生調用故障 (例如函數逾時或執行階段錯誤)。第三階段 (標記為「INVOKE WITH ERROR」) 會說明此狀況。發生此狀況時,Lambda 服務會進行重設。重設的行為會與
Shutdown
事件一樣。首先,Lambda 會關閉執行階段,然後將Shutdown
事件傳送給每個已註冊的外部延伸項目。事件會包括關閉的原因。如果將此環境用於新的調用,Lambda 便會在下一次調用時重新初始化延伸項目和執行階段。注意
在下一個初始化階段之前,Lambda 重設不會清除
/tmp
目錄內容。這種行為與一般關機階段一致。 -
第四階段指的是出現調用故障後立即進入的 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 秒的時間。
若要深入了解此行為,您可以使用 Lambda 遙測 API. 調用階段發生隱藏的初始化時,遙測 API 便會透過
phase=invoke
發送INIT_START
、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 建立新執行環境的需求,這可能導致未預期的結果,例如資料庫連線失敗。