python - 如何以编程方式告知 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 定义进行任何更改。
解决方案
根据评论。
如果不允许创建新资源(不允许 CloudWatch Event 规则、lambda 函数),也不允许对现有 Step Function 进行任何更改,那么迭代池 list_executions
化将是最佳解决方案。
AWS CLI 和 boto3 已经实施了类似的解决方案(不是针对 Step Functions),而是针对其他一些服务。他们被称为waiters
(例如ec2 waiters)。因此,基本上您必须为 Step Function创建自己的服务员,因为 AWS 没有为此提供服务员。据我回忆, AWS为其服务员使用了15 秒的睡眠时间。
推荐阅读
- wordpress - 如何在 localhost xampp 从 WordPress 发送邮件?
- android - 智能手机和桌面应用程序通信技术和跨平台框架
- java - Drawable 在 Android 5 及更低版本上崩溃
- javascript - 如何使 div 遵循弯曲的轨迹?
- list - 尝试打开列表时出错:SyntaxError:行继续符后出现意外字符
- azure - 如何查询 azure hdinsight hadoop cluster yarn 时间线服务器
- associations - MyBatis 关联无列
- c++ - MSVC 将仅移动结构参数解释为指针
- php - 在 PHP 中使用 xPath:loadXml 没有正确插入文本
- asp.net - 调用 Excel.Interop 的异常