使用 Step Functions 協調 Lambda 函數 - AWS Lambda

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

使用 Step Functions 協調 Lambda 函數

管理多個任務、實作重試邏輯或包含分支邏輯的 Lambda 函數是反模式。反之,我們建議撰寫執行單一任務並使用 AWS Step Functions 來協調應用程式工作流程的 Lambda 函數。

例如,處理訂單可能需要驗證訂單詳細資訊、檢查庫存層級、處理付款和產生發票。為每個任務撰寫單獨的 Lambda 函數,並使用 Step Functions 來管理工作流程。Step Functions 會協調函數之間的資料流程,並在每個步驟中處理錯誤。此區隔可讓您的工作流程在更複雜成長時,更輕鬆地視覺化、修改和維護。

何時搭配 Lambda 使用 Step Functions

以下是使用 Step Functions 協調 Lambda 型應用程式的良好範例。

循序處理

循序處理是指在下一個任務開始之前,一個任務必須完成。例如,在訂單處理系統中,除非訂單驗證完成,否則無法開始付款處理,而且產生發票必須等待付款確認。為每個任務編寫單獨的 Lambda 函數,並使用 Step Functions 來管理函數之間的序列和處理資料流程。

單一 Lambda 函數會透過下列方式管理整個訂單處理工作流程:

  • 依序叫用其他 Lambda 函數

  • 剖析和驗證每個函數的回應

  • 實作錯誤處理和復原邏輯

  • 管理函數之間的資料流程

使用兩個 Lambda 函數:一個用於驗證訂單,另一個用於處理付款。Step Functions 會透過以下方式協調這些函數:

  • 以正確的順序執行任務

  • 在函數之間傳遞資料

  • 在每個步驟實作錯誤處理

  • 使用選擇狀態來確保只有有效的訂單才能進行付款

範例 工作流程圖表
Step Functions 工作流程圖表顯示訂單驗證、選擇狀態,以及成功和失敗路徑的付款處理

複雜的錯誤處理

雖然 Lambda 為非同步調用和事件來源映射提供重試功能,但 Step Functions 為複雜的工作流程提供更複雜的錯誤處理。您可以使用指數退避設定自動重試,並為不同類型的錯誤設定不同的重試政策。當重試用盡時,請使用 Catch將錯誤路由到備用狀態。當您需要工作流程層級錯誤處理來協調多個函數和服務時,此功能特別有用。

若要進一步了解如何在狀態機器中處理 Lambda 函數錯誤,請參閱 AWS Step Functions 研討會中的處理錯誤

單一 Lambda 函數會處理下列所有項目:

  • 嘗試呼叫付款處理服務

  • 如果付款服務無法使用,函數會等待並稍後重試。

  • 實作等待時間的自訂指數退避

  • 所有嘗試都失敗後,擷取錯誤並選擇另一個流程

使用僅專注於付款處理的單一 Lambda 函數。Step Functions 會透過下列方式管理錯誤處理:

範例 工作流程圖表
Step Functions 處理付款的工作流程圖表有三個結果:付款成功、付款無效和付款失敗

條件式工作流程和人工核准

使用 Step Functions Choice 狀態,根據函數輸出和 waitForTaskToken 尾碼來路由工作流程,以暫停工作流程進行人工決策。例如,若要處理提高點數限制的請求,請使用 Lambda 函數評估風險因子。然後,使用 Step Functions 將高風險請求路由到手動核准,將低風險請求路由到自動核准。

若要部署使用回呼任務字符整合模式的範例工作流程,請參閱 AWS Step Functions 研討會中的使用任務字符回呼

單一 Lambda 函數會透過下列方式管理複雜的核准工作流程:

  • 實作巢狀條件邏輯來評估點數請求

  • 根據請求金額調用不同的核准函數

  • 管理多個核准路徑和決策點

  • 追蹤待核准的狀態

  • 實作核准逾時和通知邏輯

