我可以创建一个 AWS Step Function,它不仅可以定义它所执行的步骤,还可以定义它在每个步骤中执行的代码吗?或者我是否需要有一个由步骤函数调用的单独资源来执行我的代码,例如 AWS Lambda?
一般来说,您不能直接在步骤函数的状态中托管代码。
如果您希望在某个状态中执行某些逻辑,通常会使用任务状态,并包含(在资源字段中)对该状态应执行的操作的引用。该操作可以是一个活动(它是一个工作线程(进程或线程),由您实现和托管,执行特定任务)、lambda 函数、其他支持的 AWS 服务或 HTTPS API。
任务状态(“Type”:“Task”)表示状态机执行的单个工作单元。任务通过使用活动或 AWS Lambda 函数、与其他支持的 AWS 服务集成或调用 HTTPS API(例如 Stripe)来执行工作。
也就是说,如果您的逻辑涉及将状态输入相对简单地转换为某些输出(例如字符串操作、过滤输入属性、引入额外的硬编码或计算属性等...),您可以使用 Pass状态,并在状态定义中包含将输入转换为输出的逻辑。
例如(取自此处):
您可以转换输入:
{
"georefOf": "Home"
}
输出:
{
"georefOf": "Home",
"coords": {
"x-datum": 0.381018,
"y-datum": 622.2269926397355
}
}
使用以下状态定义:
"No-op": {
"Type": "Pass",
"Result": {
"x-datum": 0.381018,
"y-datum": 622.2269926397355
},
"ResultPath": "$.coords",
"End": true
}
此外,步骤函数使用的 Amazon States Language 包含可用于转换输入的 JSONPath 内部函数。
例如,这样使用
States.Format
:
{
"Parameters": {
"foo.$": "States.Format('Your name is {}, we are in the year {}', $.name, 2020)"
}
}
您可以转换输入:
{
"name": "Foo",
"zebra": "stripe"
}
进入输出:
{
"foo": "Your name is Foo, we are in the year 2020"
}
您可以在此处找到支持的功能列表(示例取自那里)。