了解 Step Functions 中的狀態機器 - AWS Step Functions

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

了解 Step Functions 中的狀態機器

Step Functions 是以狀態機器為基礎,也稱為工作流程。工作流程由一系列的事件驅動步驟組成。

您可以使用 Amazon States Language 定義工作流程,也稱為 ASL。您可以選擇使用視覺化工作流程設計工具 Workflow Studio 來建置和編輯工作流程。

工作流程中的每個步驟都稱為 狀態。狀態有兩種類型:流程狀態和任務狀態:

流程狀態

流程狀態控制步驟的執行流程。例如,選擇狀態提供條件式邏輯;等待狀態暫停工作流程執行;對應狀態會針對資料集中的每個項目執行子工作流程;而平行狀態會在工作流程中建立個別分支。

任務狀態

任務狀態代表另一個 AWS 服務執行的工作單位,例如呼叫另一個 AWS 服務 或 API。任務狀態也稱為動作。您可以選擇數百個動作來執行 AWS 和外部服務的工作。(注意:您也可以使用在 Step Functions 外執行的工作者來執行任務。 如需詳細資訊,請參閱 活動。)

Step Functions 工作流程元件的說明性範例。

執行和處理錯誤

當您執行工作流程時,Step Functions 會建立稱為 執行的工作流程執行個體。您可以監控工作流程執行的狀態。如果執行發生錯誤,工作流程可能會攔截到錯誤。根據您的使用案例,稍後您可以重新驅動執行以繼續工作流程。

傳遞資料

您可以選擇性地以JSON文字形式將輸入資料提供給工作流程。每個步驟都可以使用變數和狀態輸出將資料傳遞至後續步驟。儲存在變數中的資料可供後續步驟使用。狀態輸出會成為下一個步驟的輸入。若要進一步了解傳遞資料,請參閱 使用變數在狀態之間傳遞資料

在工作流程結束時,您的狀態機器可以選擇性地產生輸出,也可以採用 的形式JSON。

轉換資料

狀態和狀態機器可以使用查詢語言轉換資料。建議的查詢語言為 JSONata;不過,在 re:Invent 2024 之前建立的狀態機器會使用 JSONPath。為了回溯相容性,您的狀態機器或個別狀態必須選擇使用 JSONata 查詢語言。

您可以透過QueryLanguage欄位設定為 "JSONata" 來識別JSONata狀態機器和個別狀態。狀態機器和使用 的狀態JSONPath,缺少 QueryLanguage 欄位。

使用 的狀態JSONPath會有狀態欄位 InputPath,例如 參數 ResultSelector ResultPath、 和 OutputPath。在JSONPath狀態機器定義中,您也會看到結尾為 的欄位名稱.$,以及字首為 $.和 的值$$.,兩者都代表路徑。在路徑中,您可能會看到各種內部函數,例如 States.MathAdd。內部函數僅用於 JSONPath。

JSONata 狀態使用引數輸出欄位。在這些選用欄位中,您可能會看到如下所示的JSONata表達式:"{% $type = 'local' %}"。透過 JSONata,您可以使用表達式、運算子和函數。如需進一步了解,請參閱 在 Step Functions 中使用 JSONata 轉換資料

注意

每個狀態只能使用一種查詢語言。您無法在單一步驟JSONata中混合 JSONPath和 。

重要概念

以下提供內容的金鑰 Step Functions 術語概觀。

術語 描述
工作流程 通常反映業務流程的一系列步驟。
狀態

狀態機器中的個別步驟,可以根據其輸入做出決策、從這些輸入執行動作,並將輸出傳遞至其他狀態。

如需詳細資訊,請參閱探索要在 Step Functions 中使用的工作流程狀態

工作流程 Studio

視覺化工作流程設計工具,可協助您更快速地建立原型和建置工作流程。

如需詳細資訊,請參閱在 Step Functions Workflow Studio 中開發工作流程

狀態機器

使用代表工作流程中個別狀態或步驟JSON的文字以及 欄位定義的工作流程,例如 StartAtTimeoutSecondsVersion

如需詳細資訊,請參閱Step Functions 工作流程的 Amazon States 語言狀態機器結構

Amazon States Language

