Fehlerbehebung bei Cloud Run-Funktionen
In diesem Dokument erfahren Sie, wie Sie Fehlermeldungen beheben und Probleme bei der Verwendung von Cloud Run-Funktionen beheben.
Bereitstellung
In diesem Abschnitt sind mögliche Probleme mit Bereitstellung sowie Vorschläge zu deren Behebung aufgeführt. Viele Probleme, die bei der Bereitstellung auftreten können, stehen im Zusammenhang mit Rollen und Berechtigungen oder einer falschen Konfiguration.
Mit Identity and Access Management können Sie Identitäten autorisieren, administrative Aktionen für Funktionen auszuführen, die mit der Cloud Functions v2 API erstellt wurden, z. B. mit gcloud functions
, der REST API oder Terraform. Zu den Verwaltungsaktionen gehören das Erstellen, Aktualisieren und Löschen von Funktionen. Weitere Informationen finden Sie unter Zugriff mit IAM autorisieren.
Nutzer fehlen beim Bereitstellen einer Funktion die Berechtigungen für das Laufzeitdienstkonto
Jede Funktion ist einem Dienstkonto zugeordnet, das als Identität dient, wenn die Funktion auf andere Ressourcen zugreift. Dieses Laufzeitdienstkonto kann das Standarddienstkonto oder ein nutzerverwaltetes Dienstkonto sein. In Umgebungen, in denen mehrere Funktionen auf verschiedene Ressourcen zugreifen, werden anstelle des Standardlaufzeitdienstkontos normalerweise funktionsspezifische Identitäten mit benannten Laufzeitdienstkonten verwendet (PROJECT_NUMBER-compute@developer.gserviceaccount.com
).
Wenn Sie ein Laufzeitdienstkonto verwenden möchten, muss der Bereitsteller die Berechtigung iam.serviceAccounts.actAs
für dieses Dienstkonto haben. Ein Nutzer, der ein Konto erstellt, das kein Standardlaufzeitdienstkonto ist, erhält diese Berechtigung automatisch. Anderen Bereitstellern muss diese Berechtigung jedoch von einem Nutzer gewährt werden.
Weisen Sie dem Nutzer mit der Rolle „Projektbetrachter“, „Cloud Functions-Entwickler“ oder „Cloud Functions-Administrator“ die Berechtigung iam.serviceAccounts.actAs
für das Laufzeitdienstkonto zu.
Fehlermeldung
Console
You must have the iam.serviceAccounts.actAs permission on the selected service account. To obtain this permission, you can grant a role that includes it like the Service Account User role, on the project.
gcloud
Standarddienstkonto:
ERROR: (gcloud.functions.deploy) ResponseError: status=[403], code=[Ok], message=[Caller is missing permission 'iam.serviceaccounts.actAs' on service account projects/-/serviceAccounts/PROJECT_NUMBER-compute@developer.gserviceaccount.com.Grant the role 'roles/iam.serviceAccountUser' to the caller on the service account projects/-/serviceAccounts/PROJECT_NUMBER-compute@developer.gserviceaccount.com.You can do that by running 'gcloud iam service-accounts add-iam-policy-binding projects/-/serviceAccounts/PROJECT_NUMBER-compute@developer.gserviceaccount.com --member MEMBER --role roles/iam.serviceAccountUser'where MEMBER has a prefix like 'user:' or 'serviceAccount:'
Nicht standardmäßiges Dienstkonto:
ERROR: (gcloud.functions.deploy) ResponseError: status=[403], code=[Ok], message=[Caller is missing permission 'iam.serviceaccounts.actAs' on service account projects/-/serviceAccounts/
SERVICE_ACCOUNT_NAME@PROJECT_ID
.iam.gserviceaccount.com.Grant the role 'roles/iam.serviceAccountUser' to the caller on the service account projects/-/serviceAccounts/
SERVICE_ACCOUNT_NAME@PROJECT_ID
.iam.gserviceaccount.com.You can do that by running 'gcloud iam service-accounts add-iam-policy-binding projects/-/serviceAccounts/
SERVICE_ACCOUNT_NAME@PROJECT_ID
.iam.gserviceaccount.com --member MEMBER --role roles/iam.serviceAccountUser'where MEMBER has a prefix like 'user:' or 'serviceAccount:'
Die Lösung
Weisen Sie dem Nutzer die Rolle „Dienstkontonutzer“ (roles/iam.serviceAccountUser
) für das Standard- oder benutzerdefinierte Laufzeitdienstkonto zu. Diese Rolle umfasst die Berechtigung iam.serviceAccounts.actAs
.
Bereitstellungsdienstkonto fehlen zum Bereitstellen einer ereignisgesteuerten Funktion Pub/Sub-Berechtigungen
Der Cloud Functions-Dienst verwendet beim Ausführen von administrativen Aufgaben das Dienstkonto des Cloud Functions-Dienst-Agents (service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com
). Standardmäßig wird diesem Konto die Cloud Functions-Rolle cloudfunctions.serviceAgent
zugewiesen. Zum Bereitstellen von ereignisgesteuerten Funktionen muss der Cloud Functions-Dienst auf Pub/Sub zugreifen, um Themen und Abos zu konfigurieren. Wenn Sie die dem Dienstkonto zugewiesene Rolle ändern, ohne die entsprechenden Berechtigungen zu gewähren, kann der Cloud Functions-Dienst nicht auf Pub/Sub zugreifen und die Bereitstellung schlägt fehl.
Fehlermeldung
Console
Validation failed for trigger projects/PROJECT_ID/locations/LOCATION/triggers/FUNCTION_NAME-EVENTARC_ID: Permission "iam.serviceAccounts.ActAs" denied on "EndUserCredentials to PROJECT_NUMBER-compute@developer.gserviceaccount.com"
gcloud
ERROR: (gcloud.functions.deploy) ResponseError: status=[403], code=[Ok], message=[Validation failed for trigger projects/test-project-356312/locations/LOCATION/triggers/FUNCTION_NAME-EVENTARC_ID: Permission "iam.serviceAccounts.ActAs" denied on "EndUserCredentials to PROJECT_NUMBER-compute@developer.gserviceaccount.com"]
Die Lösung
Sie können Ihr Dienstkonto auf die Standardrolle cloudfunctions.serviceAgent zurücksetzen.
Das Standarddienstkonto für die Laufzeit ist nicht vorhanden
Wenn Sie kein vom Nutzer verwaltetes Laufzeitdienstkonto angeben, verwendet Cloud Functions das Compute-Standarddienstkonto als Laufzeitdienstkonto. Bereitstellungen schlagen fehl, wenn Sie das Standardkonto löschen, ohne ein vom Nutzer verwaltetes Konto anzugeben.
Fehlermeldung
gcloud
ERROR: (gcloud.functions.deploy) ResponseError: status=[404], code=[Ok], message=[Service account projects/-/serviceAccounts/PROJECT_NUMBER-compute@developer.gserviceaccount.com was not found.]
Die Lösung
Führen Sie einen der folgenden Schritte aus, um das Problem zu beheben:
Geben Sie vor dem Bereitstellen Ihrer Funktion ein vom Nutzer verwaltetes Laufzeitdienstkonto an.
Dienstkonto mit numerischer ID wiederherstellen des Standarddienstkontos.
Cloud Functions-Dienst-Agent-Dienstkonto fehlt Berechtigungen für Projekt-Buckets bei der Bereitstellung einer Funktion
Cloud Run-Funktionen können nur von Ereignissen ausgelöst werden, die aus Cloud Storage-Buckets im selben Google Cloud Platform-Projekt stammen. Darüber hinaus muss das Dienstkonto des Cloud Functions-Dienst-Agents (service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com
) für Ihr Projekt die Rolle cloudfunctions.serviceAgent
haben.
Fehlermeldung
Console
ERROR: (gcloud.functions.deploy) ResponseError: status=[403], code=[Ok], message=[Validation failed for trigger projects/PROJECT_ID/locations/LOCATION/triggers/FUNCTION_NAME-EVENTARC_ID: Permission "iam.serviceAccounts.ActAs" denied on "EndUserCredentials to PROJECT_NUMBER-compute@developer.gserviceaccount.com"]
gcloud
ERROR: (gcloud.functions.deploy) ResponseError: status=[403], code=[Ok], message=[Validation failed for trigger projects/<project-id>/locations/LOCATION/triggers/FUNCTION_NAME-EVENTARC_ID: Permission "iam.serviceAccounts.ActAs" denied on "EndUserCredentials to PROJECT_NUMBER-compute@developer.gserviceaccount.com"]
Die Lösung
Um dieses Problem zu beheben, setzen Sie dieses Dienstkonto auf die Standardrolle zurück.
Nutzer mit der Rolle „Projektbearbeiter“ können keine Funktion veröffentlichen
Die Rolle „Projektbearbeiter“ hat umfassende Berechtigungen zum Verwalten von Ressourcen innerhalb eines Projekts, aber nicht die Berechtigung, Cloud Functions zu veröffentlichen. Der Nutzer oder Dienst, der die Funktion bereitstellt, benötigt die Berechtigung run.services.setIamPolicy
.
Fehlermeldung
gcloud
ERROR: (gcloud.run.services.add-iam-policy-binding) PERMISSION_DENIED: Permission 'run.services.setIamPolicy' denied on resource 'projects/PROJECT_ID/locations/LOCATION/functions/FUNCTION_NAME' (or resource may not exist).
Die Lösung
Sie haben folgende Möglichkeiten :
Weisen Sie dem Bereitsteller die Rolle Projektinhaber oder Cloud Functions-Administrator zu.
Erteilen Sie die Berechtigung manuell. Erstellen Sie dazu eine benutzerdefinierte Rolle.
Prüfen Sie, ob die domaineingeschränkte Freigabe für das Projekt erzwungen wird.
Die Bereitstellung der Funktion schlägt fehl, wenn die Organisationsrichtlinie „Beschränkung der Ressourcenstandorte“ verwendet wird
Wenn Ihre Organisation eine Richtlinie zur Beschränkung von Ressourcenstandorten verwendet, wird die Bereitstellung von Funktionen in den durch die Richtlinie eingeschränkten Regionen eingeschränkt. In der Google Cloud Console ist die eingeschränkte Region beim Bereitstellen einer Funktion nicht im Drop-down-Menü „Region“ verfügbar.
Fehlermeldung
gcloud
ResponseError: status=[400], code=[Ok], message=["LOCATION" violates constraint "constraints/gcp.resourceLocations" on the resource "projects/PROJECT_ID/locations/LOCATION/functions/FUNCTION_NAME".]
Die Lösung
Sie können Standorte zu den Listen allowed_values
und denied_values
einer Einschränkung der Ressourcenstandorte hinzufügen oder daraus entfernen, um eine erfolgreiche Bereitstellung zu ermöglichen.
Fehler bei der Funktionsbereitstellung während der Ausführung des globalen Bereichs der Funktion
Dieser Fehler gibt an, dass ein Problem mit Ihrem Code vorliegt. Die Bereitstellungspipeline hat die Bereitstellung der Funktion abgeschlossen, ist aber im letzten Schritt fehlgeschlagen. Es wird eine Systemdiagnose an die Funktion gesendet. Diese Systemdiagnose dient dazu, den globalen Bereich einer Funktion auszuführen, wodurch eine Ausnahme, ein Absturz oder eine Zeitüberschreitung ausgelöst werden kann. Im globalen Bereich werden Bibliotheken häufig geladen und Clients initialisiert.
Fehlermeldung
In Cloud Logging-Logs:
Could not create or update Cloud Run service FUNCTION_NAME, Container Healthcheck failed. Revision REVISION_NAMEE is not ready and cannot serve traffic. The user-provided container failed to start and listen on the port defined provided by the PORT=8080 environment variable. Logs for this revision might contain more information.
Die Lösung
Führen Sie einen der folgenden Schritte aus, um das Problem zu beheben:
Eine ausführlichere Fehlermeldung finden Sie in den Build-Logs und den Laufzeit-Logs Ihrer Funktion.
Wenn unklar ist, warum die Funktion ihren globalen Bereich nicht ausführen konnte, können Sie den Code vorübergehend mit der verzögerten Initialisierung der globalen Variablen in den Anfrageaufruf verschieben. Dadurch können Sie zusätzliche Logberichte zu Ihren Clientbibliotheken hinzufügen, die bei der Instanziierung möglicherweise eine Zeitüberschreitung auslösen (insbesondere wenn sie andere Dienste aufrufen) oder abstürzen oder Ausnahmen ausgeben.
Außerdem können Sie versuchen, das Zeitlimit für Funktionen zu erhöhen. Längere Zeitüberschreitungslimits in Cloud Run-Funktionen bieten mehr Spielraum für die Initialisierung und eine skalierbarere Ressourcenzuweisung in einer Cloud Run-Umgebung. Dadurch kann dieses Problem, falls es durch eine Ressourcenausschöpfung verursacht wird, möglicherweise gemildert werden.
Der Quellcode muss eine Einstiegspunktfunktion enthalten, die in der Bereitstellung korrekt angegeben wurde, entweder über die Console oder gcloud.
Ein Nutzer mit der Rolle "Betrachter" kann keine Funktion bereitstellen.
Nutzer mit der Rolle „Projektbetrachter“ oder „Cloud Functions-Betrachter“ haben Lesezugriff auf Funktionen und Funktionsdetails und können keine neuen Funktionen bereitstellen. Die Funktion Funktion erstellen ist in der Google Cloud Console ausgegraut und Sie sehen den folgenden Fehler:
Fehlermeldung
gcloud
ERROR: (gcloud.functions.deploy) ResponseError: status=[403], code=[Ok], message=[Permission 'cloudfunctions.functions.generateUploadUrl' denied on 'projects/PROJECT_ID/locations/LOCATION/functions']
Die Lösung
Weisen Sie dem Nutzer die Rolle Cloud Functions-Entwickler zu.
Build-Dienstkonto fehlt Berechtigungen
Fehlermeldung
Im Fehler beim Bereitstellen der Funktion oder in den Build-Logs wird möglicherweise einer der folgenden Fehler angezeigt:
The service account running this build does not have permission to write logs. To fix this, grant the Logs Writer (roles/logging.logWriter) role to the service account.
Step #0 - "fetch": failed to Fetch: failed to download archive gs://gcf-v2-sources-PROJECT_NUMBER-LOCATION/FUNCTION_NAME/version-VERSION_NUMBER/function-source.zip: Access to bucket gcf-v2-sources-PROJECT_NUMBER-LOCATION denied. You must grant Storage Object Viewer permission to PROJECT_NUMBER-compute@developer.gserviceaccount.com.
Step #2 - "build": ERROR: failed to create image cache: accessing cache image "LOCATION-docker.pkg.dev/PROJECT/gcf-artifacts/FUNCTION_NAME/cache:latest": connect to repo store "LOCATION-docker.pkg.dev/PROJECT/gcf-artifacts/FUNCTION_NAME/cache:latest": GET https://LOCATION-docker.pkg.dev/v2/token?scope=repository%3APROJECT%2Fgcf-artifacts%2FFUNCTION_NAME%2Fcache%3Apull&service=: DENIED: Permission "artifactregistry.repositories.downloadArtifacts" denied on resource "projects/PROJECT/locations/LOCATION/repositories/gcf-artifacts" (or it may not exist)
Could not build the function due to a missing permission on the build service account. If you didn't revoke that permission explicitly, this could be caused by a change in the organization policies.
Die Lösung
Das Build-Dienstkonto benötigt Leseberechtigungen für den Quell-Bucket sowie Lese- und Schreibberechtigungen für das Artifact Deployment-Repository. Dieser Fehler kann aufgrund einer Änderung des Standardverhaltens für die Verwendung von Dienstkonten durch Cloud Build auftreten. Weitere Informationen finden Sie unter Änderung des Cloud Build-Dienstkontos.
Verwenden Sie eine der folgenden Lösungen, um dieses Problem zu beheben:
- Erstellen Sie ein benutzerdefiniertes Build-Dienstkonto für Funktionsbereitstellungen.
- Fügen Sie dem Standard-Compute-Dienstkonto die Rolle Cloud Build-Dienstkonto (
roles/cloudbuild.builds.builder
) hinzu. - Lesen Sie die Cloud Build-Anleitung zu Änderungen am Standarddienstkonto und deaktivieren Sie diese Änderungen.
Build-Dienstkonto deaktiviert
Fehlermeldung
Could not build the function due to disabled service account used by Cloud Build. Please make sure that the service account is active.
Die Lösung
Das Build-Dienstkonto muss aktiviert sein, damit eine Funktion bereitgestellt werden kann. Dieser Fehler kann aufgrund einer Änderung des Standardverhaltens für die Verwendung von Dienstkonten durch Cloud Build auftreten. Weitere Informationen finden Sie unter Änderung des Cloud Build-Dienstkontos.
Verwenden Sie eine der folgenden Lösungen, um dieses Problem zu beheben:
- Erstellen Sie ein benutzerdefiniertes Build-Dienstkonto für Funktionsbereitstellungen.
- Aktivieren Sie das Standard-Compute-Dienstkonto.
- Lesen Sie die Cloud Build-Anleitung zu Änderungen am Standarddienstkonto und deaktivieren Sie diese Änderungen.
Bereitstellung
In diesem Abschnitt sind mögliche Probleme mit der Auslieferung sowie Vorschläge zu deren Behebung aufgeführt.
Berechtigungsfehler beim Bereitstellen aufgrund der Funktion, die eine Authentifizierung erfordert
HTTP-Funktionen ohne aktivierte nicht authentifizierte Aufrufe zulassen beschränken den Zugriff auf Endnutzer und Dienstkonten, die nicht die entsprechenden Berechtigungen haben. Diese Fehlermeldung weist darauf hin, dass der Aufrufer nicht die Berechtigung hat, die Funktion aufzurufen.
Fehlermeldung
HTTP-Fehlerantwortcode: 403 Unzulässig
HTTP-Fehlerantworttext:
Error: Forbidden Your client does not have permission
to get URL /FUNCTION_NAME from this server.
Die Lösung
Führen Sie einen der folgenden Schritte aus, um das Problem zu beheben:
Weisen Sie dem Nutzer für die jeweilige Funktion die Cloud IAM-Rolle Cloud Run Invoker zu.
Stellen Sie die Funktion noch einmal bereit, um nicht authentifizierte Aufrufe zuzulassen, wenn dies von Ihrer Organisation unterstützt wird. Dies ist zum Testen nützlich.
Auslieferungsfehler aufgrund der allow internal traffic only
-Konfiguration
Mit den Einstellungen für eingehenden Traffic wird festgelegt, ob eine HTTP-Funktion von Ressourcen außerhalb des Google Cloud-Projekts oder des Dienstperimeters für VPC Service Controls aufgerufen werden kann.
Wenn Sie für eingehenden Netzwerktraffic die Einstellung Nur internen Traffic zulassen konfigurieren, weist diese Fehlermeldung darauf hin, dass nur Anfragen von VPC-Netzwerken im selben Projekt oder Perimeter für VPC Service Controls zulässig sind. Es kann sich auch um einen 404-Fehler für die Standard-functions.net
-URL handeln.
Fehlermeldung
HTTP-Fehlerantwortcode: 404 NICHT GEFUNDEN
Die Lösung
So beheben Sie diesen Fehler:
Prüfen Sie, ob die Anfrage von Ihrem Google Cloud-Projekt oder dem Dienstperimeter für VPC Service Controls stammt.
Ändern Sie die Einstellungen für eingehenden Traffic so, dass der gesamte Traffic für die Funktion zugelassen wird.
Der Quellcode von Cloud Run-Funktionen kann auch aufgrund von falscher Funktions-URL, HTTP-Methoden, Logikfehlern usw. zu einem 404-Fehler führen.
Der Funktionsaufruf enthält keine gültigen Anmeldedaten für die Authentifizierung
Zum Aufrufen einer Cloud Run-Funktion, die mit eingeschränktem Zugriff eingerichtet wurde, ist ein ID-Token erforderlich. Zugriffstokens oder Aktualisierungstokens funktionieren nicht.
Fehlermeldung
HTTP-Fehlerantwortcode: 401 Nicht autorisiert
HTTP-Fehlerantworttext:
Your client does not have permission to the requested URL 'FUNCTION_NAME'
Die Lösung
So beheben Sie diesen Fehler:
Achten Sie darauf, dass Ihre Anfragen einen
Authorization: Bearer ID_TOKEN
-Header enthalten und das Token ein ID-Token und kein Zugriffs- oder Aktualisierungstoken ist. Wenn Sie dieses Token manuell mit dem privaten Schlüssel eines Dienstkontos generieren, müssen Sie das selbst signierte JWT-Token gegen ein von Google signiertes Identitätstoken austauschen. Weitere Informationen finden Sie unter Für Aufruf authentifizieren.Rufen Sie Ihre HTTP-Funktion mit Authentifizierungsdaten im Anfrageheader auf. So können Sie z. B. über
gcloud
ein Identitätstoken abrufen: Weitere Informationen finden Sie unter Für Aufruf authentifizieren .curl -H "Authorization: Bearer $(gcloud auth print-identity-token)"
https://REGION-PROJECT_ID.cloudfunctions.net/FUNCTION_NAMEStellen Sie die Funktion noch einmal bereit, um nicht authentifizierte Aufrufe zuzulassen, wenn dies von Ihrer Organisation unterstützt wird. Dies ist zum Testen nützlich.
Die Funktion wird während der Ausführung beendet oder nach Beendigung des Codes weiter ausgeführt.
Bei einigen Cloud Run-Laufzeiten können Nutzer asynchrone Aufgaben ausführen. Wenn Ihre Funktion solche Aufgaben erstellt, muss sie auch explizit warten, bis diese Aufgaben abgeschlossen sind. Andernfalls kann die Funktion mit der falschen Zeit nicht mehr ausgeführt werden.
Fehlerverhalten
Ihre Funktion zeigt eine dieser Verhaltenweisen:
- Ihre Funktion wird beendet, während asynchrone Aufgaben noch ausgeführt werden, bevor die festgelegte Zeitüberschreitung verstrichen ist.
- Die Ausführung der Funktion wird nicht gestoppt, wenn diese Aufgaben abgeschlossen sind, und wird bis zum Ablauf des Zeitlimits fortgesetzt.
Die Lösung
Wenn Ihre Funktion vorzeitig beendet wird, sollten Sie überprüfen, ob alle asynchronen Aufgaben der Funktion abgeschlossen sind, bevor die Funktion eine der folgenden Aktionen ausführt:
- Wert zurückgeben
- Ein zurückgegebenes
Promise
-Objekt auflösen oder ablehnen (nur Node.js-Funktionen) - Nicht erfasste Ausnahmen oder Fehler auslösen
- HTTP-Antwort senden
- Callback-Funktion aufrufen
Wenn Ihre Funktion nicht beendet wird, nachdem alle asynchronen Aufgaben abgeschlossen sind, sollten Sie prüfen, ob die Funktion nach Abschluss alle Funktionen von Cloud Run richtig anzeigt. Wichtig ist, dass Sie eine der oben aufgeführten Vorgänge ausführen, sobald Ihre Funktion die asynchronen Aufgaben abgeschlossen hat.
Laufzeitfehler beim Zugriff auf Ressourcen, die durch VPC Service Controls geschützt sind
Cloud Run-Funktionen verwenden standardmäßig öffentliche IP-Adressen, um ausgehende Anfragen an andere Dienste zu senden. Wenn sich Ihre Funktionen nicht in einem VPC Service Controls-Perimeter befinden, erhalten sie möglicherweise HTTP-403-Antworten, wenn sie versuchen, auf Google Cloud-Dienste zuzugreifen, die durch VPC Service Controls aufgrund von Ablehnungen von Dienstperimetern geschützt sind.
Fehlermeldung
In Logs von geprüften Ressourcen ein Eintrag wie der Folgende:
"protoPayload": { "@type": "type.googleapis.com/google.cloud.audit.AuditLog", "status": { "code": 7, "details": [ { "@type": "type.googleapis.com/google.rpc.PreconditionFailure", "violations": [ { "type": "VPC_SERVICE_CONTROLS", ... "authenticationInfo": { "principalEmail": "CLOUD_FUNCTION_RUNTIME_SERVICE_ACCOUNT", ... "metadata": { "violationReason": "NO_MATCHING_ACCESS_LEVEL", "securityPolicyInfo": { "organizationId": "ORGANIZATION_ID", "servicePerimeterName": "accessPolicies/NUMBER/servicePerimeters/SERVICE_PERIMETER_NAME" ...
Die Lösung
So beheben Sie diesen Fehler:
Die Funktion sollte den gesamten ausgehenden Traffic über das VPC-Netzwerk leiten. Weitere Informationen finden Sie im Abschnitt Funktionen bereitstellen, die mit VPC Service Controls kompatibel sind.
Alternativ können Sie dem Laufzeitdienstkonto der Funktion Zugriff auf den Perimeter gewähren. Dazu erstellen Sie entweder eine Zugriffsebene und fügen die Zugriffsebene zum Dienstperimeter hinzu oder erstellen eine Ingress-Richtlinie für den Perimeter. Weitere Informationen finden Sie unter VPC Service Controls mit Funktionen außerhalb eines Perimeters verwenden.
Skalierbarkeit
In diesem Abschnitt sind Skalierungsprobleme sowie Vorschläge zu deren Behebung aufgeführt.
Cloud Logging-Fehler im Zusammenhang mit abgebrochenen ausstehenden Warteschlangenanfragen
Skalierungsfehler können in den folgenden Fällen auftreten:
- Ein starker Anstieg des Traffics.
- Lange Kaltstartzeit.
- Lange Verarbeitungszeit für Anfragen.
- Hohe Fehlerrate der Funktion.
- Das maximale Instanzlimit wird erreicht und das System kann nicht skaliert werden.
- Temporäre Faktoren, die dem Cloud Run Functions-Dienst zugeordnet sind.
In allen Fällen wird Cloud Run möglicherweise nicht schnell genug hochskaliert, um den Traffic zu verwalten.
Fehlermeldung
The request was aborted because there was no available instance
severity=WARNING
( Antwortcode: 429) Cloud Run-Funktionen können nicht skaliert werden, da Sie bei der Konfiguration ein Limit fürmax-instances
festgelegt haben.severity=ERROR
( Antwortcode: 500) Cloud Run-Funktionen können die Rate des Traffics nicht verwalten.
Die Lösung
Beheben Sie die zuvor aufgeführten Probleme, um dieses Problem zu beheben.
Lassen Sie bei HTTP-Trigger-basierten Funktionen den Client exponentiellen Backoff und Wiederholungen für Anfragen implementieren, die nicht verworfen werden dürfen. Wenn Sie Cloud Run-Funktionen über Workflows auslösen, können Sie dazu die
try/retry
-Syntax verwenden.Für Hintergrund- oder ereignisgesteuerte Funktionen unterstützt Cloud Run Functions mindestens einmalige Übermittlung. Auch wenn die Wiederholung nicht explizit aktiviert wird, wird das Ereignis automatisch noch einmal gesendet und die Funktionsausführung wird wiederholt. Weitere Informationen finden Sie unter Ereignisgesteuerte Funktionen wiederholen.
Wenden Sie sich bitte an den Support, wenn die Ursache des Problems eine Periode erhöhter transienter Fehler ist, die ausschließlich Cloud Run-Funktionen zugeschrieben werden, oder wenn Sie Unterstützung bei Ihrem Problem benötigen.
Bei Problemen mit Kaltstarts können Sie eine Mindestanzahl von Instanzen konfigurieren, um die Anzahl der Kaltstarts mit höheren Abrechnungsfolgen zu reduzieren.
Logging
Im folgenden Abschnitt werden Probleme mit dem Logging und deren Behebung beschrieben.
Logeinträge haben keine oder falsche Schweregradebenen
Cloud Run-Funktionen bieten standardmäßig Laufzeit-Logging. In stdout
oder stderr
geschriebene Logs werden automatisch in Cloud Logging angezeigt.
Sie enthalten jedoch standardmäßig nur Stringnachrichten.
Fehlermeldung
Keine oder falsche Schweregradebenen in Logs.
Die Lösung
Wenn Sie Log-Schweregrade einschließen möchten, müssen Sie einen strukturierten Logeintrag senden.
Ausnahmen bei einem Absturz anders behandeln oder protokollieren
Sie haben die Möglichkeit, die Verwaltung und das Logging von Absturzinformationen anzupassen.
Die Lösung
Das Wrappen Ihrer Funktion ist ein try
-Block, mit dem die Handhabung von Ausnahmen und das Logging von Stacktraces angepasst werden kann.
Beispiel
import logging
import traceback
def try_catch_log(wrapped_func):
def wrapper(*args, **kwargs):
try:
response = wrapped_func(*args, **kwargs)
except Exception:
# Replace new lines with spaces so as to prevent several entries which
# would trigger several errors.
error_message = traceback.format_exc().replace('\n', ' ')
logging.error(error_message)
return 'Error';
return response;
return wrapper;
#Example hello world function
@try_catch_log
def python_hello_world(request):
request_args = request.args
if request_args and 'name' in request_args:
1 + 's'
return 'Hello World!'
Logs zu groß in Node.js 10 und höher sowie in Python 3.8, Go 1.13 und Java 11
Die maximale Größe für einen regulären Logeintrag in diesen Laufzeiten ist 105 KiB.
Die Lösung
Senden Sie Logeinträge, die kleiner als dieses Limit sind.
Fehlende Protokolle, obwohl Cloud Run-Funktionen Fehler zurückgeben
Cloud Run Functions streamt Cloud Run-Funktionsprotokolle in einen Standard-Bucket. Wenn Sie ein Projekt erstellen, wird der Standard-Bucket von Cloud Run-Funktionen erstellt und aktiviert. Wenn der Standard-Bucket deaktiviert ist oder wenn sich Cloud Run-Funktions-Logs im Ausschlussfilter befinden, werden die Logs nicht im Log-Explorer angezeigt.
Die Lösung
Aktivieren Sie Standardprotokolle.
Cloud Run-Funktionslogs werden nicht im Log-Explorer angezeigt
Einige Cloud Logging-Clientbibliotheken verwenden einen asynchronen Prozess, um Logeinträge zu schreiben. Wenn eine Funktion abstürzt oder anderweitig beendet wird, ist es möglich, dass einige Logeinträge noch nicht geschrieben wurden und später angezeigt werden. Einige Logs gehen möglicherweise verloren und sind im Log-Explorer nicht sichtbar.
Die Lösung
Verwenden Sie die Benutzeroberfläche der Clientbibliothek, um gepufferte Logeinträge zu leeren, bevor Sie die Funktion beenden, oder verwenden Sie die Bibliothek, um Logeinträge synchron zu schreiben. Sie können Logs auch synchron direkt in stdout
oder stderr
schreiben.
Fehlende Cloud Run-Funktionslogs bei Verwendung der Logs Router-Senke
Logs Router-Senken leiten Logeinträge an verschiedene Ziele weiter.
Mit den Ausschlussfiltern werden Einträge definiert, die Sie verwerfen können.
Die Lösung
Entfernen Sie den Ausschlussfilter für resource.type = "cloud_run_revision"
.
Datenbankverbindungen
Beim Herstellen einer Verbindung zu einer Datenbank können verschiedene Probleme auftreten, die oft mit dem Überschreiten der Verbindungslimits oder der Zeitüberschreitung zusammenhängen. Wenn in Ihren Logs eine Cloud SQL-Warnung angezeigt wird, z. B. Context deadline exceeded
, müssen Sie möglicherweise Ihre Verbindungskonfiguration anpassen. Weitere Informationen finden Sie unter Best Practices für Cloud SQL.
Netzwerk
In diesem Abschnitt sind Netzwerkprobleme sowie Vorschläge zu deren Behebung aufgeführt.
Netzwerkverbindung
Wenn alle ausgehenden Anfragen von einer Cloud Run-Funktion auch nach dem Konfigurieren der Einstellungen für ausgehenden Traffic fehlschlagen, können Sie Konnektivitätstests ausführen, um alle zugrunde liegenden Netzwerkverbindungsprobleme zu identifizieren. Weitere Informationen finden Sie unter Konnektivitätstests erstellen und ausführen.
Connector für serverlosen VPC-Zugriff ist nicht bereit oder nicht vorhanden
Wenn ein Connector für Serverloser VPC-Zugriff fehlschlägt, wird möglicherweise keine /28
-Subnetzmaske als erforderlich für den Connector verwendet.
Fehlermeldung
Problem connecting to VPC Connector projects/xxxxx/locations/REGION/connectors/xxxx: Serverless VPC Access is not found.
Wenn Cloud Run-Funktionen mit einem Connector bereitgestellt werden, der aufgrund einer fehlenden Berechtigung für das Dienstkonto „Google APIs Service Agent“ PROJECT_NUMBER@cloudservices.gserviceaccount.com
in einem fehlerhaften Status ist, wird die folgende Fehlermeldung ausgegeben:
Fehlermeldung
Failed to prepare VPC connector. Please try again later.
Die Lösung
Listen Sie Ihre Subnetze auf, um zu prüfen, ob Ihr Connector eine /28
-Subnetzmaske verwendet. Wenn für Ihren Connector nicht die Subnetzmaske /28
verwendet wird, erstellen Sie einen neuen Connector oder stellen Sie den vorhandenen wieder her.
Führen Sie einen der folgenden Schritte aus, um das Problem zu beheben:
Wenn Sie den Connector neu erstellen, müssen Sie andere Funktionen nicht noch einmal bereitstellen. Während der Connector neu erstellt wird, kann es zu einer Netzwerkunterbrechung kommen.
Wenn Sie einen neuen alternativen Connector erstellen, stellen Sie Ihre Funktionen neu bereit, damit der neue Connector verwendet wird, und löschen Sie dann den ursprünglichen Connector. Bei dieser Methode wird eine Netzwerkunterbrechung vermieden.
Die Cloud Run-Funktionen und der zugehörige Connector müssen in derselben Region bereitgestellt werden.
Für die freigegebene VPC-Konfiguration:
Achten Sie darauf, dass den Dienstkonten
SERVICE_PROJECT_NUMBER@cloudservices.gserviceaccount.com
undservice-SERVICE_PROJECT_NUMBER@gcp-sa-vpcaccess.iam.gserviceaccount.com
, die vom VPC-Connector zum Bereitstellen von Ressourcen im Projekt verwendet werden, keine Berechtigungen fehlen. Diese Dienstkonten sollten die Rolleroles/compute.networkUser
im Hostprojekt der freigegebene VPC-Konfiguration haben, wenn sich der Connector im Dienstprojekt befindet.Wenn der Connector im Hostprojekt erstellt wird, muss die Rolle
Serverless VPC Access User
dem Cloud Run-Dienst-Agent in Ihrem Hostprojekt zugewiesen sein.
Wenn der Status des Connectors den Fehler
Connector is in a bad state, manual deletion recommended
anzeigt und dem Google APIs-Dienst-Agent die erforderlichen Berechtigungen zum Bereitstellen von Rechenressourcen im Projekt des Connectors fehlen, gewähren Sie dem DienstkontoPROJECT_NUMBER@cloudservices.gserviceaccount.com
die Berechtigungroles/compute.admin
. In einigen Fällen muss der Connector nach dem Hinzufügen dieser Berechtigungen neu erstellt werden.
Der SMTP-Traffic zu externen Ziel-IP-Adressen, die den TCP-Port 25 verwenden, ist blockiert
Für zusätzliche Sicherheit blockiert Google Cloud Verbindungen zum TCP-Zielport 25
, wenn E-Mails von Funktionen gesendet werden.
Die Lösung
So heben Sie die Blockierung dieser Verbindungen auf:
Stellen Sie über einen anderen Port, z. B. TCP-Port
587
oder465
, eine Verbindung zu Ihrem SMTP-Server her.
404-Fehler für die Standard-functions.net
-URL
Wenn Sie die run.app
-URL in Cloud Run deaktivieren, wird auch der Zugriff auf die Standard-cloudfunctions.net
-URL für Cloud Run-Funktionen (2. Generation) verhindert. Dieser Fehler kann auch durch einen Bereitstellungsfehler aufgrund der Konfiguration „Nur internen Traffic zulassen“ verursacht werden.
Fehlermeldung
HTTP-Fehlerantwortcode: 404 NICHT GEFUNDEN
Die Lösung
Wenn Sie die Standard-cloudfunctions.net
-URL für Cloud Run Functions (2. Generation) wieder aktivieren möchten, müssen Sie die run.app
-URL in Cloud Run wieder aktivieren. Ersetzen Sie dazu die Datei service.yaml
durch eine neue Konfiguration, in der annotations:run.googleapis.com/default-url-disabled: false