Choice - AWS Step Functions

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

Choice

Choice態("Type": "Choice")將條件邏輯添加到狀態機。

除了大多數常見的狀態欄位之外,Choice狀態還包含下列其他欄位。

Choices (必要)

選擇規則陣列,該陣列可決定狀態機器接下來會轉換到哪個狀態。您可以在「選擇規則」中使用比較運算子來比較輸入變數與特定值。例如,使用「選擇規則」,您可以比較輸入變數是否大於或小於 100。

執行Choice狀態時,它會將每個選擇規則評估為 true 或 false。根據此評估的結果,「步驟函數」會轉換至工作流程中的下一個狀態。

您必須至少定義一個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" }

步驟函數會依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

對於這些運算子中的每一個,對應的值都必須是適當的類型:字串、數字、布林值或時間戳記。步驟函數不會嘗試將數值欄位與字串值相符。不過,由於時間戳記欄位邏輯上為字串,因此 StringEquals 比較子可以比對被視為時間戳記的欄位。

注意

基於相互操作性,請勿假設數字比較適用於 IEEE 754-2008 binary64 資料類型所代表量級或精確度以外的值。尤其是,範圍 [-253+1, 253-1] 之外的整數可能無法以預期的方式進行比較。

時間戳記 (例如 2016-08-18T17:33:00Z) 必須符合 RFC3339 設定檔 ISO 8601,以及進一步的限制:

  • 大寫字母 T 必須分開日期與時間部分。

  • 大寫字母 Z 必須表示不存在數字時間時區位移。

若要了解字串比較行為,請參閱 Java compareTo 文件

AndOr 運算子的值必須是本身不得包含 Next 欄位的非空白選擇規則陣列。同樣地,Not 運算子的值必須是不得包含 Next 欄位的單一選擇規則。

您可以使用 AndNotOr,建立複雜的巢狀選擇規則。不過,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 }

步驟函數轉換到ValueInTwenties狀態的基礎上,該value字段。

如果 Choice 狀態的 Choices 沒有相符項目,則會改為執行 Default 欄位中提供的狀態。如果未指定 Default 狀態,則執行會因錯誤而失敗。