以 JSON為基礎的結構化語言,用於定義您的狀態機器。使用 ASL時,您可以定義可執行 (Task 狀態) 的狀態集合、決定要轉換到下一個 (Choice 狀態) 的狀態,以及停止執行並顯示錯誤 (Fail 狀態)。

如需詳細資訊,請參閱使用 Amazon States 語言定義 Step Functions 工作流程

輸入和輸出組態

工作流程中的狀態會接收JSON資料做為輸入,通常將JSON資料做為輸出傳遞至下一個狀態。Step Functions 提供篩選條件來控制狀態之間的資料流程。

如需詳細資訊,請參閱在 Step Functions 中處理輸入和輸出

服務整合

您可以從工作流程呼叫 AWS 服務API動作。

如需詳細資訊,請參閱將 服務與 Step Functions 整合

服務整合類型
  • AWS SDK 整合 – 直接從您的狀態機器呼叫超過兩百 AWS 服務 和九千個API動作中的任一個的標準方法。

  • 最佳化整合 – 自訂整合,可簡化呼叫,並與特定 服務交換資料。例如,Lambda Invoke 會自動將回應Payload的欄位從逸出字串轉換為JSONJSON物件。

服務整合模式

呼叫 時 AWS 服務,您可以使用下列其中一種服務整合模式:

執行

狀態機器執行是您執行工作流程以執行任務的執行個體。

如需詳細資訊,請參閱在 Step Functions 中啟動狀態機器執行

狀態機器資料

狀態機器資料的格式如下:

  • 狀態機器的初始輸入

  • 狀態之間傳遞的資料

  • 來自狀態機器的輸出

本節將說明 AWS Step Functions會如何格式化和使用狀態機器的資料。

資料格式

狀態機器資料以JSON文字表示。您可以使用 支援的任何資料類型,將值提供給狀態機器JSON。

注意
  • JSON 文字格式的數字符合 JavaScript 語意。這些數字通常對應於雙精度 IEEE-854 值。

  • 以下是有效的JSON文字:

    • 單機引號分隔字串

    • 物件

    • 陣列

    • 數字

    • 布林值

    • null

  • 狀態的輸出會成為下一個狀態的輸入。不過,您可以使用輸入和輸出處理,限制狀態處理輸入資料的子集。

狀態機器輸入/輸出

您可以透過兩種方式之一,將初始輸入資料提供給 AWS Step Functions 狀態機器。您可以在開始執行時將資料傳遞至StartExecution動作。您也可以從 Step Functions 主控台將資料傳遞至狀態機器。初始資料會傳送至狀態機器的 StartAt 狀態。如果沒有提供輸入,預設會是空的物件 ({})。

執行的輸出會由最後狀態 (terminal) 傳回。此輸出會在執行結果中顯示為JSON文字。

對於標準工作流程,您可以使用 DescribeExecution動作等外部呼叫者從執行歷史記錄擷取執行結果。您可以在 Step Functions 主控台上檢視執行結果。

對於快速工作流程,如果您啟用記錄,您可以從 CloudWatch 日誌擷取結果,或在 Step Functions 主控台中檢視和偵錯執行。如需詳細資訊,請參閱 使用 CloudWatch 日誌記錄 Step Functions 中的執行歷史記錄在 Step Functions 主控台中檢視執行詳細資訊

您也應該考慮與狀態機器相關的配額。如需詳細資訊,請參閱 Step Functions 服務配額

狀態輸入/輸出

每個狀態的輸入都包含來自上述狀態JSON的文字,或者對於 StartAt 狀態,輸入到執行中。某些流程控制狀態會將他們的輸入重複到他們的輸出中。

