我在 C# CDK 中定义了一个 AWS 步骤函数,其中状态之一是如下定义的任务:
var executeGlueJobStepFunction = new CustomState(this, "ExecuteGlueJobStepFunction", new CustomStateProps
{
StateJson = new Dictionary<string, object>
{
{ "Type", "Task" },
{ "Resource", "arn:aws:states:::states:startExecution.sync:2" },
{ "Parameters", new Dictionary<string, object>
{
{ "StateMachineArn.$", JsonPath.Format($"arn:aws:states:{Stack.Of(this).Region}:{Stack.Of(this).Account}:stateMachine:{{}}", JsonPath.StringAt("$.stepFunctionName")) },
{ "Input.$", JsonPath.EntirePayload }
}
},
{ "ResultSelector", new Dictionary<string,object>
{
{ "Output.$", "$.Output" }
}
},
},
});
这将开始执行另一个步骤函数,触发粘合作业同步运行。
现在,当调用者步骤函数失败或中止时,子执行(和胶水作业运行)将继续完成。
有没有办法可以改变这种行为,以便在调用者步骤函数失败时终止子执行和粘合作业运行?
处理嵌套 Step Functions 执行时,向参数添加
StopNewExecution: true
解决了此问题。以下是您可以尝试修改 CDK 代码的方法:
var executeGlueJobStepFunction = new CustomState(this, "ExecuteGlueJobStepFunction", new CustomStateProps
{
StateJson = new Dictionary<string, object>
{
{ "Type", "Task" },
{ "Resource", "arn:aws:states:::states:startExecution.sync:2" },
{ "Parameters", new Dictionary<string, object>
{
{ "StateMachineArn.$", JsonPath.Format($"arn:aws:states:{Stack.Of(this).Region}:{Stack.Of(this).Account}:stateMachine:{{}}", JsonPath.StringAt("$.stepFunctionName")) },
{ "Input.$", JsonPath.EntirePayload },
{ "StopNewExecution", true } // This parameter does the trick
}
},
{ "ResultSelector", new Dictionary<string,object>
{
{ "Output.$", "$.Output" }
}
},
},
});
请注意,父级停止和子级执行/粘合作业终止之间可能存在轻微延迟。这在我们的生产环境中完美运行。
让我知道进展如何。