API Gateway调用Sagemaker Endpoint遇400错误求助
问题解决:API Gateway POST调用Sagemaker Endpoint返回400错误
核心问题分析
你的POST API请求被Sagemaker模型拒绝,原因是API Gateway发送给Sagemaker的请求格式不符合模型预期。对比能正常工作的GET API,差异在于POST请求的集成映射模板额外包装了一层JSON结构(包含environment、content_type、body字段),而Sagemaker Runtime的InvokeEndpoint API要求请求体是模型可直接解析的原始输入数据,而非嵌套的对象。
解决方案步骤
1. 调整集成请求映射模板
修改application/json映射模板,直接输出模型需要的原始输入数据(即请求体中的body数组),去掉不必要的包装字段:
#set($body = $input.path('$.body')) $body
如果模型需要特定的JSON结构(而非纯数组),则只保留模型所需的字段,不要混入environment、content_type这类额外信息。
2. 配置集成请求的Content-Type头
Sagemaker需要通过请求头识别输入数据类型,因此在API Gateway的集成请求设置中添加HTTP头映射:
- 头名称:
Content-Type - 映射值:
$input.path('$.content_type')
这样就能将请求中的content_type值传递给Sagemaker,确保模型能正确解析输入格式。
3. 验证请求格式匹配模型预期
用AWS CLI直接测试Sagemaker Endpoint,确认模型接受的输入格式:
aws sagemaker-runtime invoke-endpoint \ --endpoint-name YOUR_ENDPOINT_NAME \ --content-type "application/json" \ --body "[1,2,3]" \ output.txt
如果该命令能成功返回结果,说明API Gateway的映射模板需要和这个CLI请求的格式完全一致。
4. 移除不必要的参数传递
如果模型不需要environment参数,不要将其加入请求体,多余的字段会导致模型无法解析请求,触发CLIENT_ERROR_FROM_MODEL错误。
额外排查点
- 检查模型的输入要求:确认模型是接受纯数组,还是需要如
{"data": [1,2,3]}这样的结构,调整映射模板匹配该格式。 - 查看Sagemaker Endpoint的CloudWatch日志:日志中会有更详细的错误信息,能明确指出请求格式的问题所在。
内容的提问来源于stack exchange,提问作者Eddy C
相关产品推荐
相关产品推荐

