【问题标题】:How to tell programmatically that an AWS Step Function execution has been completed?如何以编程方式告知 AWS Step Function 执行已完成?
【发布时间】:2021-04-16 09:53:03
【问题描述】:

我正在通过 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:相关:How to avoid simultaneous execution in aws step function,但是我想避免创建任何新的 AWS 资源,为此,我想在 Notebook 中做所有事情。

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

【问题讨论】:

  • 如果您不想创建任何新内容(例如 CloudWatch 事件规则、lambda 等),那么将 list_executions 合并到一个循环中是您的解决方案。
  • @Marcin 你的意思是在一个带有睡眠方法的循环中,对吧?太棒了,非常感谢,因为这也是我的理解!

标签: python amazon-web-services asynchronous amazon-sagemaker aws-step-functions


【解决方案1】:

基于 cmets。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-14
    • 2021-06-03
    • 2023-02-10
    相关资源
    最近更新 更多