Lambda 執行環境 - AWS Lambda

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

Lambda 執行環境

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

函數的執行時間會使用 Runtime API 與 Lambda 進行通訊。延伸項目會使用 Extensions API 與 Lambda 進行通訊。延伸項目還可以透過使用遙測 API 來接收函數的日誌訊息和其他遙測項目。


            執行環境的架構圖表。

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

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

Lambda 執行環境生命週期


            Init 階段後面是一個或多個函數調用。沒有調用請求時,Lambda 會啟動 Shutdown 階段。

每個階段都以 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_STARTINIT_RUNTIME_DONEINIT_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 建立新執行環境的需求,這可能導致未預期的結果,例如資料庫連線失敗。