2

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

3 回答 3

1

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

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

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

如果您仍然看到该映射超时,我们可以进行更多分析。您可以使用 API Gateway 论坛并使用您的 API 和通话详细信息发送私人消息。

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

于 2016-04-01T20:39:41.260 回答
0

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

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

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

于 2016-04-01T14:57:11.467 回答
0

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

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

另一个有趣的发现是,在我第一次直接测试 lambda 之后,这不再超时。通过基本上“启动泵”,后续 lambda 请求的响应时间缩短了一半。在素数之后,我可以很好地使用网关 API。

于 2016-04-01T19:45:16.530 回答