【问题标题】:Is there any way to signal an error in AWS Lambda for Java without throwing an exception?有什么方法可以在不引发异常的情况下在 AWS Lambda for Java 中发出错误信号?
【发布时间】:2019-08-20 14:46:24
【问题描述】:

如果我的 Lambda 抛出带有消息 404Exception,那么在 API 网关中看到的响应是

{
  "errorMessage":"404",
  "errorType":"java.lang.Exception",
  "stackTrace":[..."]
}

我可以匹配errorMessage来影响HTTP结果。

但是,如果我有效地返回相同的结果,即:

{
  "errorMessage":"404",
  "errorType":"Error"
}

API Gateway 似乎没有识别出错误并总是返回 200。

有什么方法可以让我漂亮的函数式代码在不引发异常的情况下发出错误信号?

【问题讨论】:

    标签: java amazon-web-services aws-lambda aws-api-gateway


    【解决方案1】:

    Lambda 函数必须以错误退出,才能评估响应模式——不可能通过简单地在成功的 Lambda 响应中返回“errorMessage”字段来“伪造”错误响应。

    https://aws.amazon.com/blogs/compute/error-handling-patterns-in-amazon-api-gateway-and-aws-lambda/

    【讨论】:

      【解决方案2】:

      这更像是一个通用问题,而不是与 Java 相关的问题,因为 AWS API Gateway 集成与编写 AWS Lambda 函数的语言没有太大关系。

      您可以按照此处 AWS 文档中的指南来实现返回自定义错误消息:Handle Custom Lambda Errors in API Gateway

      对于 Lambda 自定义集成,您必须将 Lambda 在集成响应中返回的错误映射到客户端的标准 HTTP 错误响应。否则,默认情况下 Lambda 错误会作为 200 OK 响应返回,结果对于您的 API 用户来说并不直观。

      Lambda 可以返回两种类型的错误:

      1. Standard Errors
      2. Custom Errors

      在您的 API 中,您必须以不同方式处理这些问题。

      使用 Lambda 代理集成,Lambda 需要返回以下格式的输出:

      {
        "isBase64Encoded" : "boolean",
        "statusCode": "number",
        "headers": { ... },
        "body": "JSON string"
      }
      

      在此输出中,statusCode 通常为 4XX 表示客户端错误,5XX 表示服务器错误。 API Gateway 根据指定的 statusCode,通过将 Lambda 错误映射到 HTTP 错误响应来处理这些错误。为了让 API Gateway 传递错误类型(例如,InvalidParameterException),作为对客户端的响应的一部分,Lambda 函数必须在标头中包含标头(例如,“X-Amzn-ErrorType”:“InvalidParameterException”)属性。

      有关更多详细信息,请在此处查看 AWS 的官方文档:Handle Lambda Errors in API Gateway

      【讨论】:

      • 这几乎不能满足我的赏金需求,只是对文档的重新整理。在 JavaScript 中,不需要抛出任何东西,只需调用一个回调,将异常作为参数。在 Java 中似乎没有这样的选项
      【解决方案3】:

      我认为这更像是一个设计问题,而不是 Java/AWS 问题。

      AWS lambda 的预期设计是......当您的代码存在内部问题时,它将返回 500(丑陋的),而如果客户端试图访问不存在的东西(400 或 300)。无论框架如何都是如此(Java Spring 和 Python Django 等也是如此)

      如果你的函数很好地检测到错误并返回一个完美的对象 (json),那么它(根据定义)不是你的代码的内部问题。换句话说,您的代码按预期运行。就 lambda 而言,它是 200 好的。

      如果你想要丑陋的响应 (5xx),你需要抛出一个错误/异常。否则,lambda 会认为您的代码很好,并且您在 json 中抛出的任何错误都是正常的有效负载。这并不是说您不应该在 json 响应中编码您的错误。包含特定于应用程序/业务逻辑驱动的错误以像这样传递有效负载是完全正常的。

      我希望这能回答您的问题。总之,

      除了抛出错误和 这是预期的行为。

      【讨论】:

      • 我遇到了一个错误情况,但我可能无法对其进行编码,以便将其作为处理程序抛出的异常,除了可能是通用的“RuntimeError”,然后我无法使用步骤函数的错误捕获机制与
      • 更多细节会有所帮助。
      猜你喜欢
      • 1970-01-01
      • 2020-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-21
      • 2021-12-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多