Auf dieser Seite wird beschrieben, wie Sie Fehler beheben, die als Antwort auf eine Anfrage an Ihre API zurückgegeben werden.
BAD_GATEWAY
Wenn Sie den Fehlercode 13
und die Meldung BAD_GATEWAY
erhalten, bedeutet dies, dass der Extensible Service Proxy (ESP) das Dienst-Back-End nicht erreichen kann.
Prüfen Sie Folgendes:
- Ob der Back-End-Dienst ausgeführt wird. Die dafür nötigen Schritte hängen vom Backend ab.
-
Für die flexible App Engine-Umgebung kann die Meldung
BAD_GATEWAY
den Fehlercode502
haben. Weitere Informationen finden Sie im Abschnitt Für die flexible App Engine-Umgebung spezifische Fehler. - Lesen Sie für Compute Engine die Fehlerbehebung für Cloud Endpoints in Compute Engine.
-
Verwenden Sie für GKE SSH, um auf den Pod zuzugreifen, und anschließend
curl
. Weitere Informationen finden Sie unter Fehlerbehebung bei Endpoints in Google Kubernetes Engine.
-
Für die flexible App Engine-Umgebung kann die Meldung
- Ob der richtige IP-Adressport für den Back-End-Dienst angegeben wurde:
-
Prüfen Sie für GKE den Wert des Flags
--backend
für den ESP (Kurzform-a
) in der Manifestdatei der Bereitstellung (heißt häufigdeployment.yaml
). -
Prüfen Sie für Compute Engine den Wert des Flags
--backend
für den ESP (Kurzform-a
) im Befehldocker run
.
-
Prüfen Sie für GKE den Wert des Flags
reset reason: connection failure
Wenn Sie den HTTP-Code 503
oder den gRPC-Code 14
und die Meldung upstream connect error or disconnect/reset before headers. reset reason: connection failure
erhalten, bedeutet dies, dass ESPv2 das Backend des Dienstes nicht erreichen kann.
Prüfen Sie zur Fehlerbehebung folgende Elemente.
Backend-Adresse
ESPv2 muss mit der richtigen Backend-Adresse konfiguriert werden. Häufige Probleme:
- Das Schema der Backend-Adresse sollte dem Typ der Backend-Anwendung entsprechen.
OpenAPI-Back-Ends sollten
http://
und gRPC-Back-Endsgrpc://
sein. - Für in Cloud Run bereitgestellte ESPv2 sollte das Schema der Backend-Adresse
https://
odergrpcs://
sein.s
weist ESPv2 an, TLS mit dem Backend einzurichten.
DNS-Lookup
Standardmäßig versucht ESPv2, Domainnamen in IPv6-Adressen aufzulösen. Wenn die IPv6-Auflösung fehlschlägt, greift ESPv2 auf IPv4-Adressen zurück.
Bei einigen Netzwerken funktioniert der Fallback-Mechanismus möglicherweise nicht wie beabsichtigt.
Stattdessen können Sie erzwingen, dass ESPv2 IPv4-Adressen über das Flag --backend_dns_lookup_family
verwendet.
Dieser Fehler tritt häufig auf, wenn Sie einen serverlosen VPC-Connector für ein in Cloud Run bereitgestelltes ESPv2 konfigurieren. VPCs unterstützen IPv6-Traffic nicht.
API is not enabled for the project
Wenn Sie in der Anfrage einen API-Schlüssel gesendet haben, deutet eine Fehlermeldung wie z. B. "API my-api.endpoints.example-project-12345.cloud.goog ist für das Projekt nicht aktiviert" darauf hin, dass der API-Schlüssel in einem anderen Google Cloud-Projekt als die API erstellt wurde. Zur Behebung des Fehlers können Sie entweder den API-Schlüssel im selben Google Cloud-Projekt erstellen, mit dem die API verknüpft ist, oder die API in dem Google Cloud-Projekt aktivieren, in dem der API-Schlüssel erstellt wurde.
Service control request failed with HTTP response code 403
Wenn Sie den Fehlercode 14
und die Meldung Service control request failed
with HTTP response code 403
erhalten, bedeutet das, dass die Service Control API (servicecontrol.googleapis.com
) in dem Projekt nicht aktiviert ist.
Unter Erforderliche Dienste prüfen können Sie prüfen, ob alle Dienste, die von Endpoints und dem ESP benötigt werden, in Ihrem Projekt aktiviert sind.
Unter Erforderliche Berechtigungen prüfen erfahren Sie, wie Sie alle erforderlichen Berechtigungen für das Dienstkonto prüfen, das der Instanz zugeordnet ist, auf der der ESP ausgeführt wird.
Method doesn't allow unregistered callers
Der ESP gibt den Fehler Method doesn't allow unregistered callers
zurück, wenn Sie im Abschnitt security
Ihres OpenAPI-Dokuments einen API-Schlüssel angegeben haben, in der Anfrage an Ihre API jedoch kein API-Schlüssel einem Abfrageparameter mit dem Namen key
zugeordnet ist.
Weitere Informationen zum Generieren eines API-Schlüssels, um Aufrufe an die API zu senden, finden Sie unter API-Schlüssel erstellen.
Method does not exist
Die Antwort Method does not exist
bedeutet, dass die HTTP-Methode (GET
, POST
oder andere) im angegebenen URL-Pfad nicht gefunden wurde. Prüfen Sie zur Fehlerbehebung in der von Ihnen bereitgestellten Dienstkonfiguration, ob der Methodenname und der in der Anfrage gesendete URL-Pfad übereinstimmen:
Rufen Sie in der Google Cloud Console die Seite Endpoints-Dienste für Ihr Projekt auf.
Wenn Sie mehrere APIs haben, wählen Sie die API aus, an die Sie die Anfrage gesendet haben.
Klicken Sie auf den Tab Bereitstellungsverlauf.
Wählen Sie die neueste Bereitstellung aus, um die Dienstkonfiguration aufzurufen.
Wenn Sie im Abschnitt paths
Ihres OpenAPI-Dokuments die von Ihnen aufgerufene Methode nicht finden, können Sie entweder die Methode in die Datei aufnehmen oder das Flag x-google-allow
auf oberster Ebene der Datei hinzufügen:
x-google-allow: all
Dieses Flag bedeutet, dass Sie in Ihrem OpenAPI-Dokument nicht alle Methoden auflisten müssen, die in Ihrem Backend unterstützt werden. Bei Verwendung von all
werden alle Aufrufe – mit oder ohne API-Schlüssel oder Nutzerauthentifizierung – durch den ESP an Ihre API weitergeleitet. Weitere Informationen finden Sie unter x-google-allow
.
Für die flexible App Engine-Umgebung spezifische Fehler
In diesem Abschnitt werden Fehlerantworten von APIs beschrieben, die in der flexiblen Umgebung von App Engine bereitgestellt werden.
Fehlercode 502
oder 503
Es kann einige Minuten dauern, bis App Engine erfolgreich auf Anfragen reagiert.
Wenn Sie eine Anfrage senden und HTTP 502
, 503
oder ein anderer Serverfehler zurückgegeben wird, warten Sie eine Minute und wiederholen Sie dann die Anfrage.
Fehlermeldung BAD_GATEWAY
Der Fehlercode 502
mit BAD_GATEWAY
in der Meldung weist normalerweise darauf hin, dass App Engine die Anwendung aufgrund fehlenden Speichers beendet hat.
Die Standard-VM der flexiblen App Engine-Umgebung hat nur 1 GB Speicher, wobei dem Anwendungscontainer lediglich 600 MB zur Verfügung stehen.
So beheben Sie Fehlercode 502
:
Rufen Sie in der Google Cloud Console die Seite Logging auf.
Wählen Sie das jeweilige Google Cloud-Projekt oben auf der Seite aus.
Wählen Sie Google App Engine-Anwendung aus und öffnen Sie
vm.syslog
.Suchen Sie nach einem Logeintrag wie dem Folgenden:
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
Wenn ein
Out of memory
-Eintrag im Log angezeigt wird:Fügen Sie der Datei
app.yaml
Folgendes hinzu, um die Größe der Standard-VM zu erhöhen:resources: memory_gb: 4
Stellen Sie die API noch einmal bereit:
gcloud app deploy
Wenn Sie Option rollout_strategy: managed
im Abschnitt endpoints_api_service
der Datei app.yaml
angegeben haben, verwenden Sie den folgenden Befehl, um die API noch einmal bereitzustellen:
gcloud app deploy
Weitere Informationen finden Sie unter API und ESP bereitstellen.
Cloud Logging-Logs prüfen
So verwenden Sie die Cloud Logging-Protokolle zur Fehlerbehebung bei Antwortfehlern:
Rufen Sie in der Google Cloud Console die Seite Logging auf.
Wählen Sie oben auf der Seite das Google Cloud-Projekt aus.
Wählen Sie mithilfe der Drop-down-Menüs auf der linken Seite Produzierte API > [NAME_IHRES_DIENSTS] aus.
Passen Sie den Zeitraum an, bis eine Zeile angezeigt wird, die den jeweiligen Antwortfehler enthält.
Erweitern Sie die Anzeige der JSON-Nutzlast und suchen Sie nach
error_cause
.Wenn
error_cause
aufapplication
gesetzt ist, weist das auf ein Problem in Ihrem Code hin.Wenn
error cause
auf etwas anderes verweist und Sie das Problem nicht beheben können, exportieren Sie das Log und fügen Sie es in eine Mitteilung an Google ein.
Weitere Informationen finden Sie hier:
Details zur Struktur der Logs im Log-Explorer finden Sie in der Referenz zu Endpoints-Logs.
Machen Sie sich zuerst mit der Log-Explorer vertraut.
Verwenden Sie erweiterte Logabfragen, um Filter zu präzisieren und so beispielsweise alle Anfragen mit einer Latenz von mehr als 300 Millisekunden zu ermitteln.
Probleme mit dem Beispiel "Invoke-WebRequest"
Bei einigen Versionen von Windows PowerShell funktioniert das Beispiel Invoke-WebRequest
in den Anleitungen nicht. Wir haben auch einen Bericht erhalten, dass die Antwort eine Liste von Byte ohne Vorzeichen enthielt, die in Zeichen umgewandelt werden mussten. Wenn das Beispiel Invoke-WebRequest
nicht das erwartete Ergebnis zurückgibt, versuchen Sie, die Anfrage mit einer anderen Anwendung zu senden. Hier einige Vorschläge dazu:
- Starten Sie Cloud Shell und halten Sie sich an die Schritte für Linux aus der Anleitung, die Sie verwendet haben, um die Anfrage zu senden.
Installieren Sie eine Drittanbieteranwendung wie die Chrome-Browsererweiterung Postman (angeboten von
www.getpostman.com
). Beim Erstellen der Anfrage in Postman:- Wählen Sie
POST
als HTTP-Verb aus. - Wählen Sie für den Header den Schlüssel
content-type
und den Wertapplication/json
aus. - Geben Sie als Text Folgendes ein:
{"message":"hello world"}
Verwenden Sie in der URL den tatsächlichen API-Schlüssel und nicht die Umgebungsvariable. Beispiel:
- In der flexiblen App Engine-Umgebung:
https://example-project-12345.appspot.com/echo?key=AIza...
- Auf anderen Back-Ends:
http://192.0.2.0:80/echo?key=AIza...
- In der flexiblen App Engine-Umgebung:
- Wählen Sie
Laden Sie
curl
herunter und installieren Sie es. Führen Sie es dann in der Eingabeaufforderung aus. Da Windows doppelte Anführungszeichen innerhalb von einfachen Anführungszeichen nicht verarbeitet, müssen Sie die Option--data
im Beispiel so ändern:--data "{\"message\":\"hello world\"}"