Choice 工作流程状态 - Amazon Step Functions
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Choice 工作流程状态

管理状态和转换数据

Choice 状态 ("Type": "Choice") 向状态机添加条件逻辑。

除了大多数常用状态字段之外,Choice 状态还包含以下额外字段。

Choices(必填)

选项规则数组,确定状态机接下来转换为什么状态。您必须在 Choice 状态中至少定义一条规则。

运行Choice状态时,Step Functions 会将每条选择规则评估为真或假。根据结果,Step Functions 会过渡到工作流程中的下一个状态。

Default(可选,建议)

如果没有选择规则的评估结果为 true,则要过渡到的州的名称。

重要

Choice 状态不支持 End 字段。此外,它们仅在其 Choices 字段内部使用 Next

如果工作流程运行时没有任何 Ch oices 的评估结果为 true,也没有提供 Defa ul t,则状态机将由于无法过渡出状态而引发错误

选择规则 (JSONata)

一个Choice州的Choices字段的值必须是非空的 Choice Rules 数组,使用 JSONata时该数组包含以下字段:

  • Condition字段 — 计算结果为真/假的 JSONata 表达式。

  • Next字段 — 必须与状态机中的状态名称相匹配的值。

以下示例检查数值是否等于 1

{ "Condition": "{% $foo = 1 %}", "Next": "NumericMatchState" }

以下示例检查type变量是否等于local

{ "Condition": "{% $type = 'local' %}", "Next": "StringMatchState" }

以下示例检查字符串是否大于 MyStringABC

{ "Condition": "{% $foo > 'MyStringABC' %}", "Next": "StringGreaterMatchState" }

以下示例检查字符串是否不为空。

{ "Condition" : "{% $possiblyNullValue != null and $possiblyNullValue = 42 %}", "Next": "NotNullAnd42" }

选择规则 (JSONPath)

一个Choice州的Choices字段的值必须是非空的 Choice Rules 数组,使用 JSONPath时该数组包含以下字段:

  • 比较 – 两个字段,指定要比较的输入变量、比较的类型以及与变量进行比较的值。选项规则支持两个变量之间的比较。在选项规则中,通过在支持的比较运算符名称后附加 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 文档

AndOr 运算符的值必须为非空的选项规则数组,自身不能包含 Next 字段。与此类似,Not 运算符的值必须为单个选项规则,不能包含 Next 字段。

您可以使用 AndNotOr 创建复杂的嵌套选项规则。但是,Next 字段只能显示在顶级选项规则中。

可以使用比较运算符与带有一个或多个通配符(“*”)的模式进行字符串 StringMatches 比较。通配符使用标准的 \\ (Ex: “\\*”) 对进行转义。在匹配过程中,除了“*”以外,其他字符没有任何特殊含义。