使用VTL超时的AWS Gateway API映射

时间:2016-04-01 14:41:04

标签: amazon-web-services aws-lambda aws-api-gateway vtl

我有一个定义简单GET的AWS Gateway API。我用它来触发一个Lambda。使用请求映射我采用查询参数并创建一个json对象来给Lambda。这是我的映射

#set ($myMap = $input.params().get("querystring"))

{
    #foreach($paramName in $myMap.keySet() )
    "$paramName" : "$util.escapeJavaScript($myMap.get($paramName))"
        #if($foreach.hasNext),#end
    #end
}

我是VTL和Amazon Gateway API的新手,我似乎犯了一个错误,导致这个永远不会完成。我尝试了很多变化,但如果我引用$myMap.get($key)它就不会完成。我究竟做错了什么?我很乐意去理解。对同样的输出的建议也欢迎。

更新

如果我删除“{”和“}”,则不再超时!现在我不知道为什么这很重要,这不是我想要的格式,而是有趣的小故事,以便深究这一点。

更新2

简化了逻辑及其在上面反映的相同问题。我还发现如果在json中放置一个属性来打开另一个对象,那么逻辑就可以了。这很糟糕。

{

    "data": {
    #foreach($paramName in $myMap.keySet() )
    "$paramName" : "$util.escapeJavaScript($myMap.get($paramName))"
        #if($foreach.hasNext),#end
    #end
    }
}

3 个答案:

答案 0 :(得分:1)

您在问题中提供的第一个映射模板(下面粘贴)可以正常工作。

#set ($myMap = $input.params().get("querystring"))

{
    #foreach($paramName in $myMap.keySet() )
        "$paramName" : "$util.escapeJavaScript($myMap.get($paramName))"
        #if($foreach.hasNext),#end
    #end
}

如果您仍然看到该映射超时,我们可以分析更多。您可以使用API​​网关论坛并使用您的API和呼叫详细信息发送私人消息。

API网关控制台中的TestInvoke功能的时间限制为10秒。由于Lambda函数可能有冷启动,有时可能需要更长时间。因此,在实际调用中(在部署API之后),我们将针对Lambda冷启动的调用的时间限制增加到30秒。

答案 1 :(得分:0)

不幸的是,你做的一切都是正确的。

截至今日,AWS API Gateway有一个非常严格的限制,如果请求时间超过10秒,它会超时。

以下是您可以关注更新的官方AWS主题: https://forums.aws.amazon.com/thread.jspa?threadID=205424

答案 2 :(得分:0)

如上所述,网关api的限制为10秒。在我的情况下发生的事情是,当我得到正确的格式时,我的lambda将执行而不会抛出异常。这种逻辑花费的时间超过了10秒。让这种情况真正令人困惑的是测试REST API时的AWS输出。在大多数情况下,您会得到一个包含三个部分“Response Body”,“Headers”和“log”的页面。您可以查看此日志部分,了解您的VTL模板的功能。您可以将输入和输出以及对Lambda的调用进行比较。非常适合调试。

在超时的情况下,日志部分不会被填充。只是我在原始问题中发布的回复正文。 Lambda似乎也没有在CloudWatch中创建任何日志。这给人的印象是在API的设置和请求映射中发生了错误,该映射非常致命,甚至没有调用Lambda。

另一个有趣的发现是,在我第一次直接测试lambda之后,它不再超时。通过基本上“灌注泵”,随后的λ请求在一半的时间内响应。在素数之后,我可以使用Gateway API。