AWS Step Functions Choice状态异常:Glue Job返回值无法正确跳转
问题场景
在AWS Step Functions多步骤流程中,使用Glue Job验证数据库更新状态,脚本末尾返回布尔值True/False,期望在后续Choice状态updated_databases中根据该值跳转流程:返回True进入data_process,返回False进入end。但执行时提示错误:Invalid Path ‘$.base_validation.updated_databases’: The choice state’s condition path references an invalid value.
问题原因
使用arn:aws:states:::glue:startJobRun.sync资源时,Step Functions返回的结果是Glue JobRun的元数据(如JobRunId、执行状态等),并非Python脚本中return的布尔值。脚本返回值不会自动传递到状态机的上下文数据中,必须通过特定方式输出并配置提取逻辑。
解决方案
1. 修改Glue Job Python脚本,输出JSON格式结果
将脚本返回的布尔值以JSON格式打印到标准输出(stdout),这是Step Functions捕获Glue Job执行结果的关键方式:
import json validate_databases_by_origin = validate_databases(databases, data_ref) updated_databases = all([v == 'Updated' for v in validate_databases_by_origin.values()]) # 以JSON格式输出结果,便于Step Functions解析 print(json.dumps({"updated_databases": updated_databases})) return updated_databases
2. 配置Step Functions的Glue Task,开启日志捕获并提取结果
修改database_validation_script任务的配置,添加日志开启参数和结果提取规则:
"database_validation_script": { "Type": "Task", "Resource": "arn:aws:states:::glue:startJobRun.sync", "Parameters": { "JobName": "database_validation", "Arguments": { "--category.$": "$.Parameters.category", "--item.$": "$.Parameters.item", "--data_ref.$": "$.Parameters.data_ref", "--Year.$": "$.Parameters.Year", "--Month.$": "$.Parameters.Month", "--Day.$": "$.Parameters.Day", "--enable-continuous-cloudwatch-log": "true" // 必须开启该参数,让Step Functions捕获日志输出 } }, "ResultSelector": { // 将捕获到的JSON字符串解析为布尔值 "updated_databases.$": "States.StringToJson($.JobRunOutput.OutputValue).updated_databases" }, "ResultPath": "$.base_validation", "Next": "updated_databases" }
3. 保留原Choice状态配置(无需修改)
原Choice状态的路径$.base_validation.updated_databases现在可以正确获取到布尔值,配置保持不变:
"updated_databases": { "Type": "Choice", "Choices": [ { "Variable": "$.base_validation.updated_databases", "BooleanEquals": true, "Next": "data_process" } ], "Default": "end" }
验证逻辑
修改完成后,Glue Job执行时会将JSON格式的结果输出到日志,Step Functions通过startJobRun.sync捕获该输出,经ResultSelector解析后存入状态机上下文的$.base_validation节点,后续Choice状态即可根据该布尔值正确跳转流程。
内容的提问来源于stack exchange,提问作者Kleiton Moraes

