有没有办法在AWS Lambda for Java中发出错误信号而不抛出异常?

时间:2017-07-14 17:18:28

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

如果我的Lambda使用消息Exception抛出404,则API网关中显示的响应为

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

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

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

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

API Gateway似乎无法识别出错误并始终返回200。

有没有办法让我的好功能代码在不抛出异常的情况下发出错误信号?

3 个答案:

答案 0 :(得分:2)

  

Lambda函数必须以错误退出,以便评估响应模式 - 只需在成功的Lambda响应中返回“errorMessage”字段,就不可能“伪造”错误响应。

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

答案 1 :(得分:1)

这更多是一个通用问题,而不是与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,对于服务器错误,statusCode通常为5XX。 API网关根据指定的statusCode通过将Lambda错误映射到HTTP错误响应来处理这些错误。为了使API网关传递错误类型(例如InvalidParameterException)作为对客户端的响应,Lambda函数必须在标头中包含标头(例如“ X-Amzn-ErrorType”:“ InvalidParameterException”)属性。

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

答案 2 :(得分:0)

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

AWS lambda的预期设计是...当您的代码有内部问题时,如果客户端尝试访问不存在的内容(400或300),它将返回500(难看的)。无论使用哪种框架(Java Spring和Python Django等都是如此)都是如此。

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

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

我希望这能回答您的问题。简而言之,

除了抛出错误,没有其他方法让lambda返回5xx,并且 这是预期的行为。