【问题标题】:AWS API Gateway Integration Response - Lambda Error Regex fails matching when response contains new lineAWS API Gateway 集成响应 - 当响应包含新行时,Lambda 错误正则表达式匹配失败
【发布时间】:2022-05-06 12:37:37
【问题描述】:

我将 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。

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

【问题讨论】:

  • 这里也一样。此外,在我的情况下,返回的 json 无效。来吧 AWS,解决这个问题!

标签: amazon-web-services aws-lambda aws-api-gateway http-status-codes


【解决方案1】:

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

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

这是一个使用我讨论过的方法的非代理 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)"
      ]
   }
}

为了您的利益(并引起 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)"]}}

【讨论】:

    猜你喜欢
    • 2018-10-13
    • 2018-03-22
    • 2023-03-05
    • 2019-06-04
    • 2018-06-09
    • 2016-11-16
    • 1970-01-01
    • 2020-03-24
    • 2018-05-02
    相关资源
    最近更新 更多