Ir para o conteúdo

Usei um modelo do CloudFormation ou uma definição de OpenAPI para criar uma API REST com integração com o Lambda. Por que recebo erros “Execution failed” do API Gateway?

5 minuto de leitura
0

Eu usei um modelo do AWS CloudFormation para criar uma API REST do Amazon API Gateway com integração com o AWS Lambda. Quando uso o método da API para invocar minha função do Lambda, recebo uma mensagem de erro e um código de status 500.

Breve descrição

Se você tiver uma API REST do API Gateway com integração do Lambda, a API deverá usar o método HTTP POST para invocar a função do Lambda de backend. Se você usar qualquer outro método HTTP para a solicitação de integração de backend, como ANY ou GET, a invocação falhará. Em seguida, o API Gateway retorna uma mensagem de erro semelhante ao exemplo a seguir no Amazon CloudWatch Logs:

Mon Oct 14 14:08:49 UTC 2019 : Received response. Status: 403, Integration latency: 3 msMon 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 frontend da API REST.

Se você criar uma API REST com integração com o Lambda, use um dos métodos a seguir para especificar o POST para a solicitação de integração de backend:

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

Resolução

Observação: se você receber erros ao executar comandos da AWS CLI, consulte Solução de problemas da AWS CLI. Além disso, verifique se você está usando a versão mais recente da AWS CLI.

É uma prática recomendada 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 na solicitação de integração de backend depende da definição do modelo original. O processo de atualização de um API Gateway implantado pelo CloudFormation é diferente do processo de atualização de um API Gateway criado pelo OpenAPI.

Gateways de API criados no CloudFormation

Para os gateways de API criados pelo CloudFormation, você deve atualizar o modelo de pilha. Se você definiu o recurso AWS::ApiGateway::Method em seu modelo do CloudFormation para criar seu método, atualize a propriedade HttpMethod para POST. Para obter instruções, consulte Exemplos.

Se seu método usa uma definição de OpenAPI para a propriedade Body do recurso AWS::ApiGateway::RestAPI, defina httpMethod em seu arquivo de definição de API como POST. Para obter instruções, consulte objeto x-amazon-apigateway-integration. Além disso, veja o exemplo do modelo Swagger no repositório aws-samples do GitHub.

Para atualizar sua API, execute as atualizações de pilha do AWS CloudFormation com o modelo editado:

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

    "httpMethod" : "POST"

Gateways de API criados fora do CloudFormation

Use o console para atualizar o método

Conclua as etapas a seguir:

  1. Abra o console do API Gateway.
  2. Escolha sua API.
  3. Em Recursos, escolha o método HTTP integrado ao Lambda.
  4. Em Execução do método, escolha Solicitação de integração.
  5. Em Solicitação de integração, para o método HTTP, edite o nome da função do Lambda.
  6. Quando solicitado a Adicionar permissão à função do Lambda, escolha OK.
  7. Implante sua API.
  8. (Opcional) Teste o método HTTP integrado ao Lambda.

Observação: sempre que OK é selecionado no prompt Adicionar permissão à função do Lambda, o console adiciona uma nova instrução à política de recursos da função do Lambda. Certifique-se de não exceder o limite de tamanho da política de recursos. Para obter mais informações, consulte Configuração, implantação e execução de funções e Configurar uma solicitação de integração de API usando o console do API Gateway.

Use a AWS CLI para atualizar a tabela

Conclua as etapas a seguir:

  1. Para atualizar o método HTTP de integração para POST, execute o comando put-integration:

    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
  2. Para implantar os recursos configurados para uma API em um estágio existente, execute o comando create-deployment:

    aws apigateway create-deployment \--rest-api-id 1234123412 \
    --stage-name dev \
    --description 'Deployment to an existing dev stage'

Use uma importação de definição do OpenAPI para atualizar o método

Conclua as etapas a seguir:

  1. Em seu arquivo de definição de API, defina o valor da propriedade httpMethod 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. Para atualizar sua API, importe 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 de calculadora com duas integrações de serviços da AWS e uma integração sem proxy do Lambda

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

Como faço para resolver erros HTTP 502 das APIs REST do API Gateway com integração de proxy do Lambda?

Como resolvo erros “Invalid mapping expression specified” do API Gateway?