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

AWS Gateway API mapping using VTL times out

我有一个定义简单 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) 它不会完成。我究竟做错了什么?我喜欢理解。也欢迎对相同的输出提出建议。

更新

如果我删除“{”和“}”,这将不再超时!现在我不知道为什么这很重要,这根本不是我想要的格式,而是有趣的花絮,可以深入了解这一点。

更新 2

简化了逻辑,上面反映了同样的问题。我还发现,如果在打开另一个对象的 json 中放置一个属性,则逻辑有效。这很糟糕。

{

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

不幸的是,你做的一切都是对的。

截至今天,AWS API 网关有一个非常严格的限制,如果请求花费的时间超过 10 秒,它就会超时。

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

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

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

另一个有趣的发现是,在我第一次直接测试lambda后,这个不再超时了。基本上 "priming the pump" 随后的 lambda 请求响应时间减半。素数后我可以使用网关 API 就好了。

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

#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 秒。