本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 Step Functions 協同運作 Lambda 函式
管理多個任務、實作重試邏輯或包含分支邏輯的 Lambda 函式屬於反模式。建議您改為編寫執行單一任務的 Lambda 函式,並使用 AWS Step Functions 來協同運作應用程式工作流程。
例如,處理訂單可能需要驗證訂單詳細資訊、檢查庫存程度、處理付款和產生發票。為每個任務編寫單獨的 Lambda 函式,並使用 Step Functions 來管理工作流程。Step Functions 會協調函式之間的資料流程,並在每個步驟中處理錯誤。這種區隔可確保工作流程即使日益複雜,也將更容易進行視覺化、修改和維護。
何時將 Step Functions 與 Lambda 搭配使用
下列案例是說明何時使用 Step Functions 來協同運作以 Lambda 為基礎之應用程式的良好範例。
循序處理
循序處理是指一個任務必須完成後,下一個任務才能開始。例如,在訂單處理系統中,訂單驗證完成後才能開始付款處理,而發票產生必須等待付款確認。需要為每個任務編寫單獨的 Lambda 函式,並使用 Step Functions 來管理順序和處理函式之間的資料流程。
單一 Lambda 函式透過下列方式來管理整個訂單處理工作流程:
依序調用其他 Lambda 函式
剖析與驗證各函式的回應
實作錯誤處理與復原邏輯
管理函式之間的資料流程
使用兩個 Lambda 函式:一個用於驗證訂單,另一個用於處理付款。Step Functions 透過下列方式協調這些函式:
以正確順序執行任務
在函式之間傳遞資料
在各步驟實作錯誤處理
使用 Choice 狀態確保僅有效訂單能進入付款流程
範例 工作流程圖
複雜錯誤處理
儘管 Lambda 為非同步調用和事件來源映射提供重試功能,但 Step Functions 為複雜的工作流程提供了更精密的錯誤處理。您可以使用指數退避設定自動重試,並為不同類型的錯誤設定不同的重試政策。如果重試用盡,請使用 Catch 將錯誤路由至後援狀態。當您需要協調多個函式和服務的工作流程層級錯誤處理時,這尤其有用。
若要進一步了解如何在狀態機器中處理 Lambda 函式錯誤,請參閱 The AWS Step Functions Workshop 中的 Handling errors
單一 Lambda 函式會處理下列所有項目:
-
嘗試呼叫付款處理服務
-
如果付款服務無法使用,函式會等待並於稍後重試。
-
為等待時間實作自訂指數退避
-
所有嘗試都失敗後,擷取錯誤並選擇另一個流程
使用僅專注於付款處理的單一 Lambda 函式。Step Functions 透過下列方式管理錯誤處理:
根據錯誤類型套用不同的重試政策
將不同類型的錯誤路由至相應的後援狀態
維護錯誤處理狀態與歷史記錄
範例 工作流程圖
條件式工作流程與人工核准
使用 Step Functions 的 Choice 狀態,根據函式輸出路由工作流程,並使用 waitForTaskToken 尾碼暫停工作流程以等待人工決策。例如,若要處理信用額度提高請求,可使用 Lambda 函式評估風險因素。然後,透過 Step Functions 將高風險請求路由至手動核准,將低風險請求路由至自動核准。
若要部署使用回呼任務權杖整合模式的範例工作流程,請參閱 The AWS Step Functions Workshop 中的 Callback with Task Token
單一 Lambda 函式透過下列方式管理複雜的核准工作流程:
實作巢狀條件邏輯來評估額度請求
根據請求金額調用不同的核准函式
管理多個核准路徑與決策點
追蹤待核准的狀態
實作核准逾時與通知邏輯
使用三個 Lambda 函式:一個用於評估每筆請求的風險,一個用於核准低風險請求,另一個用於將高風險請求路由至經理以供檢閱。Step Functions 透過下列方式管理工作流程:
使用 Choice 狀態根據金額與風險等級來路由請求
在等待人工核准時暫停執行
管理待核准逾時
提供每個請求目前狀態的可見性
範例 工作流程圖
平行處理
Step Functions 提供三種平行處理的實作方式:
單一 Lambda 函式嘗試透過下列方式管理平行處理:
同時調用多個映像處理函式
實作自訂的平行執行邏輯
管理各平行任務的逾時與錯誤處理
收集並彙總所有函式的結果
使用三個 Lambda 函式:一個用於建立縮圖映像、一個用於新增浮水印,另一個用於擷取中繼資料。Step Functions 透過下列方式管理這些函式:
使用平行狀態同時執行所有函式
將每個函式的結果收集到排序陣列
管理所有平行執行的逾時與錯誤處理
僅在所有平行分支完成後才繼續進行
範例 工作流程圖
不適用 Step Functions 搭配 Lambda 的時機
並非所有以 Lambda 為基礎的應用程式都能從使用 Step Functions 中受益。選擇應用程式架構時,建議考量以下案例。
簡易的應用程式
對於不需要複雜協同運作的應用程式,使用 Step Functions 可能會增加不必要的複雜性。例如,若只是處理來自 Amazon SQS 佇列的訊息或回應 Amazon EventBridge 事件,您可以將這些服務設定為直接調用 Lambda 函式。同理,如果應用程式僅包含一或兩個具有直接錯誤處理的 Lambda 函式,則 Lambda 直接調用或事件驅動型架構可能更易於部署與維護。
複雜的資料處理
您可以使用 Step Functions 的分散式映射狀態,透過 Lambda 函式並行處理大型 Amazon S3 資料集。這對於許多大規模平行工作負載有效,包括處理 JSON 或 CSV 檔案等半結構化資料。但是,對於更複雜的資料轉換或進階分析,建議考量以下替代方案:
-
資料轉換管道:針對處理來自多個來源的結構化或半結構化資料的 ETL 任務,可以使用 AWS Glue。若需內建資料目錄與結構描述管理功能,AWS Glue 特別有用。
-
資料分析:針對 PB 級資料分析,可以使用 Amazon EMR,尤其是當您需要 Apache Hadoop 生態系統工具或用於超過 Lambda 記憶體限制的機器學習工作負載時。
CPU 密集型工作負載
儘管 Step Functions 可以協調 CPU 密集型任務,但由於 Lambda 函式的 CPU 資源有限,可能不適合處理此類工作負載。對於工作流程中需要大量運算資源的操作,建議考量以下替代方案:
-
容器協同運作:使用 Step Functions 來管理 Amazon Elastic Container Service (Amazon ECS) 任務,取得更加一致且可擴展的運算資源。
-
批次處理:將 AWS Batch 與 Step Functions 整合,管理需要持續 CPU 用量的運算密集型批次任務。