由于Api网关执行任何请求的时间限制是10秒,我正在尝试处理超时错误,但a还没有找到捕获和响应自定义消息的方法。
问题的背景:我有一个函数的执行时间不到2秒,但当函数执行冷启动时,有时用Java创建与DynamoDB的连接需要10秒以上。我已经使用线程优化了我的函数,但我仍然无法保持初始调用的10秒限制。
我需要找到一种方法来提供这样的响应模型:
{
"error": "timeout"
}
为了找到一个解决方案,我在Lambda中创建了一个函数,该函数在执行10秒后有意响应某些内容。在与Api网关进行集成时,我得到了以下响应:
Request: /example/lazy
Status:
Latency: ms
响应体
{
"logref": "********-****-****-****-1d49e75b73de",
"message": "Timeout waiting for endpoint response"
}
在文档中,我发现您可以在Integration Response中使用HTTP状态regex来捕获此错误。但我还没有找到这样做的方法,似乎互联网上没有人有我同样的问题,因为我在任何论坛上都没有找到这个特定的消息。
我尝试过这些正则表达式:
.*"message".*
Timeout.*
.*"status":400.*
.*"status":404.*
.*"status":504.*
.*"status":500.*
任何人都知道我应该用witch regex来捕捉这个"消息":"超时…?
您正在控制台中使用测试调用功能,该功能的超时限制为10秒。但是,正如这里提到的,部署的API的超时是30秒。所以,这应该足以处理Lambda冷启动情况。请使用api链接进行部署,然后进行测试。如果因为端点花费超过30秒而超时,则响应为:
{"message": "Endpoint request timed out"}
为了澄清,您可以根据集成响应的HTTP状态代码来配置方法响应。但是在超时的情况下,没有集成响应。因此,您不能在超时期间使用该功能来配置方法响应。
您可以通过为Lambda函数分配更多内存来提高冷启动时间。对于默认的512MB,我看到用Java编写的函数的冷启动时间为8-9秒。使用1536MB的内存,这将提高到2-3秒。
亚马逊表示,CPU分配确实很重要,但没有办法直接增加。CPU分配与内存成比例增加。
如果你想要接近零的冷启动时间,保持功能温暖是最好的方法,如这里所述。