使用 VTL 的 AWS Gateway API 映射超时
Posted
技术标签:
【中文标题】使用 VTL 的 AWS Gateway API 映射超时【英文标题】:AWS Gateway API mapping using VTL times out 【发布时间】:2016-07-21 10:18:43 【问题描述】:我有一个定义简单 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
【问题讨论】:
【参考方案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 秒。
【讨论】:
感谢您的回复。你是对的。我也在答案中发布了相同的结果。所以只是还没有让我接受它。我希望 AWS 能够获得更好的消息传递,以防止将来出现这种混乱。我很好奇你是如何测试 VTL 的。这是我第一次使用它,只是因为它是 API Gateway 的一部分。【参考方案2】:如上所述,网关 api 有 10 秒的限制。就我而言,发生的事情是当我得到正确的格式时,我的 lambda 将执行而不会引发异常。这个逻辑花费的时间超过了 10 秒。让这种情况真正令人困惑的是 AWS 在测试 REST API 时的输出。在大多数情况下,您会得到一个包含“响应正文”、“标题”和“日志”三个部分的页面。您可以查看此日志部分以了解您的 VTL 模板是如何工作的。您可以比较输入和输出以及对 Lambda 的调用。非常适合调试。
在超时的情况下,日志部分不会被填充。只是我在原始问题中发布的响应正文。 Lambda 似乎也没有在 CloudWatch 中创建任何日志。这给人的印象是,在 API 的设置和请求映射中发生了一个错误,严重到甚至没有调用 Lambda。
另一个有趣的发现是,在我第一次直接测试 lambda 之后,这不再超时。通过基本上“启动泵”,后续 lambda 请求的响应时间缩短了一半。在prime之后我可以使用网关API就好了。
【讨论】:
【参考方案3】:不幸的是,你做的一切都是正确的。
截至今天,AWS API Gateway 有一个非常严格的限制,即如果请求时间超过 10 秒,它就会超时。
这是您可以关注的官方 AWS 线程以获取更新: https://forums.aws.amazon.com/thread.jspa?threadID=205424
【讨论】:
感谢您的回复!我知道执行时间会有限制。这完全有道理!没有意义的是为什么这会导致它运行超过 10 秒。这会在不尝试添加引号的情况下运行亚秒。我认为这里有一个开发人员问题,就是我,不了解 VTL 语法的某些部分,或者无法处理这种情况的 VTL/AWXS 问题。但我对这个问题感到困惑。以上是关于使用 VTL 的 AWS Gateway API 映射超时的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 AWS CloudFormation 在 AWS API Gateway 集成中指定阶段变量?
是否有用于使用 VTL 的 AWS Appsync 的 Model.objects.update_or_create()?
如何使用 AWS CloudFormation 在 AWS API Gateway 上应用安全策略?