我有一个Kong服务,该服务使用AWS Lambda插件调用函数(同步-RequestResponse
)。
据我了解,由于Lambda始终返回OK
,因此无法启用重试功能。
即使使用转换插件来生成实际状态(从响应json中的status
属性读取),我也无法重试。
是否有用于启用Lambda呼叫重试的插件?还是我应该如何进行呢?
答案 0 :(得分:1)
据我所知,尽管此用例有解决方法,但Kong Lambda插件不支持重试。
可以创建一个内部路由,该内部路由执行Lambda调用(指定了路由ID和服务ID的Lambda插件)以及从外部作为目标的另一条路由,此路由将启用重试并调用内部路由。这是我如何实现此目标的示例:
服务:
{
"host": "localhost",
"created_at": 1555418486,
"connect_timeout": 30000,
"id": "3c31fc3f-74f1-423f-8e5a-751668bed878",
"protocol": "http",
"name": "test",
"read_timeout": 10000,
"port": 8000,
"path": "/kong-internal/",
"updated_at": 1555418486,
"retries": 3,
"write_timeout": 10000,
"tags": null,
"extras": {}
}
面向公众的路线:
{
"updated_at": 1555418553,
"created_at": 1555418487,
"strip_path": true,
"snis": null,
"hosts": [
"test.com"
],
"name": "EXTERNAL_route",
"methods": [],
"sources": null,
"preserve_host": true,
"regex_priority": 1,
"service": {
"id": "3c31fc3f-74f1-423f-8e5a-751668bed878"
},
"paths": [],
"destinations": null,
"id": "0917748d-24eb-42aa-b83e-7111ef4de9b4",
"protocols": [
"https",
"http"
],
"tags": null
}
内部路由(具有lambda插件):
{
"updated_at": 1555418487,
"created_at": 1555418487,
"strip_path": true,
"snis": null,
"hosts": [
"test.com"
],
"name": "INTERNAL_route",
"methods": null,
"sources": null,
"preserve_host": false,
"regex_priority": null,
"service": {
"id": "3c31fc3f-74f1-423f-8e5a-751668bed878"
},
"paths": [
"/kong-internal/"
],
"destinations": null,
"id": "e5981f16-d44c-4d19-b706-cdc3173db412",
"protocols": [
"http"
],
"tags": null
}
尽管仍然存在问题,strip_path
不适用于lambda函数,所以lambda应该从路径中手动删除/kong-internal/
。
请注意:如果您的lambda添加了x-amz-log-result
标头,我建议将response_transform
插件添加到内部路由中以将其删除,那么它可能会变得很大而导致通话失败。
编辑:结果是Kong真的不喜欢来自aws的超时状态,因此在服务上具有较高的connect_timeout以及相对较低的read_timeout和write_timeout是有意义的,然后kong的内部机制将进行重试。