AWS Step Functions:sfn.ListExecutions无法正确显示运行中执行实例
问题场景
我用Go代码实现了停止某状态机所有RUNNING执行实例的功能,代码如下:
func stopAllExecutions(sfnSvc *sfn.SFN, stateMachineArn string) error { var nextToken *string // Since ListExecutionsInput only supports up to 1000 results per query, create loop to delete all executions for { executionsInput := &sfn.ListExecutionsInput{ StateMachineArn: aws.String(stateMachineArn), MaxResults: aws.Int64(1000), NextToken: nextToken, StatusFilter: aws.String("RUNNING"), } executions, err := sfnSvc.ListExecutions(executionsInput) if err != nil {return err} for _, execution := range executions.Executions { if *execution.Status == "RUNNING" { _, err := sfnSvc.StopExecution(&sfn.StopExecutionInput{ ExecutionArn: execution.ExecutionArn, }) if err != nil { return err } } } // If NextToken is not set, there are no more results to retrieve if executions.NextToken == nil { break } nextToken = executions.NextToken } return nil }
运行代码后无报错,立即再次执行代码时显示没有RUNNING实例,AWS控制台也看不到相关执行;但执行AWS CLI命令:
aws stepfunctions list-executions --state-machine-arn $STATE_MACHINE_ARN --status-filter RUNNING --output text
仍显示有数千个RUNNING状态的执行实例。
更奇怪的是,等待30分钟以上后,Go代码又能看到这些执行实例并执行停止操作,但CLI依旧显示它们处于RUNNING状态。
原因分析
最终一致性机制导致状态同步延迟
AWS Step Functions采用最终一致性架构,调用StopExecution后,控制平面(SDK/控制台)会立即标记状态变更,但数据平面(CLI依赖的底层查询存储)的状态同步存在延迟,尤其是大量执行实例批量操作时,同步周期会被拉长。ListExecutions接口的查询差异
Go SDK和CLI调用的ListExecutions接口虽为同一接口,但可能因请求路由到不同的服务分区,部分分区的状态更新未及时完成。30分钟后分区缓存失效或同步完成,SDK才能再次获取到这些实例;而CLI可能使用了更久的缓存策略,导致状态迟迟未更新。StopExecution的异步处理特性
StopExecution是异步操作,调用成功仅代表请求被接受,实际停止执行的后台处理可能因队列积压延迟完成,部分实例的状态变更未及时写入查询存储,从而出现SDK/控制台与CLI的显示差异。异常状态实例的巡检同步
部分执行实例可能因网络波动、服务内部错误导致停止操作未完全生效,处于"僵尸"RUNNING状态。30分钟后Step Functions的内部巡检机制检测到这些实例,将状态同步到可查询存储,此时SDK才能再次获取并尝试停止。
解决建议
- 批量停止后增加5-10分钟等待时间,再重复执行停止逻辑,确保所有实例被处理。
- 调用
StopExecution后,通过DescribeExecution接口单独验证实例状态,避免依赖ListExecutions的结果。 - 在代码中增加日志,记录每个分页处理的执行实例数量,排查是否存在遗漏。
- 若问题持续,提交AWS工单让官方排查后台状态同步异常。
内容的提问来源于stack exchange,提问作者Charmander

