Esta página descreve como resolver problemas de erros que recebe numa resposta de um pedido à sua API.
BAD_GATEWAY
Se receber o código de erro 13
e a mensagem BAD_GATEWAY
, isto indica que o proxy de serviço extensível (ESP) não consegue alcançar o back-end do serviço.
Verifique o seguinte:
- Certifique-se de que o serviço de back-end está em execução. A forma como o faz depende do
back-end.
-
Para o ambiente flexível do App Engine, o código de erro da mensagem
BAD_GATEWAY
pode ser502
. Consulte a secção Erros específicos do ambiente flexível do App Engine para mais informações. - Para o Compute Engine, consulte o artigo Resolução de problemas dos Cloud Endpoints no Compute Engine para ver detalhes.
-
Para o GKE, tem de usar o SSH para aceder ao pod e usar o comando
curl
. Consulte a secção Resolução de problemas de pontos finais no Google Kubernetes Engine para ver detalhes.
-
Para o ambiente flexível do App Engine, o código de erro da mensagem
- A porta do endereço IP correta do serviço de back-end está especificada:
-
Para o GKE, verifique o valor da flag
--backend
do ESP (a opção abreviada é-a
) no ficheiro de manifesto de implementação (frequentemente denominadodeployment.yaml
). -
Para o Compute Engine, verifique o valor da flag
--backend
ESP (a opção abreviada é-a
) no comandodocker run
.
-
Para o GKE, verifique o valor da flag
reset reason: connection failure
Se receber o código HTTP 503
ou o código gRPC 14
e a mensagem upstream connect error or disconnect/reset before headers. reset reason: connection failure
, isto indica que o ESPv2 não consegue aceder ao back-end do serviço.
Para resolver problemas, verifique novamente os itens abaixo.
Endereço de back-end
O ESPv2 deve ser configurado com o endereço do back-end correto. Os problemas comuns incluem:
- O esquema do endereço de back-end deve corresponder ao tipo de aplicação de back-end.
Os back-ends da OpenAPI devem ser
http://
e os back-ends da gRPC devem sergrpc://
. - Para o ESPv2 implementado no Cloud Run, o esquema do endereço de back-end deve ser
https://
ougrpcs://
. O elementos
indica ao ESPv2 para configurar o TLS com o back-end.
Procura de DNS
Por predefinição, o ESPv2 tenta resolver nomes de domínios para endereços IPv6. Se a resolução IPv6 falhar, o ESPv2 recorre a endereços IPv4.
Para algumas redes, o mecanismo de alternativa pode não funcionar como esperado.
Em alternativa, pode forçar o ESPv2 a usar endereços IPv4 através da flag --backend_dns_lookup_family
.
Este erro é comum se configurar um conetor de VPC sem servidor para o ESPv2 implementado no Cloud Run. As VPCs não suportam tráfego IPv6.
API is not enabled for the project
Se enviou uma chave da API no pedido, uma mensagem de erro como "A API my-api.endpoints.example-project-12345.cloud.goog não está ativada para o projeto" indica que a chave da API foi criada num projeto Google Cloud diferente do da API. Para corrigir este problema, pode criar a chave da API no Google Cloud mesmo Google Cloud projeto ao qual a API está associada ou ativar a API no Google Cloud projeto no qual a chave da API foi criada.
Service control request failed with HTTP response code 403
Se receber o código de erro 14
e a mensagem Service control request failed
with HTTP response code 403
, isto indica que a API Service Control (servicecontrol.googleapis.com
) não está ativada no projeto.
Consulte o artigo Verificar os serviços necessários para se certificar de que todos os serviços que o Endpoints e o ESP requerem estão ativados no seu projeto.
Consulte o artigo Verificar autorizações necessárias para se certificar de que tem todas as autorizações necessárias para a conta de serviço associada à instância que executa o ESP.
Method doesn't allow unregistered callers
O ESP responde com o erro,
Method doesn't allow unregistered callers
, quando especifica uma chave da API
na secção security
do seu documento OpenAPI, mas o pedido à sua API
não tem uma chave da API atribuída a um parâmetro de consulta denominado key
.
Se precisar de gerar uma chave da API para fazer chamadas para a sua API, consulte o artigo Criar uma chave da API.
Method does not exist
A resposta, Method does not exist
, significa que o método HTTP (GET
, POST
ou outro) no caminho do URL especificado não foi encontrado. Para
resolver problemas, compare a configuração do serviço que implementou para se
certificar de que o nome do método e o caminho do URL que está a enviar no pedido
correspondem:
Na Google Cloud consola, aceda à página Serviços de pontos finais do seu projeto.
Se tiver mais do que uma API, selecione a API para a qual enviou o pedido.
Clique no separador Histórico de implementação.
Selecione a implementação mais recente para ver a configuração do serviço.
Se não vir o método que está a chamar especificado na secção paths
do seu documento OpenAPI, adicione o método ou a flag x-google-allow
ao nível superior do ficheiro:
x-google-allow: all
Esta flag significa que pode evitar listar todos os métodos suportados no seu back-end no documento OpenAPI. Quando all
é usado, todas as chamadas, com ou sem uma chave de API ou autenticação do utilizador, passam pelo ESP para a sua API. Consulte
x-google-allow
para mais informações.
Erros específicos do ambiente flexível do App Engine
Esta secção descreve as respostas de erro das APIs implementadas no ambiente flexível do App Engine.
Código de erro 502
ou 503
O App Engine pode demorar alguns minutos a responder com êxito aos pedidos.
Se enviar um pedido e receber um HTTP 502
, 503
ou algum outro erro do servidor, aguarde um minuto e tente novamente.
Mensagem de erro BAD_GATEWAY
Um código de erro 502
com BAD_GATEWAY
na mensagem indica normalmente que o App Engine terminou a aplicação porque ficou sem memória.
A VM flexível do App Engine predefinida só tem 1 GB de memória, com apenas 600 MB disponíveis para o contentor da aplicação.
Para resolver problemas do código de erro 502
:
Na Google Cloud consola, aceda à página Registo:
Selecione o Google Cloud projeto aplicável na parte superior da página.
Selecione Google App Engine Application e abra
vm.syslog
.Procure uma entrada de registo semelhante à seguinte:
kernel: [ 133.706951] Out of memory: Kill process 4490 (java) score 878 or sacrifice child kernel: [ 133.714468] Killed process 4306 (java) total-vm:5332376kB, anon-rss:2712108kB, file-rss:0kB
Se vir uma entrada
Out of memory
no registo:Adicione o seguinte ao ficheiro
app.yaml
para aumentar o tamanho da VM predefinida:resources: memory_gb: 4
Volte a implementar a API:
gcloud app deploy
Se tiver a opção rollout_strategy: managed
especificada na secção endpoints_api_service
do ficheiro app.yaml
, use o seguinte comando para voltar a implementar a sua API:
gcloud app deploy
Consulte o artigo Implementar a sua API e ESP para mais informações.
Verificar os registos do Cloud Logging
Para usar os registos do Cloud Logging para ajudar a resolver problemas de erros de resposta:
Na Google Cloud consola, aceda à página Registo.
Na parte superior da página, selecione o Google Cloud projeto.
No menu pendente do lado esquerdo, selecione API produzida > [YOUR_SERVICE_NAME].
Ajuste o intervalo de tempo até ver uma linha que mostre o erro de resposta.
Expanda o payload JSON e procure
error_cause
.Se o valor
error_cause
estiver definido comoapplication
, isto indica um problema no seu código.Se o
error cause
for qualquer outra coisa e não conseguir corrigir o problema, exporte o registo e inclua-o em qualquer comunicação que tenha com a Google.
Consulte o seguinte para mais informações:
Para ver detalhes sobre a estrutura dos registos no Explorador de registos, consulte a Referência dos registos de pontos finais
Comece a usar o Explorador de registos.
Use consultas de registo avançadas para filtragem avançada, como obter todos os pedidos com uma latência superior a 300 milissegundos.
Problemas com o exemplo Invoke-WebRequest
Em algumas versões do Windows PowerShell, o exemplo Invoke-WebRequest
nos
tutoriais
falha. Também recebemos uma denúncia de que a resposta continha uma lista de bytes não assinados que tiveram de ser convertidos em carateres. Se o exemplo
Invoke-WebRequest
não devolveu o resultado esperado, experimente enviar o pedido
com outra aplicação. Seguem-se algumas sugestões:
- Inicie o Cloud Shell e siga os passos do Linux no tutorial que estava a usar para enviar o pedido.
Instale uma aplicação de terceiros, como a extensão do navegador Chrome Postman (oferecida por
www.getpostman.com
). Quando criar o pedido no Postman:- Selecione
POST
como verbo HTTP. - Para o cabeçalho, selecione a chave
content-type
e o valorapplication/json
. - Para o corpo, introduza:
{"message":"hello world"}
No URL, use a chave da API real em vez da variável de ambiente. Por exemplo:
- No ambiente flexível do App Engine:
https://example-project-12345.appspot.com/echo?key=AIza...
- Noutros backends:
http://192.0.2.0:80/echo?key=AIza...
- No ambiente flexível do App Engine:
- Selecione
Transfira e instale o
curl
, que executa na linha de comandos. Uma vez que o Windows não processa as aspas duplas aninhadas dentro de aspas simples, tem de alterar a opção no exemplo para:--data
--data "{\"message\":\"hello world\"}"