在以下範例中,狀態機器會同時新增兩個數字。

  1. 定義 AWS Lambda 函數。

    function Add(input) { var numbers = JSON.parse(input).numbers; var total = numbers.reduce( function(previousValue, currentValue, index, array) { return previousValue + currentValue; }); return JSON.stringify({ result: total }); }
  2. 定義 狀態機器。

    { "Comment": "An example that adds two numbers together.", "StartAt": "Add", "Version": "1.0", "TimeoutSeconds": 10, "States": { "Add": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:Add", "End": true } } }
  3. 使用以下JSON文字開始執行。

    { "numbers": [3, 4] }

    Add 狀態會接收JSON文字並將其傳遞給 Lambda 函數。

    Lambda 函數會將計算結果傳回 狀態。

    狀態會在它的輸出中傳回以下值。

    { "result": 7 }

    由於 Add 也是狀態機器中的最終狀態,此值會做為狀態機器的輸出傳回。

    如果最終狀態沒有傳回輸出,則狀態機器會傳回空的物件 ({})。

如需詳細資訊,請參閱在 Step Functions 中處理輸入和輸出

AWS Step Functions 從其他服務叫用

您可以設定數個其他服務來叫用狀態機器。根據狀態機器的工作流程類型,您可以非同步或同步叫用狀態機器。若要同步叫用狀態機器,請使用 StartSyncExecutionAPI呼叫或 Amazon API Gateway 與 Express Workflows 整合。使用非同步調用時,Step Functions 會暫停工作流程執行,直到傳回任務字符為止。不過,等待任務字符確實會讓工作流程同步。

您可以設定 來叫用 Step Functions 的服務包括:

Step Functions StartExecution 調用受配額管限。如需詳細資訊,請參閱:

狀態機器中的轉換

當您開始新的狀態機器執行時,系統會從最上層StartAt欄位中參考的狀態開始。此欄位以字串形式提供,必須完全相符,包括案例,即工作流程中狀態的名稱。

狀態執行後, AWS Step Functions 會使用 Next 欄位的值來決定要前進到的下一個狀態。

Next 欄位也會將狀態名稱指定為字串。此字串區分大小寫,且必須與狀態機器描述中指定的狀態名稱完全相符

例如,以下狀態包含對 NextState 的移轉。

"SomeState" : { ..., "Next" : "NextState" }

大多數狀態只允許具有 Next 欄位的單一轉換規則。不過,某些流程控制狀態,例如 Choice 狀態,可讓您指定多個轉換規則,每個規則都有自己的Next欄位。Amazon 狀態語言提供每個您可以指定之狀態類型的詳細資訊,包括有關如何指定轉換的資訊。

狀態可以具有來自其他狀態的多個傳入轉換。

程序會重複,直到達到終端狀態 (具有 "Type": Succeed"Type": Fail或 的狀態"End": true) 或執行時間錯誤為止。

當您 redrive 執行,它被視為狀態轉換。此外,所有在 中重新執行的狀態 redrive 也會被視為狀態轉換。

下列規則適用於狀態機器內的狀態:

  • 狀態可能會以任何順序出現在封裝區塊中。不過,列出它們的順序不會影響它們的執行順序。該順序取決於狀態的內容。

  • 在狀態機器中,只能有一個指定為 start 狀態的狀態。start 狀態是由最上層結構中的 StartAt 欄位值定義。

  • 視您的狀態機器邏輯而定,例如,如果您的狀態機器有多個邏輯分支,您可能有多個end狀態。

  • 如果您的狀態機器僅包含一個狀態,則其可以是開始和結束狀態。

分散式映射狀態的轉換

當您在分散式模式中使用 Map 狀態時,將針對分散式映射狀態啟動的每個子工作流程執行,向您收取一次狀態轉換的費用。當您在內嵌模式中使用 Map 狀態時,不會針對內嵌映射狀態的每個反覆運算收取狀態轉換費用。

您可以在分散式模式中使用 Map 狀態來最佳化成本,並在Map狀態定義中包含巢狀工作流程。當您啟動 Express 類型的子工作流程執行時,分散式映射狀態也會新增更多值。Step Functions 會儲存 Express 子工作流程執行的回應和狀態,這可減少在 CloudWatch 日誌中存放執行資料的需求。您也可以存取分散式映射狀態可用的流程控制,例如定義錯誤閾值或批次處理一組項目。如需 Step Functions 定價的資訊,請參閱AWS Step Functions 定價

步驟函數中的讀取一致性

中的狀態機器更新最終 AWS Step Functions 一致。幾秒鐘內的所有StartExecution呼叫都會使用更新的定義和 roleArn(IAM角色的 Amazon Resource Name)。如果在呼叫 UpdateStateMachine 後立即開始執行,則可能會使用先前的狀態機器定義和 roleArn

如需詳細資訊,請參閱下列內容: