在 Go 中处理 Lambda 错误的问题
Issue handling Lambda errors in Go
我最近发现一篇文章对处理 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
无法解决这个问题,可以使用一两个指针。
我最终确定 "integration" 您使用的类型很重要。有一对,包括 lambda
、aws-proxy
和 lambda-proxy
。默认情况下,它是 lambda-proxy
,这意味着所有请求都直接传递给函数,没有任何集成映射或模板。您需要 lambda
才能做到这一点。
正确的答案和似乎是标准可接受的做法是始终将错误发送为 nil
并将状态代码和响应设置为响应消息。如果您发送并返回错误,Lambda 将始终 return 内部错误 502。
这也意味着日志记录和错误跟踪完全由您决定。在某些情况下,这是最好的方法,如果您采用 lambda
集成路线,则必须定义 headers、接受 body 并正确使用 "integration mapping" 流程。
您必须决定使用 Lambda 的方式。
为了完全清楚起见,您总是从您的处理程序返回一个 events.APIGatewayProxyResponse 和 nil 作为第二个参数。因此,成功的响应将是:
return Response{
Body: body,
StatusCode: 200,
Headers: map[string]string{
"Content-Type": "application/json",
},
}, nil
并且错误响应将简单地是相同的响应结构,但 StatusCode 和 Body 值更改为您的响应需求。
经验教训:-p
我最近发现一篇文章对处理 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
无法解决这个问题,可以使用一两个指针。
我最终确定 "integration" 您使用的类型很重要。有一对,包括 lambda
、aws-proxy
和 lambda-proxy
。默认情况下,它是 lambda-proxy
,这意味着所有请求都直接传递给函数,没有任何集成映射或模板。您需要 lambda
才能做到这一点。
正确的答案和似乎是标准可接受的做法是始终将错误发送为 nil
并将状态代码和响应设置为响应消息。如果您发送并返回错误,Lambda 将始终 return 内部错误 502。
这也意味着日志记录和错误跟踪完全由您决定。在某些情况下,这是最好的方法,如果您采用 lambda
集成路线,则必须定义 headers、接受 body 并正确使用 "integration mapping" 流程。
您必须决定使用 Lambda 的方式。
为了完全清楚起见,您总是从您的处理程序返回一个 events.APIGatewayProxyResponse 和 nil 作为第二个参数。因此,成功的响应将是:
return Response{
Body: body,
StatusCode: 200,
Headers: map[string]string{
"Content-Type": "application/json",
},
}, nil
并且错误响应将简单地是相同的响应结构,但 StatusCode 和 Body 值更改为您的响应需求。
经验教训:-p