在 API Gateway 中映射 Lambda 输出会导致服务器错误
Posted
技术标签:
【中文标题】在 API Gateway 中映射 Lambda 输出会导致服务器错误【英文标题】:Mapping Lambda output in API Gateway gives server error 【发布时间】:2016-02-09 15:11:00 【问题描述】:我有一个 AWS API Gateway 设置,由 Python Lambda 函数提供服务。对于成功的响应,Lambda 会返回如下形式的响应:
"200:\"somekey\": \"somevalue\""
默认情况下,网关控制台中的 Integration Response 设置只有一个配置了 Lambda 错误正则表达式 的规则,.* 映射到响应状态为 200。这很好用。
问题是当我尝试将其更改为 200.* 时(以期启用更具体的代码)。现在我得到了一个
"message": "Internal server error"
每次我用 any 请求访问网关(结果是否为 200)。
没有错误日志写入 CloudWatch。
我想知道如何在 AWS API Gateway 中成功地将 Lambda 输出映射到 HTTP 状态代码。
【问题讨论】:
你确实看过这个,是吗? ***.com/questions/31329495/… 我的问题是我的 200 响应正则表达式中的一个类型。 【参考方案1】:如果您在 API 网关中进行测试运行,测试运行日志应显示类似于以下内容的错误:
2015 年 11 月 21 日星期六 07:41:25 UTC:由于配置,执行失败 错误:输出映射不匹配且没有默认输出映射 已配置
问题是不再有默认映射来捕获成功的响应。错误正则表达式的目的是捕获错误并将它们映射到状态代码。错误正则表达式搜索失败的 json 响应的 errorMessage 属性。如果您将状态代码 400 设置为默认值(空白) - 您会发现您的成功响应始终映射到状态代码 400。
您最好将 200 保留为默认(空白)正则表达式。然后设置特定的正则表达式值以检查您的不同错误消息。例如,您可以有多个特定的错误正则表达式状态代码和一个通用的包罗万象以产生 500 的结果。
【讨论】:
感谢您的解释。我所看到的是,优先考虑的不是“更具体的正则表达式匹配”;相反,它似乎是被使用的列表最下方的映射(带有与错误消息匹配的正则表达式)。您的示例在任何一种情况下都有效,但认为值得指出的是行为似乎与您所说的不同。 谢谢。我在这点上似乎是错的。我只是做了一堆测试,无法在紧密匹配或完全匹配的项目之间获得一致的优先级。可能最好避免任何接近的东西。我将编辑答案以删除对优先级的引用。 “问题是不再有默认映射来捕捉成功的响应” - 你有这个参考吗? “最好将 200 保留为默认(空白)正则表达式” - 但你说它不再有效,为什么?【参考方案2】:对于那些在这个问题上尝试了所有方法但无法完成这项工作的人(比如我),请查看这篇文章的 thedevkit 评论(节省了我的一天):
https://forums.aws.amazon.com/thread.jspa?threadID=192918
在下面完全复制它:
我自己也遇到过这个问题,我相信换行符 角色是罪魁祸首。
foo.* 将匹配出现的 "foo" 后跟任何字符 除了换行符。通常这是通过添加'/s'标志来解决的,即 “foo.*/s”,但 Lambda 错误正则表达式似乎不尊重这一点。
您可以使用类似的替代方法: foo(.|\n)*
【讨论】:
以上是关于在 API Gateway 中映射 Lambda 输出会导致服务器错误的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Lambda 函数中访问 API Gateway 模型?
如何将 API Gateway API 中的路径参数映射到 Java Lambda 的请求对象
AWS API Gateway按标头信息调用Lambda版本