首页 > 解决方案 > 在 AWS Step Functions (boto3) 中获取任务状态

问题描述

我目前正在使用 boto3(适用于 Python 的 Amazon Web Services (AWS) 开发工具包)来创建状态机、开始执行以及在我的工作人员中检索任务并报告其状态(成功完成或失败)。

我有另一个需要知道任务状态的服务,我想通过从 AWS 检索它来做到这一点。我搜索了可用的方法,只能获取整个状态机/执行的状态(RUNNING|SUCCEEDED|FAILED|TIMED_OUT|ABORTED)。

还有 get_execution_history 方法,但每个步骤都由一个按顺序编号的 id 标识,并且没有关于任务本身的信息(仅在“stateEnteredEventDetails”事件中,其中存在任务名称,但后续事件可能不会与它相关,因此无法知道任务是否成功)。

是否真的无法检索特定任务的状态,或者我错过了什么?

谢谢!

标签: amazon-web-servicesboto3aws-step-functions

解决方案


我遇到了同样的问题,似乎步骤函数没有将状态和任务视为实体,因此没有 API 可以获取有关它们的信息。

为了获取有关任务状态的信息,您需要解析执行历史记录中的信息。就我而言,我首先检查执行状态:

import boto3
import json
client = boto3.client("stepfunctions")

response = client.describe_execution(
    executionArn=EXECUTION_ARN
)
status = response["status"]

如果它是“FAILED”,那么我分析历史并获取与我的用例最相关的字段(对于“TaskFailed”类型的事件):

response = client.get_execution_history(
    executionArn=EXECUTION_ARN,
    maxResults=1000
)
events = response["events"]

while response.get("nextToken"):
    response = client.get_execution_history(
        executionArn=EXECUTION_ARN,
        maxResults=1000,
        nextToken=response["nextToken"]
    )
    events += response["events"]
causes = [
    json.loads(e["taskFailedEventDetails"]["cause"])
    for e in events
    if e["type"] == "TaskFailed"
]

return [
    {
        "ClusterArn": cause["ClusterArn"],
        "Containers": [
            {
                "ContainerArn": container["ContainerArn"],
                "Name": container["Name"],
                "ExitCode": container["ExitCode"],
                "Overrides": cause["Overrides"]["ContainerOverrides"][i]
            }
            for i, container in enumerate(cause["Containers"])
        ],
        "TaskArn": cause["TaskArn"],
        "StoppedReason": cause["StoppedReason"]
    }
    for cause in causes
]


推荐阅读