【问题标题】:Issue handling Lambda errors in Go在 Go 中处理 Lambda 错误的问题
【发布时间】:2019-03-04 06:56:41
【问题描述】:

我最近发现一篇文章对处理 Go 和 Lambda 中的错误有非常具体的建议:https://hackernoon.com/error-handling-with-api-gateway-and-go-lambda-functions-fe0e10808732

我在实施它时遇到了麻烦。我采用了他们的 lambdaError 结构并将其包含在我的源代码中。在出现错误时,我正在执行以下操作:

return Response{ StatusCode: 400, Body: "" }, lambdaError{
    code: "INVALID_REQUEST",
    message: "An invalid content structure was provided",
    origErr: err,
}

错误会正确读取到日志,但是 Lambda 会向请求发送带有正文的 502:

{
    "message": "Internal server error"
}

在 serverless.yml 中,我将模板添加到我的响应中:

  user_create:
    handler: bin/user-create
    name: UserCreate
    description: Creates a new user account
    events:
      - http:
          path: user
          method: post
          response:
            statusCodes:
              400:
                pattern: '.*"statusCode":400,.*'
                template: |
                  #set ($errorMessageObj = $util.parseJson($input.path('$.errorMessage')))
                  {
                    "code" : "$errorMessageObj.code",
                    "message" : "$errorMessageObj.public_message"
                  }
                headers:
                  Content-Type: "'application/json'"
          cors: true

无法解决这个问题,可以使用一两个指针。

【问题讨论】:

    标签: lambda serverless-framework


    【解决方案1】:

    我最终确定您使用的“集成”类型很重要。有一对,包括lambdaaws-proxylambda-proxy。默认情况下它是lambda-proxy,这意味着所有请求都直接交给函数,没有任何集成映射或模板。您需要 lambda 来执行此操作。

    正确的答案和似乎是标准可接受的做法是始终将错误发送为nil,并将状态代码和响应设置为响应消息。如果您发送并返回错误,Lambda 将始终返回带有 502 的内部错误。

    这也意味着日志记录和错误跟踪完全取决于您。在某些情况下,这是最好的方法,如果您采用 lambda 集成路线,则必须定义标头、接受的正文并正确使用“集成映射”过程。

    您必须决定要使用 Lambda 的方式。

    为了清楚起见,您总是发送 events.APIGatewayProxyResponse 和 nil 作为您的处理程序的第二个参数。所以一个成功的响应应该是:

    return Response{
      Body: body,
      StatusCode: 200,
      Headers: map[string]string{
        "Content-Type": "application/json",
      },
    }, nil
    

    错误响应将简单地是相同的响应结构,但 StatusCode 和 Body 值更改为您的响应需求。

    经验教训:-p

    【讨论】:

    • 哇,我什至错过了那个。无服务器应该实现架构并在部署时对其进行验证的另一个原因。
    猜你喜欢
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 2014-11-27
    • 2014-07-31
    • 1970-01-01
    • 2020-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多