AWS API Gateway 集成响应 - 当响应包含换行符时,Lambda 错误正则表达式无法匹配

Cop*_*Man 7 http-status-codes amazon-web-services aws-lambda aws-api-gateway

我有 API Gateway 作为 lambda 函数的触发器。每当我的 lambda 引发异常时,它就会与集成响应中配置的模式匹配。问题是,如果异常包含换行符,则该模式将被忽略,并且默认返回 200 作为状态代码

要重现该问题:

  1. 使用 python 3.6 创建 lambda 并添加 API Gateway 作为触发器。
  2. 在 API 网关中,将集成响应正则表达式配置为“内部服务器错误。*”到自定义代码 500。(这意味着每当 lambda 返回前缀为“内部服务器错误”的消息时,它将被视为异常,状态代码将设置为500)。
  3. 在 lambda 中,引发包含“\n”新行的异常消息。
  4. 当您从 API Gateway 触发 lambda 时,它会返回 200 而不是 500 作为状态代码。

注意:如果从异常消息中删除换行符,它会正常工作并按预期返回 500。

有人遇到同样的问题吗?有什么解决办法吗?

Dav*_*ten 0

在 AWS 加入并修复此问题之前,我唯一的解决方法是捕获 Lambda 处理程序中引发的异常,并使用相同的消息引发包装异常,但将“\n”字符替换为“\n”。这是一个不完美的解决方案,因为目前非代理集成错误处理对该字符序列做了一些奇怪的事情,我最终在 json 中得到了两个反斜杠和一个 n,而不是一个反斜杠和 n(这就是您在json)。

关于这个集成问题,我注意到的一件有趣的事情是,cause异常的一部分(映射到引发异常的 json 块)确实能够正确处理换行符 (!)。这意味着用简单消息或无消息的异常包装异常会将正确格式化的原始异常消息传递到causejson 字段中。

以下是从使用我讨论的方法的非代理 api lambda 集成返回的 json 示例。您可以在 errorMessage 字段中看到额外的反斜杠,并且可以在 Cause errorMessage 字段中看到格式正确的换行符。

{
   "errorMessage":"ServerException: Error occurred at position, start= 40, finish=81 with desc='aircraftRegistrationMarking', value='VH OSA?':\\nWARNING - SUSPECT NON-SPEC IN AIRCRAFT REG. MARKING\\n?1 = 100100 = Space - Right Justified\\n",
   "errorType":"com.github.davidmoten.aws.helper.ServerException",
   "stackTrace":[
      "au.gov.amsa.beacon.decoder.Handler.handleRequest(Handler.java:76)",
      "sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)",
      "sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)",
      "sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)",
      "java.lang.reflect.Method.invoke(Method.java:498)"
   ],
   "cause":{
      "errorMessage":"Error occurred at position, start= 40, finish=81 with desc='aircraftRegistrationMarking', value='VH OSA?':\nWARNING - SUSPECT NON-SPEC IN AIRCRAFT REG. MARKING\n?1 = 100100 = Space - Right Justified\n",
      "errorType":"java.lang.RuntimeException",
      "stackTrace":[
         "au.gov.amsa.fgb.internal.DecodeAsJson.getData(DecodeAsJson.java:28)",
         "au.gov.amsa.fgb.internal.HexDecoder.decodeFullAsJson(HexDecoder.java:51)",
         "au.gov.amsa.fgb.internal.Decoder.decodeFullAsJson(Decoder.java:11)",
         "au.gov.amsa.fgb.Beacon15HexId.decodeHexToJson(Beacon15HexId.java:16)",
         "au.gov.amsa.beacon.decoder.Handler.handleRequest(Handler.java:39)",
         "sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)",
         "sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)",
         "sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)",
         "java.lang.reflect.Method.invoke(Method.java:498)"
      ]
   }
}
Run Code Online (Sandbox Code Playgroud)

为了您的兴趣(以及为了引起 AWS 的注意!),如果我不替换主要异常消息中的新行,这就是我得到的内容(无效的 JSON,缺少大量双引号字符):

{errorMessage=ServerException: Error occurred at position, start= 40, finish=81 with desc='aircraftRegistrationMarking', value='VH OSA?':
WARNING - SUSPECT NON-SPEC IN AIRCRAFT REG. MARKING
?1 = 100100 = Space - Right Justified
, errorType=com.github.davidmoten.aws.helper.ServerException, stackTrace=["au.gov.amsa.beacon.decoder.Handler.handleRequest(Handler.java:75)","sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)","sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)","sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)","java.lang.reflect.Method.invoke(Method.java:498)"], cause={errorMessage=Error occurred at position, start= 40, finish=81 with desc='aircraftRegistrationMarking', value='VH OSA?':
WARNING - SUSPECT NON-SPEC IN AIRCRAFT REG. MARKING
?1 = 100100 = Space - Right Justified
, errorType=java.lang.RuntimeException, stackTrace=["au.gov.amsa.fgb.internal.DecodeAsJson.getData(DecodeAsJson.java:28)","au.gov.amsa.fgb.internal.HexDecoder.decodeFullAsJson(HexDecoder.java:51)","au.gov.amsa.fgb.internal.Decoder.decodeFullAsJson(Decoder.java:11)","au.gov.amsa.fgb.Beacon15HexId.decodeHexToJson(Beacon15HexId.java:16)","au.gov.amsa.beacon.decoder.Handler.handleRequest(Handler.java:38)","sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)","sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)","sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)","java.lang.reflect.Method.invoke(Method.java:498)"]}}
Run Code Online (Sandbox Code Playgroud)