Por que estou recebendo erros de “Falha na execução devido à configuração” do API Gateway depois de usar um modelo do CloudFormation ou uma definição da OpenAPI para criar uma API REST com uma integração do Lambda?

6 minuto de leitura
0

Eu usei um modelo do AWS CloudFormation (ou definição de OpenAPI) para criar uma API REST do Amazon API Gateway com integração com o AWS Lambda. Quando tento invocar minha função do Lambda usando o método da API, recebo a seguinte mensagem de erro e um código de status 500: “Erro de Falha na execução devido à configuração.” O que está causando o erro e como soluciono o problema?

Breve descrição

Se você tiver uma API REST do API Gateway com integração do Lambda, a API deverá invocar a função do Lambda de back-end usando o método HTTP POST. Se você usar qualquer outro método HTTP, por exemplo, ANY ou GET, para a solicitação de integração de back-end, a invocação falhará. Em seguida, o API Gateway retornará uma mensagem de erro semelhante ao exemplo a seguir em seuAmazon CloudWatch Logs:

Mon Oct 14 14:08:49 UTC 2019 : Received response. Status: 403, Integration latency: 3 ms
Mon Oct 14 14:08:49 UTC 2019 : Endpoint response headers: {Date=Mon, 14 Oct 2019 14:08:49 GMT, Content-Length=130, Connection=keep-alive, x-amzn-RequestId=abc1d2ef-34ab-56c7-de8f-90123a456789}
Mon Oct 14 14:08:49 UTC 2019 : Endpoint response body before transformations: <AccessDeniedException>
<Message>Unable to determine service/operation name to be authorized</Message>
</AccessDeniedException>
Mon Oct 14 14:08:49 UTC 2019 : Lambda invocation failed with status: 403. Lambda request id: abc1d2ef-34ab-56c7-de8f-90123a456789
Mon Oct 14 14:08:49 UTC 2019 : Execution failed due to configuration error:
Mon Oct 14 14:08:49 UTC 2019 : Method completed with status: 500

Observação: você ainda pode configurar qualquer método HTTP para o front-end da sua API REST.

Você deverá especificar o método POST para a solicitação de integração de back-end se criar uma API REST com integração do Lambda usando qualquer um dos seguintes:

Observação: se você usar o console do API Gateway para configurar uma integração do Lambda, a solicitação de integração de back-end será automaticamente definida como POST.

Resolução

A melhor prática do CloudFormation é gerenciar todos os recursos da pilha por meio do AWS CloudFormation e não fazer alterações nos recursos da pilha fora do CloudFormation.

O método usado para alterar o método HTTP para POST para a solicitação de integração de back-end depende da definição do modelo original. Por exemplo, o processo de atualização de um gateway de API implantado usando o CloudFormation é diferente de um gateway de API criado com OpenAPI ou AWS CLI.

Para alterar o método de solicitação da integração para POST para gateways de API criados usando o CloudFormation

Para obter instruções, consulte Modificar um modelo de pilha.

A. Se seu método foi criado definindo o recurso AWS::ApiGateway::Method em seu modelo do CloudFormation, atualize a propriedade HttpMethod para POST. Para obter instruções, consulte a seção Exemplos da documentação do AWS::ApiGateway::Method.

B. Se seu método incluiu uma definição de OpenAPI como o valor da propriedade Body do recurso AWS::ApiGateway::RestAPI: Defina o valor da propriedade httpMethod em seu arquivo de definição de API como POST.  Para obter instruções, consulte o objeto x-amazon-apigateway-integration e o exemplo do modelo Swagger no repositório aws-samples do GitHub.

Atualize sua API executando atualizações de pilha do AWS CloudFormation com o modelo editado:

"x-amazon-apigateway-integration" : {
    "type" : "aws",

    "httpMethod" : "POST"

Para alterar o método HTTP da integração de back-end para POST para gateways de API criados fora do CloudFormation

Método de atualização usando o console

  1. No console do API Gateway, escolha sua API.
  2. No painel Recursos, escolha o método HTTP que tem a integração do Lambda.
  3. No painel Execução do método, escolha Solicitação de integração.
  4. No painel Solicitação de integração, para o método HTTP, edite o nome da função do Lambda clicando no ícone de lápis à direita do nome da função e, em seguida, clique no ícone de marca de seleção que aparece à direita.
  5. Quando solicitado a Adicionar permissão à função do Lambda, escolha OK.
  6. Implante sua API.
  7. (Opcional) Teste o método HTTP que tem a integração do Lambda.

Observação: o console adiciona uma nova instrução à política de recursos da função do Lambda sempre que OK é selecionado no prompt Adicionar permissão à função do Lambda. Observe o tamanho da política de recursos da sua função para garantir que ela não atinja o limite de tamanho da política de recursos. Veja: Configuração, implantação e execução da função.

Para obter mais informações, consulte Introdução ao API Gateway e Configurar uma solicitação de integração de API usando o console do API Gateway.

Atualizar o método usando a AWS CLI

  1. Execute o método put-integration para atualizar o método http de integração para POST:
aws apigateway put-integration \
--rest-api-id 1234123412 \
--resource-id a1b2c3 \
--http-method ANY \
--type AWS \
--integration-http-method POST \
--uri 'arn:aws:apigateway:us-west-2:lambda:path//2015-03-31/functions/arn:aws:lambda:us-east-1:123412341234:function:function_name/invocations
  1. Implante os recursos configurados para uma API em um estágio existente:
aws apigateway create-deployment \
--rest-api-id 1234123412 \
--stage-name dev \
--description 'Deployment to an existing dev stage'

Observação: se você receber erros ao executar comandos da AWS CLI, verifique se está usando a versão mais recente da AWS CLI.

Atualiza o método usando a importação de definições do OpenAPI

  1. Defina o valor da propriedade httpMethod em seu arquivo de definição de API como POST. Para obter instruções, consulte o objeto x-amazon-apigateway-integration e o exemplo do modelo Swagger no repositório aws-samples do GitHub.
  2. Atualize sua API importando o arquivo de definição de API editado para o API Gateway. Consulte Importar um arquivo OpenAPI para atualizar uma definição de API existente.

Informações relacionadas

Integração AWS::ApiGateway::Method

TUTORIAL: Crie uma API REST Calc com duas integrações de serviços da AWS e uma integração sem proxy do Lambda

Eu defini minha integração do Lambda no Amazon API Gateway usando uma variável de estágio. Por que recebo um “erro interno do servidor” e um código de status 500 quando invoco o método da API?

Como resolvo os erros HTTP 502 “Resposta malformada de proxy do Lambda” das APIs REST do API Gateway?

Como resolvo erros de “Expressão de mapeamento inválida especificada” do API Gateway?