如何使用CDK在AWS步骤函数中多次使用任务状态?



例如我有3个lambdas:

sfn_step_1 = tasks.LambdaInvoke(self, "1st-one",
lambda_function=1st-one ,
output_path="$.Payload",
payload=stepfunctions.TaskInput.from_object({
"payload.$": "$",

})
)

sfn_step_2 = tasks.LambdaInvoke(self, "2nd-One",
lambda_function=2nd-One,
output_path="$.Payload",
payload=stepfunctions.TaskInput.from_object({
"payload.$": "$",

})
)

sfn_step_3 = tasks.LambdaInvoke(self, "3rd-one",
lambda_function=3rd-one,
output_path="$.Payload",
payload=stepfunctions.TaskInput.from_object({
"payload.$": "$",

})
)

我想重用状态2和3各两次:1 -> 2 -> 3 -> 2 -> 3

所以我试着这样做:

state_machine_definition = sfn_step_1.next(sfn_step_2).next(sfn_step_3).next(sfn_step_2).
next(sfn_step_3)

但是我遇到了这个问题:

jsii.errors.JSIIError: State '2nd-One' already has a next state

实际上是告诉Step Functions在步骤2和步骤3之间无限循环。这是无效的。因此出现错误:任务状态只能有一个"下一个";(出站)路径。幸运的是,您可以简单地解决您的问题,而不需要递归。

写一个工厂函数,返回一个Lambda Task,传递一个id和函数引用。多次调用工厂函数来构建状态机。这使您可以DRY重复任务而无需递归。

# Task Factory
def make_step(id: str, func: _lambda.Function) -> tasks.LambdaInvoke:
return tasks.LambdaInvoke(
self,
id,
lambda_function=func,
payload_response_only=True,
result_path=f"$.{id}",
)
sfn.StateMachine(
self,
"RepeatStepsMachine",
definition=make_step("step_1", 1st_One)
.next(make_step("step_2", 2nd_One))
.next(make_step("step_3", 3rd_One))
.next(make_step("step_2b", 2nd_One))
.next(make_step("step_3b", 3rd_One).next(sfn.Succeed(self, "Done"))),
)

*如果需要,递归可以通过选择状态实现。选择状态被设计为具有多个"出站"。路径。但是,它不是最适合您的用例的。

最新更新