使用VTL的AWS网关API映射超时



我有一个定义简单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了。

相关内容

  • 没有找到相关文章

最新更新