AWS API 网关:未选取错误的正则表达式

rab*_*ens 5 f# amazon-web-services aws-lambda aws-api-gateway

我有一个绑定到 AWS API 网关的 Lambda 函数。当我喜欢的东西把它/foo/barbar不存在的,我的函数返回(正确地)是这样的:

{
  "code": 404,
  "message": "bar not found"
}
Run Code Online (Sandbox Code Playgroud)

我现在也希望它的状态代码是 404,但是按照我在网上可以找到的教程,到目前为止我没有成功。我做了什么:

我为 404 创建了一个方法响应,如下所示: 404响应

在集成响应中,我设置了以下内容: 404整合响应

据我了解,当404出现在响应文档中时,这应该将代码设置为 404 ,但我仍然得到200.

我错过了什么?

rab*_*ens 5

我进一步调查了一些,发现 API 网关非常挑剔它期望它的错误消息的位置,以及我必须如何将它们取出。

文档中很难找到该errorMessage属性被认为与 Lambda 错误正则表达式匹配,并且在文档中很难找到,并且这篇文章第一个答案指出您在使用 Java 8 时必须抛出异常。我将 .net 用于我的 Lambda函数,所以我做了这个非常简单的事情:

new Exception("404") |> raise
Run Code Online (Sandbox Code Playgroud)

然后我设置了 Lambda 错误正则表达式404并且它起作用了。

我尝试的下一件事是:

new Exception("foo 404 bar") |> raise
Run Code Online (Sandbox Code Playgroud)

使用正则表达式.*404.*它仍然有效。

现在事情来了:我试图发出一个 JSON 对象作为错误,但我在 C# 或 F# 中找不到任何东西让我这样做,所以我想出了以下内容:

type Error = {
    code: int
    message: string
}

...

new Exception({ code = 404; message = name |> sprintf "%s not found" } |> JsonConvert.SerializeObject) |> raise
Run Code Online (Sandbox Code Playgroud)

繁荣,我又得到了 200。

所以我由此得出结论,AWS 不喜欢errorMessage属性中的字符串化 JSON ,所以我现在只输出一个像这样的简单字符串:

new Exception(name |> sprintf "404: %s not found") |> raise
Run Code Online (Sandbox Code Playgroud)

并使用正则表达式404:.*,它现在可以工作了。这意味着,我必须以某种方式使用 API 网关中的映射来构建我想要的输出对象。

这很不方便,而且很容易绊倒……