【问题标题】:Is there a way to passthrough header and body of a request to aws step function pipeline?有没有办法将请求的标头和正文传递到 aws step function 管道?
【发布时间】:2022-02-20 22:45:51
【问题描述】:

我目前被请求直通卡住了。我需要使用步进函数管道处理来自标头和请求正文的信息。我正在使用集成请求中具有以下映射模板的 REST API 网关

#set($data = $util.escapeJavaScript($input.json('$')))
{
    "input": "{ \"input\": $data, \"stageVariables\" : { #foreach($key in $stageVariables.keySet()) \"$key\" : \"$util.escapeJavaScript($stageVariables.get($key))\" #if($foreach.hasNext),#end #end } }",
    "stateMachineArn": "arn:aws:states:eu-west-1:xxxxxxxxxxxx:stateMachine:StateMachine-1"
}

但这不起作用。如果我要使用 lambda 事件访问标头,那将是 事件['headers']['授权'] 但我只将请求的正文作为我的步进函数的输入。

当我对整个请求使用数据流模拟器,然后将 JsonPath 带入我的状态机模板时,它仍然没有给我标题和正文作为输入。

有人可以帮我吗?

【问题讨论】:

    标签: json amazon-web-services aws-api-gateway aws-step-functions


    【解决方案1】:

    调整此 VTL 请求映射模板* 以将请求数据添加到状态机输入。

    • 用您的状态机 ARN 替换 %STATEMACHINE%
    • 可选择将$includeHeaders$includeQueryString$includePath 设置为false
    • (可选)将$requestContext 设置为context key-value pairs。使用@@ 代替引号,如"{@@user@@:@@$context.identity.user@@}"
    ## Velocity Template used for API Gateway request mapping template
    ## "@@" is used here as a placeholder for '"' to avoid using escape characters.
    
    #set($includeHeaders = true)
    #set($includeQueryString = true)
    #set($includePath = true)
    #set($requestContext = '')
    
    #set($inputString = '')
    #set($allParams = $input.params())
    {
        "stateMachineArn": "%STATEMACHINE%",
    
        #set($inputString = "$inputString,@@body@@: $input.body")
    
        #if ($includeHeaders)
            #set($inputString = "$inputString, @@header@@:{")
            #foreach($paramName in $allParams.header.keySet())
                #set($inputString = "$inputString @@$paramName@@: @@$util.escapeJavaScript($allParams.header.get($paramName))@@")
                #if($foreach.hasNext)
                    #set($inputString = "$inputString,")
                #end
            #end
            #set($inputString = "$inputString }")
            
        #end
    
        #if ($includeQueryString)
            #set($inputString = "$inputString, @@querystring@@:{")
            #foreach($paramName in $allParams.querystring.keySet())
                #set($inputString = "$inputString @@$paramName@@: @@$util.escapeJavaScript($allParams.querystring.get($paramName))@@")
                #if($foreach.hasNext)
                    #set($inputString = "$inputString,")
                #end
            #end
            #set($inputString = "$inputString }")
        #end
    
        #if ($includePath)
            #set($inputString = "$inputString, @@path@@:{")
            #foreach($paramName in $allParams.path.keySet())
                #set($inputString = "$inputString @@$paramName@@: @@$util.escapeJavaScript($allParams.path.get($paramName))@@")
                #if($foreach.hasNext)
                    #set($inputString = "$inputString,")
                #end
            #end
            #set($inputString = "$inputString }")
        #end
    
        ## Check if the request context should be included as part of the execution input
        #if($requestContext && !$requestContext.empty)
            #set($inputString = "$inputString,")
            #set($inputString = "$inputString @@requestContext@@: $requestContext")
        #end
        
        #set($inputString = "$inputString}")
        #set($inputString = $inputString.replaceAll("@@",'"'))
        #set($len = $inputString.length() - 1)
        "input": "{$util.escapeJavaScript($inputString.substring(1,$len))}"
    }
    

    * 模板取自AWS Cloud Development Kit repo。它是StepFunctionRestApi 构造实现的一部分。

    【讨论】:

    • 完美,非常感谢,这就是解决方案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多