Amazon web services AWS Step函数是否具有超时功能?
现在我有一个AWS Step函数来创建、运行和终止EMR集群作业。我想添加一个超时功能,以便在群集卡住或运行时间过长的情况下停止作业并终止群集(例如,输入变量Amazon web services AWS Step函数是否具有超时功能?,amazon-web-services,aws-step-functions,Amazon Web Services,Aws Step Functions,现在我有一个AWS Step函数来创建、运行和终止EMR集群作业。我想添加一个超时功能,以便在群集卡住或运行时间过长的情况下停止作业并终止群集(例如,输入变量“timeout\u AFTER\u X\u HOURS”:12与群集配置一起传递到状态机,群集配置将自动停止作业并在12小时后仍在运行时终止群集)。有人知道如何做到这一点吗?不幸的是,您不能动态地指定某个状态的超时,但您可以动态地告诉等待状态它应该等待多长时间。话虽如此,我建议您使用具有两个分支和catch块的并行状态。第一个分支包含等待
“timeout\u AFTER\u X\u HOURS”:12
与群集配置一起传递到状态机,群集配置将自动停止作业并在12小时后仍在运行时终止群集)。有人知道如何做到这一点吗?不幸的是,您不能动态地指定某个状态的超时,但您可以动态地告诉等待状态它应该等待多长时间。话虽如此,我建议您使用具有两个分支和catch块的并行状态。第一个分支包含等待状态和失败状态(超时)。另一个分支包含正常状态机逻辑和故障状态
每当一个分支在并行状态内失败时,它就会中止其他分支中的所有运行状态。幸运的是,您能够在并行状态下捕获这些错误,并根据哪个分支失败将其重定向到另一个状态。下面是我的意思示例(更改HardCodedInputs状态中的值以控制哪个分支失败)
我面临着一个类似的问题,我认为解决方案将是创建一个管理EMR的外部状态机和一个执行该工作的内部状态机 因此:
- 创建电子病历
- 在每个输入变量的任务上设置
调用子状态机TimeoutSeconds
- 终止电子病历
- 执行电子病历工作
因此,内部机器将在成功完成或已过
TimeoutSeconds
后返回,并且在外部机器中,您可以检测哪个(使用Catch
状态捕捉状态。Timeout
错误)并相应地采取行动。您可以将路径传递给输入变量(例如“$.TIMEOUT\u AFTER_X_HOURS”(原始示例中的
)到任何任务的TimeoutSecondPath参数。这将允许您根据之前步骤的状态机输入或输出动态设置步骤超时
你可以在这里找到
timeoutsecondpath
参数的官方文档:谷歌的第一个链接你显然不明白我在问什么,你的链接没有帮助。我希望整个状态机/emr集群都有超时功能,而不是像你链接中那样的每个单独任务。我还希望超时长度由用户输入参数管理,而不是像链接中那样在任务中硬编码的值。TimeoutSeconds(可选)-这就是如何为整个机器定义超时的方法,因此您可以在启动前生成模板,从而设置整个超时谢谢。我使用硬编码的超时值进行此操作,但是您知道是否可以通过输入参数设置超时值,例如使用输入参数开始执行”timeout“:600
并将状态机设置为“TimeoutSeconds”:“$.timeout”
由于“TimeoutSeconds”,我不确定如何执行此操作“
似乎只接受硬编码的整数值。另外,我将使用状态机运行EMR群集,您知道在超时发生时,是否可以将状态机指向特定任务,而不是让状态机在任何地方停止?我想让它指向一个任务,在这个任务中,我可以编写一个lambda函数,或者在状态机超时时终止正在运行的EMR集群,在一个非常复杂的状态机上成功地使用了这种方法,我有4个可能的分支可以停止给定的处理。不幸的是,本机并行程序没有“when any”选项,因为这样可以避免将异常用作控制流。步骤函数现在支持从状态输入路径添加动态超时。请参阅下面@George Novack的答案。我认为这是截至2021年的正确和最新答案。
{
"StartAt": "HardCodedInputs",
"States": {
"HardCodedInputs": {
"Type": "Pass",
"Parameters": {
"WaitBranchInput": {
"timeout": 5,
"Comment": "Change the value of timeout"
},
"WorkerBranchInput": {
"SecondsPath": 3,
"Comment": "SecondsPath is used for testing purposes to simulate how long the worker will run"
}
},
"Next": "Parallel"
},
"Parallel": {
"Type": "Parallel",
"End": true,
"Catch": [{
"ErrorEquals": ["TimeoutExpired"],
"ResultPath": "$.ParralelStateOutput",
"Next": "ExecuteIfTimedOut"
}, {
"ErrorEquals": ["WorkerSuccess"],
"ResultPath": "$.ParralelStateOutput",
"Next": "ExecuteIfWorkerSuccesfull"
}],
"Branches": [{
"StartAt": "DynamicTimeout",
"States": {
"DynamicTimeout": {
"Type": "Wait",
"InputPath": "$.WaitBranchInput",
"SecondsPath": "$.timeout",
"Next": "TimeoutExpired"
},
"TimeoutExpired": {
"Type": "Fail",
"Cause": "TimeoutExceeded.",
"Error": "TimeoutExpired"
}
}
},
{
"StartAt": "WorkerState",
"States": {
"WorkerState": {
"Type": "Wait",
"InputPath": "$.WorkerBranchInput",
"SecondsPath": "$.SecondsPath",
"Next": "WorkerSuccessful"
},
"WorkerSuccessful": {
"Type": "Fail",
"Cause": "Throw Worker Success Exception",
"Error": "WorkerSuccess"
}
}
}
]
},
"ExecuteIfTimedOut": {
"Type": "Pass",
"End": true
},
"ExecuteIfWorkerSuccesfull": {
"Type": "Pass",
"End": true
}
}
}