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

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

Choice

Choice状态向状态机添加状态向状态机添加状态机添加状态机添加状态机添加状态机添加状态机添加"Type": "Choice"

除了大多数常见的状态字段外,Choice状态还包含以下附加字段。

Choices (必需)

选项规则数组,确定状态机接下来转换为什么状态。在选择规则中使用比较运算符将输入变量与特定值进行比较。例如,使用选择规则,您可以比较输入变量是否大于或小于 100。

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

您必须在该Choice州定义至少一条规则。

Default (可选,建议)

Choices 中没有进行任何转换时,要转换为的状态的名称。

重要

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

要向您的部署Choice状态示例Amazon Web Services 账户,请参阅模块 5-Amazon Step Functions 工作室的选择状态和地图状态

选项规则

一个Choice状态必须有一个值为非空数组的Choices字段。此数组中的每个元素都是一个名为 Choice Rule 的对象,其中包含以下内容:

  • 比较-两个字段,用于指定要比较的输入变量、比较的类型以及要将变量与之比较的值。选择规则支持两个变量之间的比较。在选择规则中,可以通过附加到支持的比较运算符的名称Path来将变量的值与状态输入中的另一个值进行比较。

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

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

{ "Variable": "$.foo", "NumericEquals": 1, "Next": "FirstMatchState" }

以下示例检查字符串是否等于 MyString

{ "Variable": "$.foo", "StringEquals": "MyString", "Next": "FirstMatchState" }

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

{ "Variable": "$.foo", "StringGreaterThan": "MyStringABC", "Next": "FirstMatchState" }

以下示例检查字符串是否为 nununununununu

{ "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: “\\*”)。在匹配过程中,除 “*” 之外的任何字符都没有任何特殊含义。

选择状态示例

以下示例说明的是 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 FuncValueInTwenties tions 会根据value字段转换为状态。

如果 Choice 状态的 Choices 没有匹配,将改为运行 Default 字段中提供的状态。如果未指定 Default 状态,执行将失败,出现错误。