You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何停止AWS Step Functions定时执行实例并保障单实例运行?

解决Step Functions单实例运行及列出运行中实例的问题

一、确保同一时间仅一个实例运行

你的场景是定时触发的Step Functions可能同时运行多个实例,要实现“已有实例运行时,新触发的实例直接终止”,可以通过以下方案实现:

方案1:通过触发Lambda前置检查控制

  1. 替换直接触发方式:不要用CloudWatch Events直接触发Step Functions,而是触发一个中间Lambda函数,由它来控制Step Functions的启动逻辑。
  2. Lambda核心逻辑:
    • 调用Step Functions的list_executions API,传入你的状态机ARN,并指定statusFilter=RUNNING,获取当前所有运行中的实例。
    • 如果返回的运行实例列表不为空:
      • 若需求是直接放弃启动新实例,直接结束Lambda即可;
      • 若需求是启动新实例后立即终止它,先调用start_execution启动实例,再用返回的executionArn调用stop_execution终止该新实例。
    • 如果没有运行中的实例,直接调用start_execution启动Step Functions。

方案2:结合DynamoDB分布式锁(更可靠)

如果担心list_executions和start_execution之间的竞态问题(比如两个Lambda同时检查到无运行实例,同时启动),可以用DynamoDB做分布式锁:

  1. 创建一个DynamoDB表,主键设为stateMachineArn(字符串类型),额外添加executionArn和status字段。
  2. Lambda触发逻辑:
    • 尝试向DynamoDB表写入一条记录,使用条件表达式attribute_not_exists(stateMachineArn)(确保只有当没有对应记录时才写入)。
    • 写入成功:调用start_execution启动Step Functions,同时更新DynamoDB记录,填入新实例的executionArn和status=RUNNING。
    • 写入失败:说明已有运行实例,按需求放弃启动或启动后终止新实例。
  3. Step Functions流程最后添加一个Lambda任务:执行完成后,删除DynamoDB中对应的记录,或更新status=SUCCEEDED/FAILED,释放锁。

二、列出正在执行的Step Functions实例

方式1:AWS控制台

进入Step Functions控制台,找到你的状态机,切换到「Executions」标签,在筛选器中选择「Running」状态,即可看到所有正在运行的实例。

方式2:AWS CLI

执行以下命令:

aws stepfunctions list-executions --state-machine-arn "你的状态机ARN" --status-filter RUNNING

方式3:SDK调用(以Python boto3为例)

import boto3

client = boto3.client('stepfunctions')
response = client.list_executions(
    stateMachineArn='你的状态机ARN',
    statusFilter='RUNNING'
)
running_executions = response['executions']
print(running_executions)

内容的提问来源于stack exchange,提问作者Justin Seo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 23:15:35