2016-04-01 28 views
1

我有一個定義簡單GET的AWS網關API。我用它來觸發一個Lambda。使用請求映射我接受查詢參數並創建一個json對象來給予Lambda。這裏是我的映射使用VTL超時的AWS網關API映射

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

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

我新的VTL和亞馬遜網關API,它看來我犯了一個錯誤是導致這種情況永遠不會完成。我嘗試了很多變化,但如果我曾經引用$myMap.get($key)它不會完成。我究竟做錯了什麼?我喜歡理解。對於同樣產出的建議也值得歡迎。

UPDATE

如果我刪除「{」和「}」,則不再超時!現在我不知道爲什麼那麼重要,它不是我想要的格式,而是有趣的小技巧,可以深入到底。

更新2

簡化了邏輯和它的上面所反映的相同的問題。我還發現,如果在json中放置一個屬性來打開另一個對象,則該邏輯起作用。這很糟糕。

{ 

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

回答

0

由於渦如上所述,網關API有10秒的限制。在我的情況下發生的事情是,當我得到的格式正確我的lambda將執行沒有拋出異常。這個邏輯花費的時間超過了10秒。當測試REST API時,這種情況真的讓AWS感到困惑。在大多數情況下,您會得到一個包含三個部分「Response Body」,「Headers」和「log」的頁面。你看看這個日誌部分,看看你的VTL模板是怎麼做的。您可以將輸入和輸出以及調用與Lambda進行比較。非常適合調試。

在超時的情況下,日誌部分不會被填充。只是我在原始問題中發佈的回覆正文。 Lambda看起來並沒有在CloudWatch中創建任何日誌。這給人的印象是,在設置API和請求映射時發生了一個錯誤,它足夠致命,甚至沒有調用Lambda。

另一個有趣的發現是,在我第一次直接測試lambda後,這不再超時。通過本質上「啓動泵」,後續的lambda請求在一半時間內響應。總理後,我可以使用網關API很好。

0

不幸的是,你做的一切都是正確的。

截止到今天,如果請求花費的時間超過10秒,AWS API網關的硬件限制就會超時。

下面是官方AWS線程,您可以按照更新: https://forums.aws.amazon.com/thread.jspa?threadID=205424

+0

感謝您的回覆Vor!我知道執行時間會有限制。這完全有道理!沒有意義的是爲什麼這會導致它運行超過10秒鐘。這會在沒有嘗試添加引號的情況下運行。我認爲這裏有一個開發人員問題,那就是我,不瞭解VTL語法的某些部分,或者VTL/AWXS問題不能處理這種情況。但我對這個問題感到困惑。 – Nexeh

1

你在問題中提供的第一個映射模板(粘貼在下面)工作正常。

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

+0

感謝您的回覆。你是對的。我在答案中也發佈了相同的結果。所以我沒有讓我接受它。我希望AWS能夠獲得更好的消息傳遞,以防止未來出現混亂。我很好奇你如何測試VTL。這是我第一次使用它,只是因爲它是API網關的一部分。 – Nexeh

相關問題