我有一个定义简单GET的AWS网关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)
,它就不会完整。我做错了什么?我很想了解。同样的产出建议也很受欢迎。
更新
如果我删除"{"one_answers"}",这将不再超时!现在我不知道为什么这很重要,这根本不是我想要的格式,而是有趣的花絮。
更新2
简化了上述逻辑及其反映的相同问题。我还发现,如果在打开另一个对象的json中放入一个属性,逻辑就会工作。这太可怕了。
{
"data": {
#foreach($paramName in $myMap.keySet() )
"$paramName" : "$util.escapeJavaScript($myMap.get($paramName))"
#if($foreach.hasNext),#end
#end
}
}
您在问题中提供的第一个映射模板(粘贴在下面)运行良好。
#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秒。
不幸的是,你做的每件事都是对的。
从今天起,AWS API网关有一个非常严格的限制,如果请求时间超过10秒,就会超时。
以下是AWS的官方线程,您可以按照它进行更新:https://forums.aws.amazon.com/thread.jspa?threadID=205424
如上所述,网关api的限制为10秒。在我的情况下,当我得到正确的格式时,我的lambda将在不引发异常的情况下执行。这个逻辑比10秒还要长。使这种情况真正令人困惑的是测试REST API时的AWS输出。在大多数情况下,您会得到一个包含"响应主体"、"标题"one_answers"日志"三个部分的页面。您可以查看此日志部分,了解VTL模板的工作情况。您可以比较输入和输出以及对Lambda的调用。非常适合调试。
在超时的情况下,不会填充日志部分。只是我在原始问题中发布的回复正文。Lambda似乎也没有在CloudWatch中创建任何日志。这给人的印象是,在API和请求映射的设置中发生了一个错误,这个错误非常致命,甚至没有调用Lambda。
另一个有趣的发现是,在我第一次直接测试lambda后,它不再超时。通过基本上"启动泵",随后的lambda请求在一半的时间内得到响应。在prime之后,我就可以使用Gateway API了。