Go中Lambda错误的问题处理

Go中Lambda错误的问题处理,lambda,serverless-framework,Lambda,Serverless Framework,我最近发现了一篇文章,其中对处理Go和Lambda中的错误提出了非常具体的建议: 但是我在实现它时遇到了困难。我已经获取了他们的lambdaError结构,并将其包含在我的源代码中。对于一个错误,我正在执行以下操作: return Response{ StatusCode: 400, Body: "" }, lambdaError{ code: "INVALID_REQUEST", message: "An invalid content structure was provid

我最近发现了一篇文章,其中对处理Go和Lambda中的错误提出了非常具体的建议:

但是我在实现它时遇到了困难。我已经获取了他们的lambdaError结构,并将其包含在我的源代码中。对于一个错误,我正在执行以下操作:

return Response{ StatusCode: 400, Body: "" }, lambdaError{
    code: "INVALID_REQUEST",
    message: "An invalid content structure was provided",
    origErr: err,
}
错误正确读取日志,但是Lambda发送请求a 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
aws代理
lambda代理
。默认情况下,它是
lambda proxy
,这意味着所有请求都直接传递给函数,而不需要任何集成映射或模板。您需要
lambda
来完成此操作

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

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

你必须决定你想和兰博达走哪条路

为了清楚起见,您总是将events.APIGatewayProxyResponse发回,并将nil作为处理程序的第二个参数。因此,一个成功的回应是:

return Response{
  Body: body,
  StatusCode: 200,
  Headers: map[string]string{
    "Content-Type": "application/json",
  },
}, nil
错误响应可以是相同的响应结构,但状态代码和主体值会根据您的响应需要进行更改


吸取的教训:-p

哇,连我都错过了。serverless应该实现架构并在部署时验证它的另一个原因。