AWS Gateway VTL请求转换失败求助(Pulumi Go+StepFunction)
我用Pulumi Go写了一段用于AWS集成启动StepFunction的VTL模板代码,如下:
func DealRequestTemplate(stateMachineArn pulumi.StringInput) pulumi.StringInput { return pulumi.Sprintf(`#set($authHeader = $util.escapeJavaScript($input.params('%s'))) #set($rawBody = $input.body) #set($rawDeals = $input.json('$.deals')) #if(!$rawDeals || $rawDeals == "null") #set($deal = $input.json('$.deal')) #if(!$deal || $deal == "null") #set($deal = $rawBody) #end #set($rawDeals = "[$deal]") #elseif(!$rawDeals.startsWith("[")) #set($rawDeals = "[$rawDeals]") #end #set($escapedAuth = $util.escapeJavaScript($authHeader)) #set($payloadJson = "{ \"authHeader\": \"$escapedAuth\", \"deals\": $rawDeals }") #set($escapedPayload = $util.escapeJavaScript($payloadJson)) #set($context.requestOverride.header["x-debug-raw-body"] = $util.escapeJavaScript($rawBody)) #set($context.requestOverride.header["x-debug-payload"] = $util.escapeJavaScript($payloadJson)) { "stateMachineArn": "%s", "name": "$context.requestId", "input": "$escapedPayload" }`, strings.ToLower(dealAuthHeader), stateMachineArn) }
在API Gateway测试标签页测试端点时,返回500错误,日志如下:
Logs Execution log for request f5f8137e-8868-414a-816a-51f7baf92545 Mon Nov 17 16:05:56 UTC 2025 : Starting execution for request: f5f8137e-8868-414a-816a-51f7baf92545 Mon Nov 17 16:05:56 UTC 2025 : HTTP Method: POST, Resource Path: /deal Mon Nov 17 16:05:56 UTC 2025 : Method request path: {} Mon Nov 17 16:05:56 UTC 2025 : Method request query string: {} Mon Nov 17 16:05:56 UTC 2025 : Method request headers: {X-Hubspot-Authorization= Bearer ******} Mon Nov 17 16:05:56 UTC 2025 : Method request body before transformations: { "deals": [ { "deal": { "objectId": 88888, "properties": { "dealname": "First deal", "amount": "10000" } }, "objectId": 88888 }, { "deal": { "objectId": 99999, "properties": { "dealname": "Second deal", "amount": "25000" } }, "objectId": 99999 } ] } Mon Nov 17 16:05:56 UTC 2025 : Execution failed due to configuration error: Unable to transform request Mon Nov 17 16:05:56 UTC 2025 : Method completed with status: 500
不确定VTL代码哪里出问题,求排查建议。
排查建议
修复数组类型判断的错误逻辑
测试请求中的deals是数组,$input.json('$.deals')返回的是VTL数组对象,不是字符串。此时调用startsWith("[")会触发方法不存在的错误——这是当前500错误的核心原因。应该改用VTL内置的$util.isArray()方法判断类型:#elseif(!$util.isArray($rawDeals)) #set($rawDeals = "[$rawDeals]") #end验证请求头参数的匹配性
确认dealAuthHeader变量值转小写后,是否和请求头X-Hubspot-Authorization完全一致。如果$input.params找不到对应头,$authHeader会为null,后续的escapeJavaScript操作可能引发异常。简化模板分步验证
暂时注释掉调试头设置、复杂的rawDeals转换逻辑,先保留最基础的StepFunction调用结构(仅stateMachineArn、name和简单input),确认模板能正常执行后,再逐步加回其他逻辑,缩小问题范围。修正JSON序列化逻辑
拼接$payloadJson时,直接插入数组对象可能导致转义错误,改用$util.toJson()确保数组正确序列化为JSON字符串:#set($payloadJson = "{ \"authHeader\": \"$escapedAuth\", \"deals\": $util.toJson($rawDeals) }")开启详细日志定位问题
在API Gateway阶段设置中启用Full Request/Response Logs,可以获取VTL执行过程中的具体错误信息(比如变量为空、方法不存在等),替代当前模糊的“Unable to transform request”提示。
内容的提问来源于stack exchange,提问作者khinester

