有没有办法将请求的标头和正文传递到 aws 步骤函数管道?

问题描述 投票:0回答:2

我目前陷入了请求传递的困境。我需要使用步骤函数管道处理来自标头和请求正文的信息。我正在使用 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 事件访问标头,它将是 事件['标题']['授权'] 但我只将请求正文作为步骤函数的输入。

当我将数据流模拟器用于整个请求,然后将 JsonPath 放入我的状态机模板中时,它仍然没有为我提供标头和正文作为输入。

有人可以帮我吗?

json amazon-web-services aws-api-gateway aws-step-functions
2个回答
8
投票

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

  • %STATEMACHINE%
    替换为您的状态机的 ARN
  • 可以选择将
    $includeHeaders
    $includeQueryString
    $includePath
    设置为
    false
  • 可以选择将
    $requestContext
    设置为 上下文键值对。 使用
    @@
    而不是引号,如
    "{@@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 云开发套件存储库。 它是 StepFunctionRestApi 构造实现的一部分。


0
投票
{
  "input": "{ \"x-test-header\": \"$util.escapeJavaScript($headerValue)\", \"body\": $util.escapeJavaScript($input.json('$'))}",
  "stateMachineArn": "$util.escapeJavaScript($stageVariables.arn)"
}
© www.soinside.com 2019 - 2024. All rights reserved.