本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
選擇工作流狀態
狀Choice
態("Type": "Choice"
)將條件邏輯添加到狀態機。
除了大多數常見的狀態欄位之外,Choice
狀態還包含下列其他欄位。
Choices
(必要)-
選擇規則陣列,該陣列可決定狀態機器接下來會轉換到哪個狀態。您可以在「選擇規則」中使用比較運算子來比較輸入變數與特定值。例如,使用「選擇規則」,您可以比較輸入變數是否大於或小於 100。
執行
Choice
狀態時,它會將每個選擇規則評估為 true 或 false。根據此評估的結果,「Step Functions」會轉換至工作流程中的下一個狀態。您必須至少定義一個
Choice
狀態中的規則。 Default
(選用、建議)-
如果未採用
Choices
中的任何轉換,則為狀態轉換至的名稱。
重要
Choice
狀態不支援 End
欄位。此外,這類狀態只會在其 Choices
欄位內使用 Next
。
提示
若要部署使用Choice
狀態的工作流程範例 AWS 帳戶,請參閱模組 5- AWS Step Functions 工作坊的選擇狀態和對
選擇規則
Choice
狀態必須有一個Choices
字段,其值是一個非空數組。此陣列中的每個元素都是稱為 Choice Rule 的物件,其中包含下列項目:
-
比較 — 指定要比較之輸入變數的兩個欄位、比較類型以及要比較變數的值。選擇規則支援兩個變數之間的比較。在選擇規則中,透過附加
Path
至支援的比較運算子名稱,可以將變數的值與狀態輸入中的另一個值進行比較。比較中Variable
和「路徑」欄位的值必須是有效的「參考路徑」。 -
Next
欄位 — 此欄位的值必須與狀態機器中的狀態名稱相符。
以下範例會檢查數值是否等於 1
。
{
"Variable": "$.foo",
"NumericEquals": 1,
"Next": "FirstMatchState"
}
以下範例會檢查字串是否等於 MyString
。
{
"Variable": "$.foo",
"StringEquals": "MyString",
"Next": "FirstMatchState"
}
以下範例會檢查字串是否大於 MyStringABC
。
{
"Variable": "$.foo",
"StringGreaterThan": "MyStringABC",
"Next": "FirstMatchState"
}
下列範例會檢查字串是否為 null。
{
"Variable": "$.possiblyNullValue",
"IsNull": true
}
下列範例顯示如何僅$.keyThatMightNotExist
在因前面的IsPresent
選擇 StringEquals 規則而存在時評估規則。
"And": [
{
"Variable": "$.keyThatMightNotExist",
"IsPresent": true
},
{
"Variable": "$.keyThatMightNotExist",
"StringEquals": "foo"
}
]
下列範例會檢查具有萬用字元的模式是否相符。
{ "Variable": "$.foo", "StringMatches": "log-*.txt" }
以下範例會檢查時間戳記是否等於 2001-01-01T12:00:00Z
。
{
"Variable": "$.foo",
"TimestampEquals": "2001-01-01T12:00:00Z",
"Next": "FirstMatchState"
}
下列範例會比較變數與 state 輸入中的另一個值。
{ "Variable": "$.foo", "StringEqualsPath": "$.bar" }
Step Functions 會依Choices
欄位中列出的順序檢查每個選擇規則。然後轉換為第一個「選擇規則」的 Next
欄位中指定的狀態,在該規則中變數會根據比較運算子來比對值。
支援下列比較運算子:
-
And
-
BooleanEquals
,BooleanEqualsPath
-
IsBoolean
-
IsNull
-
IsNumeric
-
IsPresent
-
IsString
-
IsTimestamp
-
Not
-
NumericEquals
,NumericEqualsPath
-
NumericGreaterThan
,NumericGreaterThanPath
-
NumericGreaterThanEquals
,NumericGreaterThanEqualsPath
-
NumericLessThan
,NumericLessThanPath
-
NumericLessThanEquals
,NumericLessThanEqualsPath
-
Or
-
StringEquals
,StringEqualsPath
-
StringGreaterThan
,StringGreaterThanPath
-
StringGreaterThanEquals
,StringGreaterThanEqualsPath
-
StringLessThan
,StringLessThanPath
-
StringLessThanEquals
,StringLessThanEqualsPath
-
StringMatches
-
TimestampEquals
,TimestampEqualsPath
-
TimestampGreaterThan
,TimestampGreaterThanPath
-
TimestampGreaterThanEquals
,TimestampGreaterThanEqualsPath
-
TimestampLessThan
,TimestampLessThanPath
-
TimestampLessThanEquals
,TimestampLessThanEqualsPath
對於這些運算子中的每一個,對應的值都必須是適當的類型:字串、數字、布林值或時間戳記。Step Functions 數不會嘗試將數值欄位與字串值相符。不過,由於時間戳記欄位邏輯上為字串,因此 StringEquals
比較子可以比對被視為時間戳記的欄位。
注意
為了達到互通性,請勿假設數值比較與 IEEE754-2008 binary64
資料類型[-253+1,
253-1]
之外的整數可能無法以預期的方式進行比較。
時間戳記 (例如2016-08-18T17:33:00Z
) 必須符合RFC3339設定檔 ISO 8601
-
大寫字母
T
必須分開日期與時間部分。 -
大寫字母
Z
必須表示不存在數字時間時區位移。
若要了解字串比較行為,請參閱 Java compareTo
文件
And
和 Or
運算子的值必須是本身不得包含 Next
欄位的非空白選擇規則陣列。同樣地,Not
運算子的值必須是不得包含 Next
欄位的單一選擇規則。
您可以使用 And
、Not
及 Or
,建立複雜的巢狀選擇規則。不過,Next
欄位只能出現在最上層選擇規則中。
您可以使用比較運算子,對具有一或多個萬用字元 (「*」) 的樣式執行字串 StringMatches 比較。萬用字元會使用標準逸出\\ (Ex: “\\*”)
。在比對期間,除了「*」之外,沒有任何特殊意義。
Choice 狀態範例
以下是 Choice
狀態的範例,以及它轉換至的其他狀態。
注意
您必須指定 $.type
欄位。如果狀態輸入不包含 $.type
欄位,則執行會失敗,且執行歷史記錄中會顯示一項錯誤。您只能在與常值相符的StringEquals
欄位中指定字串。例如:"StringEquals": "Buy"
。
"ChoiceStateX": {
"Type": "Choice",
"Choices": [
{
"Not": {
"Variable": "$.type",
"StringEquals": "Private"
},
"Next": "Public"
},
{
"Variable": "$.value",
"NumericEquals": 0,
"Next": "ValueIsZero"
},
{
"And": [
{
"Variable": "$.value",
"NumericGreaterThanEquals": 20
},
{
"Variable": "$.value",
"NumericLessThan": 30
}
],
"Next": "ValueInTwenties"
}
],
"Default": "DefaultState"
},
"Public": {
"Type" : "Task",
"Resource": "arn:aws:lambda:us-east-1:123456789012:function:Foo",
"Next": "NextState"
},
"ValueIsZero": {
"Type" : "Task",
"Resource": "arn:aws:lambda:us-east-1:123456789012:function:Zero",
"Next": "NextState"
},
"ValueInTwenties": {
"Type" : "Task",
"Resource": "arn:aws:lambda:us-east-1:123456789012:function:Bar",
"Next": "NextState"
},
"DefaultState": {
"Type": "Fail",
"Cause": "No Matches!"
}
在此範例中,狀態機器會從下列輸入值著手。
{
"type": "Private",
"value": 22
}
Step Functions 轉換到ValueInTwenties
狀態的基礎上,該value
字段。
如果 Choice
狀態的 Choices
沒有相符項目,則會改為執行 Default
欄位中提供的狀態。如果未指定 Default
狀態,則執行會因錯誤而失敗。