Проблема обработки лямбда-ошибок в Go - PullRequest
0 голосов
/ 01 марта 2019

Я недавно нашел статью, в которой есть очень конкретное предложение по обработке ошибок в 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 Iдобавил шаблон к моему ответу:

  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 голосов
/ 03 марта 2019

В итоге я определил, что тип «интеграции», который вы используете, имеет значение.Есть пара, включающая lambda, aws-proxy и lambda-proxy.По умолчанию это 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

И ответом об ошибке будет просто та же структура ответа, но с изменениями значений StatusCode и Body в соответствии с вашими потребностями ответа.

Извлеченный урок: -р

...