

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

# 使用 Step Functions 協同運作 Lambda 函式
<a name="with-step-functions"></a>

AWS Step Functions 提供視覺化工作流程協同運作，以協調 Lambda 函數與其他 AWS 服務。透過原生整合 220 種以上的 AWS 服務，以及全受管、零維護的基礎設施， Step Functions 是您需要視覺化工作流程設計和全受管服務整合時的理想選擇。

對於使用 Lambda 內工作流程邏輯與商業邏輯一起運作的標準程式設計語言進行協調，請考慮 [Lambda 耐用函數](durable-functions.md)。如需在這些選項之間進行選擇的說明，請參閱[耐用函數或 Step Functions](durable-step-functions.md)。

例如，處理訂單可能需要驗證訂單詳細資訊、檢查庫存程度、處理付款和產生發票。為每個任務編寫單獨的 Lambda 函式，並使用 Step Functions 來管理工作流程。Step Functions 會協調函式之間的資料流程，並在每個步驟中處理錯誤。這種區隔可確保工作流程即使日益複雜，也將更容易進行視覺化、修改和維護。

## 何時將 Step Functions 與 Lambda 搭配使用
<a name="when-to-use-step-functions"></a>

以下是 Step Functions 特別適合協調 Lambda 型應用程式的良好範例。
+ [循序處理](#sequential-processing)
+ [複雜錯誤處理](#complex-error-handling)
+ [條件式工作流程與人工核准](#conditional-workflows-human-approvals)
+ [平行處理](#parallel-processing)

### 循序處理
<a name="sequential-processing"></a>

循序處理是指一個任務必須完成後，下一個任務才能開始。例如，在訂單處理系統中，訂單驗證完成後才能開始付款處理，而發票產生必須等待付款確認。需要為每個任務編寫單獨的 Lambda 函式，並使用 Step Functions 來管理順序和處理函式之間的資料流程。

#### 反模式範例
<a name="anti-pattern-sequential"></a>

單一 Lambda 函式透過下列方式來管理整個訂單處理工作流程：
+ 依序調用其他 Lambda 函式
+ 剖析與驗證各函式的回應
+ 實作錯誤處理與復原邏輯
+ 管理函式之間的資料流程

#### 建議方法
<a name="recommended-sequential"></a>

使用兩個 Lambda 函式：一個用於驗證訂單，另一個用於處理付款。Step Functions 透過下列方式協調這些函式：
+ 以正確順序執行任務
+ 在函式之間傳遞資料
+ 在各步驟實作錯誤處理
+ 使用 [Choice](https://docs.aws.amazon.com/step-functions/latest/dg/state-choice.html) 狀態確保僅有效訂單能進入付款流程

**Example 工作流程圖**  

![\[\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/sequential_workflow.png)


**注意**  
**程式碼優先替代方案：**如需使用程式碼型檢查點和重試的循序處理，請參閱 [Lambda 耐久函數步驟](durable-basic-concepts.md)。

### 複雜錯誤處理
<a name="complex-error-handling"></a>

儘管 Lambda [為非同步調用和事件來源映射提供重試功能](invocation-retries.md)，但 Step Functions 為複雜的工作流程提供了更精密的錯誤處理。您可以使用指數退避[設定自動重試](https://docs.aws.amazon.com/step-functions/latest/dg/concepts-error-handling.html#error-handling-retrying-after-an-error)，並為不同類型的錯誤設定不同的重試政策。如果重試用盡，請使用 `Catch` 將錯誤路由至[後援狀態](https://docs.aws.amazon.com/step-functions/latest/dg/concepts-error-handling.html#error-handling-fallback-states)。當您需要協調多個函式和服務的工作流程層級錯誤處理時，這尤其有用。

若要進一步了解如何在狀態機器中處理 Lambda 函數錯誤，請參閱* AWS Step Functions 研討會*中的[處理錯誤](https://catalog.workshops.aws/stepfunctions/handling-errors)。

#### 反模式範例
<a name="anti-pattern-error-handling"></a>

單一 Lambda 函式會處理下列所有項目：
+ 嘗試呼叫付款處理服務
+ 如果付款服務無法使用，函式會等待並於稍後重試。
+ 為等待時間實作自訂指數退避
+ 所有嘗試都失敗後，擷取錯誤並選擇另一個流程

#### 建議方法
<a name="recommended-error-handling"></a>

使用僅專注於付款處理的單一 Lambda 函式。Step Functions 透過下列方式管理錯誤處理：
+ [使用可設定的退避期間自動重試失敗的任務](https://docs.aws.amazon.com/step-functions/latest/dg/concepts-error-handling.html#error-handling-retrying-after-an-error)
+ 根據錯誤類型套用不同的重試政策
+ 將不同類型的錯誤路由至相應的後援狀態
+ 維護錯誤處理狀態與歷史記錄

**Example 工作流程圖**  

![\[\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/error_handling_workflow.png)


**注意**  
**程式碼優先替代方案：**耐用的 函數透過可設定的重試策略提供 try-catch 錯誤處理。請參閱[耐用函數中的錯誤處理](durable-execution-sdk-retries.md)。

### 條件式工作流程與人工核准
<a name="conditional-workflows-human-approvals"></a>

使用 Step Functions 的 [Choice 狀態](https://docs.aws.amazon.com/step-functions/latest/dg/state-choice.html)，根據函式輸出路由工作流程，並使用 [waitForTaskToken 尾碼](https://docs.aws.amazon.com/step-functions/latest/dg/connect-to-resource.html#connect-wait-token)暫停工作流程以等待人工決策。例如，若要處理信用額度提高請求，可使用 Lambda 函式評估風險因素。然後，透過 Step Functions 將高風險請求路由至手動核准，將低風險請求路由至自動核准。

若要部署使用回呼任務字符整合模式的範例工作流程，請參閱* AWS Step Functions 研討會*中的[使用任務字符回呼](https://catalog.workshops.aws/stepfunctions/integrating-services/3-callback-token)。

#### 反模式範例
<a name="anti-pattern-conditional"></a>

單一 Lambda 函式透過下列方式管理複雜的核准工作流程：
+ 實作巢狀條件邏輯來評估額度請求
+ 根據請求金額調用不同的核准函式
+ 管理多個核准路徑與決策點
+ 追蹤待核准的狀態
+ 實作核准逾時與通知邏輯

#### 建議方法
<a name="recommended-conditional"></a>

使用三個 Lambda 函式：一個用於評估每筆請求的風險，一個用於核准低風險請求，另一個用於將高風險請求路由至經理以供檢閱。Step Functions 透過下列方式管理工作流程：
+ 使用 [Choice](https://docs.aws.amazon.com/step-functions/latest/dg/state-choice.html) 狀態根據金額與風險等級來路由請求
+ 在等待人工核准時暫停執行
+ 管理待核准逾時
+ 提供每個請求目前狀態的可見性

**Example 工作流程圖**  

![\[\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/conditional_workflow.png)


**注意**  
**程式碼優先替代方案：**耐用的 函數支援human-in-the-loop工作流程的回呼。請參閱[耐用函數中的回呼](durable-execution-sdk.md)。

### 平行處理
<a name="parallel-processing"></a>

Step Functions 提供三種平行處理的實作方式：
+ [平行狀態](https://docs.aws.amazon.com/step-functions/latest/dg/state-parallel.html)會同時執行工作流程的多個分支。需要平行執行不同的函式時 (例如在擷取映像中繼資料時產生縮圖)，可使用此狀態。
+ [內嵌映射狀態](https://docs.aws.amazon.com/step-functions/latest/dg/state-map-inline.html)會處理資料陣列，最多支援 40 個並行迭代。此狀態適用於需要對每個項目執行相同操作的中小型資料集。
+ [分散式映射狀態](https://docs.aws.amazon.com/step-functions/latest/dg/state-map-distributed.html)會處理大規模平行處理，最多支援 10,000 個並行執行，同時支援 JSON 陣列和 Amazon Simple Storage Service (Amazon S3) 資料來源。處理大型資料集或需要更高並行性時，可使用此狀態。

#### 反模式範例
<a name="anti-pattern-parallel"></a>

單一 Lambda 函式嘗試透過下列方式管理平行處理：
+ 同時調用多個映像處理函式
+ 實作自訂的平行執行邏輯
+ 管理各平行任務的逾時與錯誤處理
+ 收集並彙總所有函式的結果

#### 建議方法
<a name="recommended-parallel"></a>

使用三個 Lambda 函式：一個用於建立縮圖映像、一個用於新增浮水印，另一個用於擷取中繼資料。Step Functions 透過下列方式管理這些函式：
+ 使用[平行](https://docs.aws.amazon.com/step-functions/latest/dg/state-parallel.html)狀態同時執行所有函式
+ 將每個函式的結果收集到排序陣列
+ 管理所有平行執行的逾時與錯誤處理
+ 僅在所有平行分支完成後才繼續進行

**Example 工作流程圖**  

![\[\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/parallel_workflow.png)


**注意**  
**程式碼優先替代方案：**耐用的 函數提供 `parallel()`和 `map()`操作。請參閱[平行執行](durable-execution-sdk.md)。

## 不適用 Step Functions 搭配 Lambda 的時機
<a name="when-not-to-use"></a>

並非所有以 Lambda 為基礎的應用程式都能從使用 Step Functions 中受益。選擇應用程式架構時，建議考量以下案例。
+ [簡易的應用程式](#simple-applications)
+ [複雜的資料處理](#complex-data-processing)
+ [CPU 密集型工作負載](#cpu-intensive)

### 簡易的應用程式
<a name="simple-applications"></a>

**注意**  
對於不需要視覺化設計或廣泛服務整合的工作流程，[Lambda 耐用函數](durable-functions.md)可能是將工作流程邏輯保留在 Lambda 內更簡單的替代方案。

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

### 複雜的資料處理
<a name="complex-data-processing"></a>

您可以使用 Step Functions 的[分散式映射](https://docs.aws.amazon.com/step-functions/latest/dg/state-map-distributed.html)狀態，透過 Lambda 函式並行處理大型 Amazon S3 資料集。這對於許多大規模平行工作負載有效，包括處理 JSON 或 CSV 檔案等半結構化資料。但是，對於更複雜的資料轉換或進階分析，建議考量以下替代方案：
+ **資料轉換管道**： AWS Glue 用於處理來自多個來源的結構化或半結構化資料的 ETL 任務。當您需要內建資料目錄和結構描述管理功能時 AWS Glue ， 特別有用。
+ **資料分析：**針對 PB 級資料分析，可以使用 Amazon EMR，尤其是當您需要 Apache Hadoop 生態系統工具或用於超過 Lambda [記憶體](configuration-memory.md)限制的機器學習工作負載時。

### CPU 密集型工作負載
<a name="cpu-intensive"></a>

儘管 Step Functions 可以協調 CPU 密集型任務，但由於 Lambda 函式的 CPU 資源有限，可能不適合處理此類工作負載。對於工作流程中需要大量運算資源的操作，建議考量以下替代方案：
+ **容器協同運作：**使用 Step Functions 來管理 Amazon Elastic Container Service (Amazon ECS) 任務，取得更加一致且可擴展的運算資源。
+ **批次處理：** AWS Batch 與 Step Functions 整合，以管理需要持續 CPU 用量的運算密集型批次任務。