本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
了解 Step Functions 中的狀態機器
Step Functions 是以狀態機器為基礎,也稱為工作流程。工作流程由一系列的事件驅動步驟組成。
您可以使用 Amazon States Language 定義工作流程,也稱為 ASL。您可以選擇使用視覺化工作流程設計工具 Workflow Studio 來建置和編輯工作流程。
工作流程中的每個步驟都稱為 狀態。狀態有兩種類型:流程狀態和任務狀態:
- 流程狀態
-
流程狀態控制步驟的執行流程。例如,選擇狀態提供條件式邏輯;等待狀態暫停工作流程執行;對應狀態會針對資料集中的每個項目執行子工作流程;而平行狀態會在工作流程中建立個別分支。
- 任務狀態
-
任務狀態代表另一個 AWS 服務執行的工作單位,例如呼叫另一個 AWS 服務 或 API。任務狀態也稱為動作。您可以選擇數百個動作來執行 AWS 和外部服務的工作。(注意:您也可以使用在 Step Functions 外執行的工作者來執行任務。 如需詳細資訊,請參閱 活動。)
![Step Functions 工作流程元件的說明性範例。](images/state-machine-conceptual-jsonata.png)
執行和處理錯誤
當您執行工作流程時,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的文字以及 欄位定義的工作流程,例如 如需詳細資訊,請參閱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 服務,您可以使用下列其中一種服務整合模式:
|
執行 |
狀態機器執行是您執行工作流程以執行任務的執行個體。 如需詳細資訊,請參閱在 Step Functions 中啟動狀態機器執行。 |
狀態機器資料
狀態機器資料的格式如下:
-
狀態機器的初始輸入
-
狀態之間傳遞的資料
-
來自狀態機器的輸出
本節將說明 AWS Step Functions會如何格式化和使用狀態機器的資料。
資料格式
狀態機器資料以JSON文字表示。您可以使用 支援的任何資料類型,將值提供給狀態機器JSON。
注意
狀態機器輸入/輸出
您可以透過兩種方式之一,將初始輸入資料提供給 AWS Step Functions 狀態機器。您可以在開始執行時將資料傳遞至StartExecution
動作。您也可以從 Step Functions 主控台StartAt
狀態。如果沒有提供輸入,預設會是空的物件 ({}
)。
執行的輸出會由最後狀態 (terminal
) 傳回。此輸出會在執行結果中顯示為JSON文字。
對於標準工作流程,您可以使用 DescribeExecution
動作等外部呼叫者從執行歷史記錄擷取執行結果。您可以在 Step Functions 主控台
對於快速工作流程,如果您啟用記錄,您可以從 CloudWatch 日誌擷取結果,或在 Step Functions 主控台中檢視和偵錯執行。如需詳細資訊,請參閱 使用 CloudWatch 日誌記錄 Step Functions 中的執行歷史記錄 和 在 Step Functions 主控台中檢視執行詳細資訊。
您也應該考慮與狀態機器相關的配額。如需詳細資訊,請參閱 Step Functions 服務配額
狀態輸入/輸出
每個狀態的輸入都包含來自上述狀態JSON的文字,或者對於 StartAt
狀態,輸入到執行中。某些流程控制狀態會將他們的輸入重複到他們的輸出中。
在以下範例中,狀態機器會同時新增兩個數字。
-
定義 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 }); }
-
定義 狀態機器。
{ "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 } } }
-
使用以下JSON文字開始執行。
{ "numbers": [3, 4] }
Add
狀態會接收JSON文字並將其傳遞給 Lambda 函數。Lambda 函數會將計算結果傳回 狀態。
狀態會在它的輸出中傳回以下值。
{ "result": 7 }
由於
Add
也是狀態機器中的最終狀態,此值會做為狀態機器的輸出傳回。如果最終狀態沒有傳回輸出,則狀態機器會傳回空的物件 (
{}
)。
如需詳細資訊,請參閱在 Step Functions 中處理輸入和輸出。
AWS Step Functions 從其他服務叫用
您可以設定數個其他服務來叫用狀態機器。根據狀態機器的工作流程類型,您可以非同步或同步叫用狀態機器。若要同步叫用狀態機器,請使用 StartSyncExecution
API呼叫或 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
。
如需詳細資訊,請參閱下列內容:
-
UpdateStateMachine
AWS Step Functions API參考中的