如何以编程方式告知 AWS Step Function 执行已完成?

How to tell programmatically that an AWS Step Function execution has been completed?

我正在通过 SageMaker Notebook 中的 Python 单元触发 Step Function 执行,如下所示:

state_machine_arn = 'arn:aws:states:us-west-1:1234567891:stateMachine:alexanderMyPackageStateMachineE3411O13-A1vQWERTP9q9'
sfn = boto3.client('stepfunctions')
..
sfn.start_execution(**kwargs)  # Non Blocking Call
run_arn = response['executionArn']
print(f"Started run {run_name}. ARN is {run_arn}.")

然后为了检查执行(根据输入可能需要数小时才能完成)已经完成,在我开始对结果进行一些自定义 post 分析之前,我手动执行一个单元格:

response = sfn.list_executions(
    stateMachineArn=state_machine_arn,
    maxResults=1
)
print(response)

我可以从输出中看到执行状态,例如'status': 'RUNNING'.

如何实现自动化,即触发 Step Function 并仅在执行完成后继续执行我的 post-analysis 自定义逻辑?例如,是否有启动执行的阻塞调用,或我可以使用的回调方法?

我能想到放一个sleep方法,让PythonNotebook cell会周期性的调用list_executions()查看状态,只有执行完了才继续休息代码。我可以统计确定睡眠时间,但我想知道是否有 simpler/more 准确的方法。


PS:相关:How to avoid simultaneous execution in aws step function,但是我想避免创建任何新的 AWS 资源,为此,我想在笔记本中做所有事情。

PPS:我无法对 MyPackage 和 Step Function 定义进行任何更改。

根据评论。

如果不允许创建新资源(没有 CloudWatch 事件规则、lambda 函数),也不允许对现有 Step Function 进行任何更改,则 迭代池化 list_executions将是最好的解决方案。

A​​WS CLI 和 boto3 已经实现了类似的解决方案(不是针对 Step Functions),而是针对其他一些服务。它们被称为 waiters(例如 ec2 waiters)。所以基本上你必须为 Step Function 创建你自己的 waiter,因为 AWS 没有为此提供一个。 AWS 使用 15 秒 的睡眠时间,我记得它的服务员。