亚马逊AWS官方博客

AWS Step Functions 添加了对“选择”状态的更新、对上下文对象的全局访问、动态超时、结果选择并为 Amazon States Languages 添加了内部函数

开发人员可以使用 AWS Step Functions 设计和执行工作流,这些工作流可将 AWS Lambda、AWS Fargate 和 Amazon SageMaker 等服务连接到丰富的应用程序。工作流由一系列步骤组成,其中一个步骤的输出是下一步骤的输入。使用 AWS Step Functions,应用程序开发变得更加直观,这使开发人员能够为每个应用程序配置一系列函数,例如 AWS Lambda 函数或在容器上开发的一组状态为无状态的函数。

今天,我们宣布通过更新 Amazon States Language (ASL) 来增强 AWS Step Functions。ASL 是一种基于 JSON 的结构化语言,用于定义状态机和可执行工作的状态集合(任务状态),确定要过渡到下一个状态的状态(选择状态),并在出错时停止执行(失败状态)。通过今天推出的更新,客户可以编写简化的工作流应用程序,提高状态机定义的灵活性,减少 lambd 调用,并减少状态过渡以节省成本。

如果您访问 AWS Step Functions 管理控制台,则会在定义步骤下看到新的代码段。

选择状态的更新

选择状态基本用于将分支逻辑添加到状态机。此更新添加了几个新的运算符,并提供了更多选择,使操作员可以简化现有定义或在状态机定义内添加动态行为。

  1. 比较运算符 – 支持测试以下值:
    IsNull – null
    ISString – 字符串
    IsNumeric – 数字
    IsBoolean – 布尔值
    IsTimestamp – 时间戳
    {
    "Variable": "$.foo",
    "IsNull|IsString|IsNumeric|IsBoolean|IsTimestamp": true|false
    }
  2. 存在性测试 – 支持测试特定字段是否存在。
    {
    "Variable": "$.foo",
    "IsPresent": true|false
    }
  3. 通配符 – 支持 shell“glob”样式通配符,以便客户能够测试 log-*.txt 或 *LATEST*
    {
    "Variable": "$.foo",
    "StringMatches": "log-*.txt"
    }
  4. 变量与变量比较 – 允许将一个输入字段与另一个输入字段进行比较。目前,选择状态允许与固定值进行比较。
    {
    "Variable": "$.foo",
    "StringEqualsPath": "$.bar"
    }

对上下文对象的全局访问

过去,只能在参数块中访问上下文对象,但通过此更新删除该限制,您可以灵活地引用参数块外部的上下文对象。现在,只要 ASL 允许 JSON 引用路径,就允许访问上下文对象。这将允许您访问以下字段中的上下文对象:

  •  InputPath
  • OutputPath
  • ItemsPath(处于映射状态)
  • 变量(处于选择状态)
  • ResultSelector
  • 变量与变量比较运算符

以下是对上下文对象的全局访问如何简化现有描述的示例。

动态超时

在此更新之前,ASL 可选择支持两个超时参数,即“TimeoutSeconds”和“HeartbeatSeconds”。如果任务的运行时间超过指定的秒数,则“TimeoutSeconds”将返回错误;如果任务的检测信号间隔超过指定的秒数,则“HeartbeatSeconds”将返回错误。某些应用程序希望将这些参数设置为随着时间的推移动态波动,您现在可以使用新的参数“TimeoutSecondsPath”和“HeartBeatSecondsPath”来实现这一点。

{
"Type": "Task",
"Resource": "arn:aws:states:::glue:startJobRun.sync",
"Parameters": {
"JobName": "GlueJob-JTrRO5l98qMG"
},
"TimeoutSecondsPath": "$.params.maxTime",
"HeartbeatSecondsPath": "$.params.heartBeat"
}

结果选择器

执行结果可能包括元数据以及有效负载。例如,调用 lambda 函数的任务状态将返回有效负载,但通过某些服务集成框架执行的调用可能会使用路径状态返回有效负载,从而导致客户需要再次筛选元数据。过去,如果不需要元数据,则必须使用另一种状态来处理它。这项新功能消除了对此操作的需要,并且还允许客户减小其有效负载大小。您可以添加参数样式对象,以帮助客户筛选任务状态输出并将感兴趣的字段传递到结果路径。

{
  "Type": "Task",
  "Resource": "arn:aws:states:::elasticmapreduce:createCluster.sync",
  "Parameters": {
    ...
  },
"ResultSelector": {
         "ClusterId.$": "$.output.ClusterId",
         "ResourceType.$": "$.resourceType"
  },

"ResultPath": "$.EMRoutput"
}

字符串构造

此更新使补充输入值和连接字符串成为可能。您还可以添加字符串构造函数以允许客户从输入构建字段值。

{
  "Parameters": {
    "foo.$": "States.Format('Hello, {} {}', $.firstName, $.lastName)"
  }
}

您只能将字符串用作可接受的数据类型。

JSON 转字符串和字符串转 JSON

当客户将输入提交给 DynamoDB 时,无法将对象更改为对象内的字符串,因此客户无法直接提交 JSON 对象,并且必须使用 Lambda 函数。通过此更新,客户可以直接将 JSON 转换为对象中的字符串。

{
  "Type": "Task",
  "Resource": "arn:aws:states:::some.future.integration:run.sync",
  "Parameters": {
    "FieldThatNeedsToBeAString.$": "States.JsonToString($.JSONInputField)",
  }
}

这也适用于另一种方式,即允许客户将字符串转换为 JSON,而无需调用外部 Lambda 函数。

{
"Type": "Task",
"Resource": "arn:aws:states:::some.future.integration:run.sync",
"Parameters": {
"FieldThatNeedsToBeJSON.$": "States.stringToJson($.EscapedInputField)"
}
}

状态数组

现在可以将状态设置为数组,以处理同一定义下的倍数。

"X": {
"Type": "Task",
"Resource": "arn:aws:lambda:us-east-1:123456789012:function:HelloWorld",
"Parameters": {
"PayloadString.$": "States.Format('[[{}]]', States.JsonToString($.in.summary))",
"CmdLine.$": "States.Array('--maxp', $.params.maxpr, '--minp', $.params.minpr)",
"ControlBlock.$": "States.StringToJson($.output.control)"
},
"Next": "AllDone"
}

现已推出

这些更新现已在提供 AWS Step Functions 的所有 AWS 区域(中国区域除外)推出。请访问我们的文档了解更多详细信息。

– Kame;