AWS Step Functions调用SendTaskSuccess报output/taskToken空值校验错误
排查结论
你遇到的校验错误是两类核心问题叠加导致的:
- 第一类是请求调用方式错误,导致参数根本没被Step Functions服务端正确接收,直接触发当前的null校验报错
- 第二类是状态机本身的定义存在硬配置错误,就算请求调通也无法正常运行
1. 请求发送方式问题
你直接用requests.post裸发HTTP请求调用AWS接口的写法是错误的。
AWS所有服务API强制要求SigV4签名鉴权,未签名、签名错误、请求头格式不对的请求会被服务端直接拦截,不会解析你传入的JSON Body,最终服务端读取到的output和taskToken都是空值,才会返回两个字段同时为null的校验错误。
不要自己手写HTTP请求调用AWS API,直接用官方boto3 SDK调用send_task_success即可,SDK会自动处理签名、端点匹配、参数格式校验的逻辑,不会出现参数丢失的问题,正确调用示例:
import boto3 import json # 初始化Step Functions客户端,替换成你实际使用的区域 sfn = boto3.client('stepfunctions', region_name='us-west-2') resp = sfn.send_task_success( # task_token是你从Lambda入参里拿到的$$.Task.Token原始值,不要做转义、截断 taskToken=task_token, # output必须是字符串序列化后的JSON,你当前的json.dumps写法是正确的 output=json.dumps({"Payload": {"execution_id": execution_id}}) ) print(resp)
2. 状态机定义硬错误
你贴的Step Functions定义有3处明显的配置错误:
StartAt字段值写的是process,但States列表里根本没有名为process的状态,已定义的状态为on-demand-scan-pre-process、metadata-extraction、Done,状态机启动时就会报配置非法。- 第一个状态
on-demand-scan-pre-process的Next字段值写的是source-scan-metadata-extraction,这个状态同样不存在于States列表里,你实际定义的后续状态名是metadata-extraction,名称不匹配会导致状态流转直接失败。 - 第二个状态
metadata-extraction是普通Lambda调用任务(Resource是arn:aws:states:::lambda:invoke,没有带.waitForTaskToken后缀),这类任务不会生成回调Token,你在Payload里配置taskToken.$: "$$.Task.Token"拿到的只会是空值,属于无效配置。
内容的提问来源于stack exchange,提问作者back-new
相关产品推荐
相关产品推荐

