本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
管理狀態和轉換資料
Step Functions 最近新增了變數和 JSONata 來管理狀態和轉換資料。
了解如何使用變數傳遞資料,以及使用 JSONata 轉換資料。
Parallel
狀態 ("Type": "Parallel"
) 可用來在您的狀態機器中新增個別的執行分支。
除了常見狀態欄位以外,Parallel
狀態還引進下列額外欄位。
-
Branches
(必要) -
指定要以平行方式執行狀態機器的物件陣列。每個這類狀態機器物件必須具有名為
StartAt
和States
的欄位,其意義完全如同狀態機器最上層中的欄位。 Parameters
(選用,僅限 JSONPath)-
用來將資訊傳遞至
Branches
陣列中定義的狀態機器。 Arguments
(選用,僅限 JSONata)-
用來將資訊傳遞給已連線資源的 API 動作。值可以包含 JSONata 表達式。如需詳細資訊,請參閱在 Step Functions 中使用 JSONata 轉換資料。
Output
(選用,僅限 JSONata)-
用來指定和轉換 狀態的輸出。指定時,該值會覆寫狀態輸出預設值。
輸出欄位接受任何 JSON 值 (物件、陣列、字串、數字、布林值、 null)。如果被 {% %} 個字元包圍,則任何字串值,包括物件或陣列內的字串值,都將評估為 JSONata。
輸出也直接接受 JSONata 表達式,例如:「輸出」:「{% jsonata 表達式 %}」
如需詳細資訊,請參閱在 Step Functions 中使用 JSONata 轉換資料。
-
Assign
(選用) -
用來存放變數。
Assign
欄位接受 JSON 物件,其中包含定義變數名稱及其指派值的鍵/值對。任何字串值,包括物件或陣列內的值,在被{% %}
字元包圍時,都會評估為 JSONata如需詳細資訊,請參閱使用變數在狀態之間傳遞資料。
-
ResultPath
(選用,僅限 JSONPath) -
指定要將分支的輸出放置於何處 (在輸入中)。輸入會先依據
OutputPath
欄位 (如果有的話) 所指定篩選,而後做為狀態的輸出。如需詳細資訊,請參閱輸入和輸出處理。 -
ResultSelector
(選用,僅限 JSONPath) -
傳遞金鑰值對的集合,其中值是靜態的或從結果中選取。如需詳細資訊,請參閱ResultSelector。
-
Retry
(選用) -
稱為 Retrier 的物件陣列,這類物件可定義狀態發生執行時間錯誤時的重試政策。如需詳細資訊,請參閱使用重試和 Catch 的狀態機器範例。
-
Catch
(選用) -
稱為 Catcher 的物件陣列,這類物件可定義在狀態發生執行時間錯誤以及其重試政策已耗盡或未定義時執行的備用狀態。如需詳細資訊,請參閱備用狀態。
Parallel
狀態會導致 AWS Step Functions 執行每個分支,從該分支StartAt
欄位中名為 的狀態開始,並盡可能同時執行,等到所有分支終止 (到達終端機狀態) 後再處理Parallel
狀態Next
的欄位。
Parallel 狀態範例
{
"Comment": "Parallel Example.",
"StartAt": "LookupCustomerInfo",
"States": {
"LookupCustomerInfo": {
"Type": "Parallel",
"End": true,
"Branches": [
{
"StartAt": "LookupAddress",
"States": {
"LookupAddress": {
"Type": "Task",
"Resource": "arn:aws:lambda:us-east-1:123456789012:function:AddressFinder",
"End": true
}
}
},
{
"StartAt": "LookupPhone",
"States": {
"LookupPhone": {
"Type": "Task",
"Resource": "arn:aws:lambda:us-east-1:123456789012:function:PhoneFinder",
"End": true
}
}
}
]
}
}
}
在這個範例中,LookupAddress
和 LookupPhone
分支會以平行方式執行。以下是 Step Functions 主控台中的視覺化工作流程外觀。

每個分支必須可獨立自主運作。一個 Parallel
狀態分支中的狀態不得有以該分支外部欄位為目標的 Next
欄位,而且分支外部的任何其他狀態也不能轉移到該分支。
Parallel 狀態輸入和輸出處理
Parallel
狀態會為每個分支提供一份自有的輸入資料 (可由 InputPath
欄位隨時修改)。它會產生陣列形式的輸出,其中包含分支輸出的每個分支都有一個元素。所有元素不需要都是相同的類型。按照一般方式使用 ResultPath
欄位,即可將輸出陣列插入輸入資料中 (以及整個當作 Parallel
狀態的輸出傳送) (請參閱輸入和輸出處理)。
{
"Comment": "Parallel Example.",
"StartAt": "FunWithMath",
"States": {
"FunWithMath": {
"Type": "Parallel",
"End": true,
"Branches": [
{
"StartAt": "Add",
"States": {
"Add": {
"Type": "Task",
"Resource": "arn:aws:states:us-east-1:123456789012:activity:Add",
"End": true
}
}
},
{
"StartAt": "Subtract",
"States": {
"Subtract": {
"Type": "Task",
"Resource": "arn:aws:states:us-east-1:123456789012:activity:Subtract",
"End": true
}
}
}
]
}
}
}
如果 FunWithMath
狀態取得陣列 [3, 2]
做為輸入,則 Add
和 Subtract
狀態都會收到該陣列做為輸入。Add
和 Subtract
任務的輸出會是陣列元素 3 和 2 之間的總和和和差異,也就是 5
和 1
,而 Parallel
狀態的輸出會是陣列。
[ 5, 1 ]
提示
如果您在狀態機器中使用的平行或映射狀態傳回陣列陣列,您可以使用 ResultSelector 欄位將其轉換為平面陣列。如需詳細資訊,請參閱平面化陣列陣列。
錯誤處理
如有任何分支因為未處理的錯誤或經由轉移到 Fail
狀態而失敗,則整個 Parallel
狀態會被視為失敗,而且其所有分支都會停止。如果錯誤不是由Parallel
狀態本身處理,Step Functions 會以錯誤停止執行。
注意
當平行狀態失敗時,調用 Lambda 函數會繼續執行,而且處理任務權杖的活動工作者不會停止。
-
若要停止長時間執行的活動,請使用活動訊號來偵測 Step Functions 是否已停止其分支,並停止正在處理任務的工作者。如果狀態失敗,則呼叫
SendTaskHeartbeat
、SendTaskSuccess
或SendTaskFailure
會拋出錯誤。請參閱活動訊號錯誤。 -
無法停止執行 Lambda 函數。如果您已實作後援,請使用
Wait
狀態,以便在 Lambda 函數完成後進行清除工作。