我有一个AWS网关API,它定义了一个简单的GET。我用它来触发兰博达。使用请求映射,我使用查询参数并创建一个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和很陌生,似乎我犯了一个错误,这是因为这件事永远不会完成。我已经尝试了许多变体,但如果我曾经引用$myMap.get($key),它是不会完成的。我做错什么了?我喜欢理解。同样的产出建议也欢迎。
更新
如果我删除"{“和"}”,这将不再超时!现在我不知道这为什么重要,这不是我想要的格式,但有趣的小贴士来了解这一点。
更新2
用同样的问题简化了逻辑及其在上面的反映。我还发现,如果在打开另一个对象的json中放置一个属性,则逻辑可以工作。这太可怕了。
{
"data": {
#foreach($paramName in $myMap.keySet() )
"$paramName" : "$util.escapeJavaScript($myMap.get($paramName))"
#if($foreach.hasNext),#end
#end
}
}发布于 2016-04-01 19:45:16
如前所述,网关api有10秒的限制。在我的例子中,所发生的事情是,当我得到正确的格式时,我的lambda就会执行,而不会抛出异常。这个逻辑花费的时间比10秒还要长。当测试REST时,使这种情况变得非常混乱的是AWS输出。在大多数情况下,您将得到一个包含三个部分“响应主体”、“标题”和“日志”的页面。您可以查看这个日志部分,看看您的VTL模板是如何完成的。您可以将输入、输出和调用与Lambda进行比较。很适合调试。
在超时的情况下,日志部分不会被填充。只是我在最初的问题中贴出的回应体。Lambda似乎也没有在CloudWatch中创建任何日志。这给人的印象是,API和请求映射的设置发生了错误,这是致命的,甚至连Lambda都没有调用。
另一个有趣的发现是,在我第一次直接测试lambda之后,它不再超时。从本质上说,“启动泵”之后,兰达的请求在一半时间内得到了回应。在质数之后,我可以很好地使用Gateway API。
发布于 2016-04-01 20:39:41
您在问题中提供的第一个映射模板(粘贴在下面)运行良好。
#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秒。
发布于 2016-04-01 14:57:11
不幸的是,你一切都做对了。
到今天为止,有一个非常严格的限制,如果请求花费的时间超过10秒,它就会超时。
下面是您可以跟踪的官方AWS线程以进行更新:https://forums.aws.amazon.com/thread.jspa?threadID=205424
https://stackoverflow.com/questions/36359199
复制相似问题