You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS Gateway VTL请求转换失败求助(Pulumi Go+StepFunction)

排查API Gateway VTL请求转换500错误

我用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 00:45:07