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

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

Choice

Choice 状态 ("Type": "Choice") 向状态机添加分支逻辑。

除了大多数公共状态字段Choice状态引入了以下额外字段。

Choices (必需)

选项规则数组,确定状态机接下来转换为什么状态。

Default (可选,建议)

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

重要

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

选择状态示例

以下示例说明的是 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 状态,执行将失败,出现错误。

选项规则

Choice 状态必须有一个值是非空数组的 Choices 字段,数组的每个元素是一个称为“选项规则”的对象。选项规则包含以下内容:

  • Acomparison— 两个字段,指定要比较的输入变量、比较的类型以及与变量进行比较的值。选择规则支持两个变量之间的比较。在选择规则中,可将变量值与状态输入中的另一个值进行比较,方法是附加Path设置为支持的比较运算符的名称。

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

以下示例检查数值是否等于 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 }

以下示例说明如何仅在以下情况下评估字 StringEquals 规则:$.keyThatMightNotExist存在的原因是前面的IsPresent选择规则。

"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 字段只能显示在顶级选项规则中。

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