Amazon web services AWS Step函数是否具有超时功能?

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块的并行状态。第一个分支包含等待

现在我有一个AWS Step函数来创建、运行和终止EMR集群作业。我想添加一个超时功能,以便在群集卡住或运行时间过长的情况下停止作业并终止群集(例如,输入变量
“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
    }
 }
}