如何以编程方式告知AWS步骤函数执行已完成



我正在通过SageMaker笔记本中的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步骤函数中同时执行,但我希望避免创建任何新的aws资源,为此,我希望在笔记本中做所有事情。

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

基于注释。

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

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

最新更新