在Go中处理Lambda错误的问题

时间:2019-03-01 15:34:28

标签: lambda serverless-framework

我最近发现了一篇关于处理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

在整理时遇到麻烦,可以使用一个或两个指针。

1 个答案:

答案 0 :(得分:1)

我最终确定您使用的“整合”类型很重要。有一对,包括lambdaaws-proxylambda-proxy。默认情况下,它是lambda-proxy,这意味着所有请求都直接传递给函数,而无需任何集成映射或模板。您需要lambda才能做到。

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

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

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

为清楚起见,您总是在发送事件。APIGatewayProxyResponse返回,并且从处理程序中返回nil作为第二个参数。因此,成功的响应将是:

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

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

经验教训:-p