使用三個 Lambda 函數:一個用於評估每個請求的風險,一個用於核准低風險請求,另一個用於將高風險請求路由到經理以供審核。Step Functions 會透過下列方式管理工作流程:

  • 使用選擇狀態根據數量和風險層級來路由請求

  • 在等待人工核准時暫停執行

  • 管理待核准逾時

  • 提供每個請求目前狀態的可見性

範例 工作流程圖表
Step Functions 工作流程圖表顯示根據風險將點數請求評估分支到自動或經理核准

平行處理

Step Functions 提供三種處理平行處理的方式:

  • 平行狀態會同時執行工作流程的多個分支。當您需要平行執行不同的函數時,例如在擷取影像中繼資料時產生縮圖時,請使用此選項。

  • 內嵌映射狀態會處理最多 40 個並行反覆運算的資料陣列。將此用於您需要對每個項目執行相同操作的中小型資料集。

  • 分散式映射狀態處理大型平行處理,最多 10,000 個並行執行,同時支援 JSON 陣列和 Amazon Simple Storage Service (Amazon S3) 資料來源。處理大型資料集或需要更高的並行時,請使用此選項。

單一 Lambda 函數會嘗試透過下列方式管理平行處理:

  • 同時叫用多個影像處理函數

  • 實作自訂平行執行邏輯

  • 管理每個平行任務的逾時和錯誤處理

  • 從所有函數收集和彙總結果

使用三個 Lambda 函數:一個用於建立縮圖影像、一個用於新增浮水印,另一個用於擷取中繼資料。Step Functions 會透過下列方式管理這些函數:

  • 使用平行狀態同時執行所有函數

  • 將每個函數的結果收集到排序陣列

  • 管理所有平行執行的逾時和錯誤處理

  • 僅在所有平行分支完成時繼續

範例 工作流程圖表
Step Functions 工作流程圖表具有三個平行 Lambda 函數:建立縮圖、新增浮水印和擷取中繼資料

何時不搭配 Lambda 使用 Step Functions

並非所有 Lambda 型應用程式都受益於使用 Step Functions。選擇應用程式架構時,請考慮這些案例。

簡單應用程式

對於不需要複雜協同運作的應用程式,使用 Step Functions 可能會增加不必要的複雜性。例如,如果您只是處理來自 Amazon SQS 佇列的訊息或回應 Amazon EventBridge 事件,您可以將這些服務設定為直接叫用 Lambda 函數。同樣地,如果您的應用程式僅包含一或兩個具有直接錯誤處理的 Lambda 函數,則直接 Lambda 調用或事件驅動型架構可能更容易部署和維護。

複雜的資料處理

您可以使用 Step Functions 分散式映射狀態,搭配 Lambda 函數同時處理大型 Amazon S3 資料集。這對於許多大規模平行工作負載有效,包括處理 JSON 或 CSV 檔案等半結構化資料。不過,對於更複雜的資料轉換或進階分析,請考慮以下替代方案:

  • 資料轉換管道: AWS Glue 用於處理來自多個來源的結構化或半結構化資料的 ETL 任務。當您需要內建資料目錄和結構描述管理功能時 AWS Glue , 特別有用。

  • 資料分析:使用 Amazon EMR 進行 PB 級資料分析,尤其是當您需要Apache Hadoop生態系統工具或超過 Lambda 記憶體限制的機器學習工作負載時。

CPU 密集型工作負載

雖然 Step Functions 可以協調 CPU 密集型任務,但由於 Lambda 函數的 CPU 資源有限,因此可能不適合這些工作負載。對於工作流程中的運算密集型操作,請考慮以下替代方案:

  • 容器協同運作:使用 Step Functions 來管理 Amazon Elastic Container Service (Amazon ECS) 任務,以取得更一致且可擴展的運算資源。

  • 批次處理: AWS Batch 與 Step Functions 整合,以管理需要持續 CPU 用量的運算密集型批次任務。