首页 > 解决方案 > 如何以编程方式告知 AWS Step Function 执行已完成?

问题描述

我通过 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}.")

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

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

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

我怎样才能自动执行此操作,即仅在执行完成后触发 Step Function 并继续执行我的分析后自定义逻辑?例如,是否有一个阻塞调用来开始执行,或者我可以使用一个回调方法?

我可以考虑放一个 sleep 方法,这样 Python Notebook 单元会定期调用list_executions()并检查状态,只有在执行完成后,才能继续其余代码。我可以统计确定睡眠时间,但我想知道是否有更简单/更准确的方法。


PS:相关:如何避免在 aws step function 中同时执行,但是我想避免创建任何新的 AWS 资源,为此,我想在笔记本中做所有事情。

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

标签: pythonamazon-web-servicesasynchronousamazon-sagemakeraws-step-functions

解决方案


根据评论。

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

AWS CLI 和 boto3 已经实施了类似的解决方案(不是针对 Step Functions),而是针对其他一些服务。他们被称为waiters(例如ec2 waiters)。因此,基本上您必须为 Step Function创建自己的服务员,因为 AWS 没有为此提供服务员。据我回忆, AWS为其服务员使用了15 秒的睡眠时间。


推荐阅读