本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
Choice
Choice
状态 ("Type": "Choice"
) 向状态机添加条件逻辑。
除了大多数常用状态字段之外,Choice
状态还包含以下额外字段。
Choices
(必填)-
选项规则数组,确定状态机接下来转换为什么状态。在选择规则中使用比较运算符可将输入变量与特定值进行比较。例如,使用选择规则,您可以比较输入变量是大于还是小于 100。
运行
Choice
状态时,它会将每个选择规则评估为 true 或 false。根据评估结果,Step Functions 会转换到工作流中的下一个状态。您必须在
Choice
状态中至少定义一条规则。 Default
(可选,建议)-
在
Choices
中没有进行任何转换时,要转换为的状态的名称。
重要
Choice
状态不支持 End
字段。此外,它们仅在其 Choices
字段内部使用 Next
。
提示
要在您的 AWS 账户中部署使用 Choice
状态的工作流示例,请参阅《AWS Step Functions 研讨会》中的模块 5 - Choice 状态和 Map 状态
选项规则
一个 Choice
状态必须有一个值为非空数组的 Choices
字段。此数组中的每个元素都是一个名为“选项规则”的对象,其中包含以下内容:
-
比较 – 两个字段,指定要比较的输入变量、比较的类型以及与变量进行比较的值。选项规则支持两个变量之间的比较。在选项规则中,通过在支持的比较运算符名称后附加
Path
,可以将变量值与状态输入中的另一个值进行比较。比较中的Variable
和路径字段的值必须是有效的参考路径。 -
Next
字段 – 此字段的值必须与状态机中的状态名称匹配。
以下示例检查数值是否等于 1
。
{
"Variable": "$.foo",
"NumericEquals": 1,
"Next": "FirstMatchState"
}
以下示例检查字符串是否等于 MyString
。
{
"Variable": "$.foo",
"StringEquals": "MyString",
"Next": "FirstMatchState"
}
以下示例检查字符串是否大于 MyStringABC
。
{
"Variable": "$.foo",
"StringGreaterThan": "MyStringABC",
"Next": "FirstMatchState"
}
以下示例检查字符串是否为空。
{
"Variable": "$.possiblyNullValue",
"IsNull": true
}
以下示例显示了由于前面的 IsPresent
选项规则,StringEquals 规则仅 $.keyThatMightNotExist
存在时才会被评估。
"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"
}
以下示例将变量与状态输入中的另一个值进行比较。
{ "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
运算符匹配。
注意
为了实现互操作性,请不要假定数值比较可用于超出 IEEE 754-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
状态及其转换为的其他状态。
注意
您必须指定 $.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 基于 value
字段转换为 ValueInTwenties
状态。
如果 Choice
状态的 Choices
没有匹配,将改为运行 Default
字段中提供的状态。如果未指定 Default
状态,执行将失败,出现错误。