如何停止AWS Step Functions定时执行实例并保障单实例运行?
解决Step Functions单实例运行及列出运行中实例的问题
一、确保同一时间仅一个实例运行
你的场景是定时触发的Step Functions可能同时运行多个实例,要实现“已有实例运行时,新触发的实例直接终止”,可以通过以下方案实现:
方案1:通过触发Lambda前置检查控制
- 替换直接触发方式:不要用CloudWatch Events直接触发Step Functions,而是触发一个中间Lambda函数,由它来控制Step Functions的启动逻辑。
- Lambda核心逻辑:
- 调用Step Functions的
list_executionsAPI,传入你的状态机ARN,并指定statusFilter=RUNNING,获取当前所有运行中的实例。 - 如果返回的运行实例列表不为空:
- 若需求是直接放弃启动新实例,直接结束Lambda即可;
- 若需求是启动新实例后立即终止它,先调用
start_execution启动实例,再用返回的executionArn调用stop_execution终止该新实例。
- 如果没有运行中的实例,直接调用
start_execution启动Step Functions。
- 调用Step Functions的
方案2:结合DynamoDB分布式锁(更可靠)
如果担心list_executions和start_execution之间的竞态问题(比如两个Lambda同时检查到无运行实例,同时启动),可以用DynamoDB做分布式锁:
- 创建一个DynamoDB表,主键设为
stateMachineArn(字符串类型),额外添加executionArn和status字段。 - Lambda触发逻辑:
- 尝试向DynamoDB表写入一条记录,使用条件表达式
attribute_not_exists(stateMachineArn)(确保只有当没有对应记录时才写入)。 - 写入成功:调用
start_execution启动Step Functions,同时更新DynamoDB记录,填入新实例的executionArn和status=RUNNING。 - 写入失败:说明已有运行实例,按需求放弃启动或启动后终止新实例。
- 尝试向DynamoDB表写入一条记录,使用条件表达式
- 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
相关产品推荐
相关产品推荐

