Résoudre les problèmes liés à Cloud Run Functions
Ce document explique comment résoudre les problèmes liés aux messages d'erreur et à l'utilisation de Cloud Run Functions.
Déploiement
Cette section répertorie les problèmes que vous pouvez rencontrer lors du déploiement et fournit des suggestions pour les résoudre. La plupart des problèmes que vous pouvez rencontrer lors du déploiement sont liés aux rôles et autorisations ou à une configuration incorrecte.
Vous utilisez Identity and Access Management pour autoriser des identités à effectuer des actions administratives sur les fonctions créées à l'aide de l'API Cloud Functions v2 (par exemple, à l'aide de gcloud functions
, de l'API REST ou de Terraform). Les actions d'administration incluent la création, la mise à jour et la suppression de fonctions. Pour en savoir plus, consultez la section Autoriser l'accès avec IAM.
L'utilisateur ne dispose pas des autorisations nécessaires sur le compte de service d'exécution lors du déploiement d'une fonction
Chaque fonction est associée à un compte de service qui sert d'identité lorsque la fonction accède à d'autres ressources. Ce compte de service d'exécution peut être le compte de service par défaut ou un compte de service géré par l'utilisateur. Dans les environnements où plusieurs fonctions accèdent à des ressources différentes, il est courant d'utiliser des identités par fonction, avec des comptes de service d'exécution nommés plutôt que le compte de service d'exécution par défaut. (PROJECT_NUMBER-compute@developer.gserviceaccount.com
).
Pour utiliser un compte de service d'exécution, l'utilisateur à l'origine du déploiement doit disposer de l'autorisation iam.serviceAccounts.actAs
sur ce compte de service. Cette autorisation est automatiquement accordée à un utilisateur qui crée un compte de service d'exécution autre que celui par défaut. Pour que d'autres "déployeurs" puissent en disposer, elle doit leur être accordée par un utilisateur.
Attribuez l'autorisation iam.serviceAccounts.actAs
sur le compte de service d'exécution pour l'utilisateur disposant du rôle de lecteur de projet, de développeur Cloud Functions ou d'administrateur Cloud Functions.
Message d'erreur
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
Compte de service par défaut :
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:'
Compte de service non par défaut :
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:'
Solution
Attribuez à l'utilisateur le rôle Utilisateur du compte de service (roles/iam.serviceAccountUser
) sur le compte de service d'exécution par défaut ou sur le compte de service d'exécution autre que celui par défaut. Ce rôle inclut l'autorisation iam.serviceAccounts.actAs
.
Le compte de service de déploiement ne dispose pas des autorisations Pub/Sub nécessaires lors du déploiement d'une fonction basée sur des événements
Le service Cloud Functions utilise le compte de service de l'agent de service Cloud Functions (service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com
) pour effectuer des tâches d'administration. Le rôle cloudfunctions.serviceAgent
Cloud Functions est attribué par défaut à ce compte de service. Pour déployer des fonctions basées sur des événements, le service Cloud Functions doit accéder à Pub/Sub pour configurer les sujets et les abonnements. Si vous modifiez le rôle attribué au compte de service sans accorder les autorisations appropriées, le service Cloud Functions ne peut pas accéder à Pub/Sub et le déploiement échoue.
Message d'erreur
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"]
Solution
Vous pouvez réinitialiser votre compte de service pour rétablir le rôle cloudfunctions.serviceAgent par défaut.
Le compte de service de l'environnement d'exécution par défaut n'existe pas
Si vous ne spécifiez pas de compte de service d'environnement d'exécution géré par l'utilisateur, Cloud Functions utilise le compte de service Compute par défaut comme compte de service d'environnement d'exécution. Les déploiements échouent si vous supprimez le compte par défaut sans spécifier de compte géré par l'utilisateur.
Message d'erreur
gcloud
ERROR: (gcloud.functions.deploy) ResponseError: status=[404], code=[Ok], message=[Service account projects/-/serviceAccounts/PROJECT_NUMBER-compute@developer.gserviceaccount.com was not found.]
Solution
Pour résoudre ce problème, appliquez l'une des solutions suivantes:
Spécifiez un compte de service d'exécution géré par l'utilisateur avant de déployer votre fonction.
Annulez la suppression du compte de service à l'aide de l'ID numérique du compte de service par défaut.
Le compte de service de l'agent de service Cloud Functions ne dispose pas des autorisations nécessaires sur le bucket du projet lors du déploiement d'une fonction
Les fonctions Cloud Run Functions ne peuvent être déclenchées par des événements qu'à partir de buckets Cloud Storage situés dans le même projet Google Cloud Platform. En outre, le compte de service de l'agent de service Cloud Functions (service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com
) doit disposer d'un rôle cloudfunctions.serviceAgent
sur votre projet.
Message d'erreur
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"]
Solution
Pour résoudre ce problème, réinitialisez ce compte de service sur le rôle par défaut.
Un utilisateur doté du rôle d'éditeur de projet ne peut pas rendre une fonction disponible publiquement
Le rôle Éditeur de projet dispose d'autorisations étendues pour gérer les ressources d'un projet, mais il ne permet pas intrinsèquement de rendre Cloud Functions public. L'utilisateur ou le service déployant la fonction a besoin de l'autorisation run.services.setIamPolicy
.
Message d'erreur
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).
Solution
avec la gestion des correctifs :
Attribuer au "déployeur" le rôle de propriétaire du projet ou d'administrateur Cloud Functions
Accorder manuellement l'autorisation en créant un rôle personnalisé
Vérifiez si le partage restreint de domaine est appliqué au projet.
Échec du déploiement de la fonction lors de l'utilisation de la règle d'administration Restriction d'emplacement des ressources
Si votre organisation utilise une règle de contrainte d'emplacement des ressources, elle limite le déploiement des fonctions dans les régions restreintes par la règle. Dans la console Google Cloud, la région restreinte n'est pas disponible dans la liste déroulante de région lors du déploiement d'une fonction.
Message d'erreur
gcloud
ResponseError: status=[400], code=[Ok], message=["LOCATION" violates constraint "constraints/gcp.resourceLocations" on the resource "projects/PROJECT_ID/locations/LOCATION/functions/FUNCTION_NAME".]
Solution
Vous pouvez ajouter ou supprimer des emplacements dans les listes allowed_values
ou denied_values
d'une contrainte d'emplacement de ressources en fonction de la réussite du déploiement.
Échec du déploiement de la fonction lors de l'exécution du champ d'application global de la fonction
Cette erreur indique qu'un problème est lié au code. Le pipeline de déploiement a fini de déployer la fonction, mais a échoué à la dernière étape en envoyant une vérification d'état à la fonction. Cette vérification d'état est destinée à exécuter le champ d'application global d'une fonction, ce qui peut générer une exception, un plantage ou un dépassement de délai. Le champ d'application global est l'endroit où vous chargez généralement les bibliothèques et initialisez les clients.
Message d'erreur
Dans les journaux Cloud Logging :
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.
Solution
Pour résoudre ce problème, appliquez l'une des solutions suivantes:
Pour afficher un message d'erreur plus détaillé, consultez les journaux des builds de votre fonction, ainsi que les journaux d'exécution de la fonction.
Si vous ne comprenez pas pourquoi votre fonction n'a pas réussi à exécuter son champ d'application global, envisagez de déplacer temporairement le code dans l'appel de la requête, en utilisant l'initialisation différée des variables globales. Cela vous permet d'ajouter des entrées de journal supplémentaires à vos bibliothèques clientes, qui pourraient expirer lors de leur instanciation (surtout si elles appellent d'autres services), ou pour éviter tout plantage/toute génération d'exceptions.
Vous pouvez également essayer d'augmenter le délai avant expiration de la fonction. Les limites de délai d'inactivité plus longues dans les fonctions Cloud Run offrent plus de marge pour l'initialisation et permettent une allocation de ressources plus évolutive dans un environnement Cloud Run, ce qui peut atténuer ce problème s'il est dû à un épuisement des ressources.
Le code source doit contenir une fonction de point d'entrée qui a été correctement spécifiée dans le déploiement, via la console ou gcloud.
Un utilisateur disposant du rôle de lecteur ne peut pas déployer une fonction
Les utilisateurs disposant du rôle de lecteur de projet ou de lecteur Cloud Functions disposent d'un accès en lecture seule aux fonctions et aux détails des fonctions, et ne peuvent pas déployer de nouvelles fonctions. La fonctionnalité Créer une fonction est grisée dans la console Google Cloud avec l'erreur suivante:
Message d'erreur
gcloud
ERROR: (gcloud.functions.deploy) ResponseError: status=[403], code=[Ok], message=[Permission 'cloudfunctions.functions.generateUploadUrl' denied on 'projects/PROJECT_ID/locations/LOCATION/functions']
Solution
Attribuez le rôle de développeur Cloud Functions à l'utilisateur.
Autorisations manquantes pour le compte de service de compilation
Message d'erreur
Dans l'erreur de déploiement de la fonction ou dans les journaux de compilation, l'une des erreurs suivantes peut s'afficher :
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.
Solution
Le compte de service de compilation doit être autorisé à lire à partir du bucket source, ainsi qu'à lire et écrire des données pour le dépôt Artifact Deployment. Vous pouvez rencontrer cette erreur en raison d'un changement du comportement par défaut d'utilisation des comptes de service Cloud Build, détaillé dans la section Modification du compte de service Cloud Build.
Pour résoudre ce problème, appliquez l'une des solutions suivantes :
- Créez un compte de service de compilation personnalisé pour les déploiements de fonctions.
- Ajoutez le rôle de compte de service Cloud Build (
roles/cloudbuild.builds.builder
) au compte de service Compute par défaut. - Consultez les conseils de Cloud Build sur les modifications apportées au compte de service par défaut et désactivez ces modifications.
Compte de service de compilation désactivé
Message d'erreur
Could not build the function due to disabled service account used by Cloud Build. Please make sure that the service account is active.
Solution
Le compte de service de compilation doit être activé pour pouvoir déployer une fonction. Vous pouvez rencontrer cette erreur en raison d'une modification du comportement par défaut de la manière dont Cloud Build utilise les comptes de service, détaillé dans la section Modification du compte de service Cloud Build.
Pour résoudre ce problème, appliquez l'une des solutions suivantes :
- Créez un compte de service de compilation personnalisé pour les déploiements de fonctions.
- Activez le compte de service Compute par défaut.
- Consultez les conseils de Cloud Build sur les modifications apportées au compte de service par défaut et désactivez ces modifications.
Livraison
Cette section répertorie les problèmes que vous pouvez rencontrer et fournit des suggestions pour les résoudre.
Erreur d'autorisation de diffusion due à la fonction nécessitant une authentification
Les fonctions HTTP sans l'option Autoriser les appels non authentifiés activée limitent l'accès aux utilisateurs finaux et aux comptes de service qui ne disposent pas des autorisations appropriées. Ce message d'erreur indique que le demandeur n'est pas autorisé à appeler la fonction.
Message d'erreur
Code de réponse d'erreur HTTP : 403 Forbidden
Corps de la réponse d'erreur HTTP:
Error: Forbidden Your client does not have permission
to get URL /FUNCTION_NAME from this server.
Solution
Pour résoudre ce problème, appliquez l'une des solutions suivantes:
Attribuer à l'utilisateur le rôle Cloud IAM Demandeur Cloud Run pour la fonction spécifique
Redéployez votre fonction pour autoriser les appels non authentifiés si votre organisation le permet. Cette approche est utile pour les tests.
Erreur de diffusion due à la configuration de allow internal traffic only
Les paramètres d'entrée limitent les appels d'une fonction HTTP par des ressources extérieures à votre projet Google Cloud ou au périmètre de service VPC Service Controls.
Lorsque vous configurez le paramètre N'autoriser que le trafic interne pour le réseau entrant, ce message d'erreur indique que seules les requêtes provenant des réseaux VPC du même projet ou du même périmètre VPC Service Controls sont autorisées. Il peut également s'agir d'une erreur 404 pour l'URL functions.net
par défaut.
Message d'erreur
Code de réponse d'erreur HTTP: 404 NOT FOUND
Solution
Pour résoudre cette erreur, appliquez l'une des solutions suivantes:
Vous assurer que la requête provient bien de votre projet Google Cloud ou de votre périmètre de service VPC Service Controls
Modifier les paramètres d'entrée pour autoriser tout le trafic pour la fonction
Le code source des fonctions Cloud Run peut également entraîner une erreur 404 en raison d'une URL de fonction, de méthodes HTTP ou d'erreurs logiques incorrectes, etc.
L'appel de fonction ne contient pas d'identifiants d'authentification valides
L'appel d'une fonction Cloud Run Functions configurée avec un accès restreint nécessite un jeton d'ID. Les jetons d'accès ou les jetons d'actualisation ne fonctionnent pas.
Message d'erreur
Code de réponse d'erreur HTTP : 401 (Non autorisé)
Corps de la réponse d'erreur HTTP:
Your client does not have permission to the requested URL 'FUNCTION_NAME'
Solution
Pour résoudre cette erreur, choisissez l'une des solutions suivantes:
Assurez-vous que vos requêtes incluent un en-tête
Authorization: Bearer ID_TOKEN
et qu'il s'agit d'un jeton d'ID, et non d'un jeton d'accès ou d'actualisation. Si vous générez ce jeton manuellement avec la clé privée d'un compte de service, vous devez remplacer le jeton JWT autosigné par un jeton d'identité signé par Google. Pour en savoir plus, consultez Authentification pour l'appel.Appelez votre fonction HTTP à l'aide des identifiants d'authentification dans votre en-tête de requête. Par exemple, vous pouvez obtenir un jeton d'identité via
gcloud
comme suit : Pour en savoir plus, consultez la page Authentification pour l'appel .curl -H "Authorization: Bearer $(gcloud auth print-identity-token)"
https://REGION-PROJECT_ID.cloudfunctions.net/FUNCTION_NAMERedéployez votre fonction pour autoriser les appels non authentifiés si votre organisation le permet. Cette approche est utile pour les tests.
La fonction s'arrête en cours d'exécution ou continue de s'exécuter une fois votre code terminé
Certains environnements d'exécution Cloud Run Functions permettent aux utilisateurs d'exécuter des tâches asynchrones. Si votre fonction crée des tâches de ce type, elle doit également attendre explicitement que ces tâches se terminent. À défaut, votre fonction peut cesser de s'exécuter au mauvais moment.
Comportement de l'erreur
Votre fonction présente l'un des comportements suivants :
- Votre fonction s'arrête pendant l'exécution des tâches asynchrones, mais avant la fin du délai avant expiration spécifié.
- Votre fonction ne s'arrête pas une fois ces tâches terminées et continue de s'exécuter jusqu'à la fin du délai d'expiration.
Solution
Si votre fonction s'arrête prématurément, vous devez vous assurer que toutes les tâches asynchrones de votre fonction sont terminées avant qu'elle n'effectue l'une des actions suivantes:
- Renvoi d'une valeur
- Résolution ou refus d'un objet
Promise
renvoyé (fonctions Node.js uniquement) - Génération d'exceptions ou d'erreurs non interceptées
- Envoi d'une réponse HTTP
- Appel d'une fonction de rappel
Si votre fonction ne s'arrête pas une fois toutes les tâches asynchrones terminées, vous devez vérifier qu'elle signale correctement Cloud Run Functions une fois l'opération terminée. Veillez en particulier à effectuer l'une des opérations répertoriées ci-dessus dès que votre fonction a terminé ses tâches asynchrones.
Erreur d'environnement d'exécution lors de l'accès aux ressources protégées par VPC Service Controls
Par défaut, Cloud Run Functions utilise des adresses IP publiques pour envoyer des requêtes sortantes à d'autres services. Si vos fonctions ne se trouvent pas dans un périmètre VPC Service Controls, elles risquent de recevoir des réponses HTTP 403 lorsqu'elles tentent d'accéder aux services Google Cloud protégés par VPC Service Controls, en raison de refus du périmètre de service.
Message d'erreur
Dans les journaux des ressources auditées, une entrée de ce type se présente comme suit :
"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" ...
Solution
Pour résoudre cette erreur, choisissez l'une des solutions suivantes:
La fonction doit acheminer tout le trafic sortant vers le réseau VPC. Pour en savoir plus, consultez la section Déployer des fonctions conformes aux règles de VPC Service Controls.
Vous pouvez aussi accorder au compte de service d'exécution de la fonction l'accès au périmètre. Pour ce faire, vous pouvez utiliser au choix l'une des méthodes suivantes : créer un niveau d'accès et ajouter le niveau d'accès au périmètre de service, ou créer une règle d'entrée sur le périmètre. Pour en savoir plus, consultez la page Utiliser VPC Service Controls avec des fonctions situées en dehors d'un périmètre.
Évolutivité
Cette section répertorie les problèmes d'évolutivité et fournit des suggestions pour les résoudre.
Erreurs Cloud Logging liées à l'abandon de requêtes en file d'attente
Des échecs de scaling peuvent survenir dans les scénarios suivants:
- Une augmentation soudaine et importante du trafic
- Temps de démarrage à froid long.
- Temps de traitement des requêtes long.
- Un taux d'erreur de la fonction élevé
- Vous avez atteint la limite maximale d'instances et le système ne peut plus évoluer.
- Des facteurs temporaires attribuables au service Cloud Run Functions
Dans chacun de ces cas, Cloud Run Functions peut ne pas évoluer assez rapidement pour gérer le trafic.
Message d'erreur
The request was aborted because there was no available instance
severity=WARNING
(Code de réponse : 429) Cloud Run Functions ne peut pas évoluer en raison de la limitemax-instances
que vous avez définie lors de la configuration.severity=ERROR
(Code de réponse : 500) Cloud Run Functions ne peut intrinsèquement pas gérer le débit du trafic.
Solution
Pour résoudre ce problème, corrigez les causes répertoriées précédemment.
Pour les fonctions basées sur un déclencheur HTTP, faites en sorte que le client mette en œuvre un intervalle exponentiel entre les tentatives et que les nouvelles tentatives pour les requêtes ne soient pas supprimées. Si vous déclenchez Cloud Run Functions à partir de Workflows, vous pouvez utiliser pour ce faire la syntaxe
try/retry
.Pour les fonctions en arrière-plan ou basées sur des événements, Cloud Run Functions est compatible avec la distribution de type "au moins une fois". Même si vous n'activez pas explicitement les nouvelles tentatives, l'événement est automatiquement redistribué et l'exécution de la fonction est relancée. Pour en savoir plus, consultez la section Effectuer de nouvelles tentatives d'exécution des fonctions basées sur des événements.
Lorsque le problème est lié à une période d'augmentation temporaire du nombre d'erreurs attribuables uniquement à Cloud Run Functions, ou si vous avez besoin d'aide pour résoudre votre problème, veuillez contacter l'assistance.
Pour les problèmes liés aux démarrages à froid, configurez le nombre minimal d'instances afin de réduire le nombre de démarrages à froid ayant des implications de facturation plus élevées.
Journalisation
La section suivante traite des problèmes de journalisation et de la façon de les résoudre.
Les entrées de journal n'ont pas de niveaux de gravité des journaux, ou ceux-ci sont incorrects.
Par défaut, Cloud Run Functions inclut la journalisation de l'environnement d'exécution. Les journaux écrits dans stdout
ou stderr
s'affichent automatiquement dans Cloud Logging.
Par défaut, ces entrées de journal ne contiennent que des messages de chaîne.
Message d'erreur
Les niveaux de gravité sont absents ou incorrects dans les journaux.
Solution
Pour inclure les niveaux de gravité dans les journaux, vous devez envoyer une entrée de journal structurée.
Gérer ou consigner les exceptions différemment en cas de plantage
Vous souhaiterez peut-être personnaliser la manière dont vous gérez et consignez les informations sur les plantages.
Solution
Encapsulez votre fonction dans un bloc try
pour personnaliser la gestion des exceptions et les traces de la pile de journalisation.
Exemple
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!'
Journaux trop volumineux dans Node.js 10 et versions ultérieures, Python 3.8, Go 1.13 et Java 11
La taille maximale d'une entrée de journal standard dans ces environnements d'exécution est de 105 Kio.
Solution
Envoyez des entrées de journal qui ne dépassent pas cette limite
Journaux manquants alors que les fonctions Cloud Run renvoient des erreurs
Cloud Run Functions diffuse les journaux de Cloud Run Functions vers un bucket par défaut. Lorsque vous créez un projet, Cloud Run Functions crée et active le bucket par défaut. Si le bucket par défaut est désactivé ou si les journaux de Cloud Run Functions se trouvent dans le filtre d'exclusion, les journaux n'apparaissent pas dans l'Explorateur de journaux.
Solution
Activez les journaux par défaut.
Les journaux de Cloud Run Functions n'apparaissent pas dans l'Explorateur de journaux
Certaines bibliothèques clientes Cloud Logging utilisent un processus asynchrone pour écrire des entrées de journal. Si une fonction plante ou s'arrête, il est possible que certaines entrées de journal n'aient pas encore été écrites et qu'elles apparaissent ultérieurement. Certains journaux peuvent être perdus et ne pas être visibles dans l'explorateur de journaux.
Solution
Utilisez l'interface de bibliothèque cliente pour vider les entrées de journal mises en mémoire tampon avant de quitter la fonction ou utilisez la bibliothèque pour écrire des entrées de journal de manière synchrone. Vous pouvez également écrire des journaux de manière synchrone directement dans stdout
ou stderr
.
Journaux Cloud Run Functions manquants lors de l'utilisation du récepteur du routeur de journaux
Les récepteurs du routeur de journaux acheminent les entrées de journal vers différentes destinations.
Les filtres d'exclusion définissent les entrées que vous pouvez supprimer.
Solution
Supprimez l'ensemble de filtres d'exclusion défini pour resource.type = "cloud_run_revision"
.
Connexions à la base de données
Un certain nombre de problèmes peuvent survenir lors de la connexion à une base de données, la plupart étant liés au dépassement des limites de connexion ou à l'expiration du délai. Si un avertissement Cloud SQL s'affiche dans vos journaux (par exemple, Context deadline exceeded
), vous devrez peut-être ajuster votre configuration de connexion. Pour en savoir plus, consultez les bonnes pratiques relatives à Cloud SQL.
Mise en réseau
Cette section répertorie les problèmes de réseau et fournit des suggestions pour les résoudre.
Connectivité réseau
Si toutes les requêtes sortantes d'une fonction Cloud Run échouent même après la configuration des paramètres de sortie, vous pouvez exécuter le module Tests de connectivité pour identifier les problèmes de connectivité réseau sous-jacents. Pour plus d'informations, consultez la page Créer et exécuter des tests de connectivité.
Le connecteur d'accès au VPC sans serveur n'est pas prêt ou n'existe pas.
Si un connecteur d'accès au VPC sans serveur échoue, il risque de ne pas utiliser un masque de sous-réseau /28
dédié au connecteur, comme requis.
Message d'erreur
Problem connecting to VPC Connector projects/xxxxx/locations/REGION/connectors/xxxx: Serverless VPC Access is not found.
Lorsque les fonctions Cloud Run sont déployées avec un connecteur dont l'état est incorrect en raison d'une autorisation manquante sur le compte de service de l'agent de service des API Google PROJECT_NUMBER@cloudservices.gserviceaccount.com
, l'erreur suivante s'affiche :
Message d'erreur
Failed to prepare VPC connector. Please try again later.
Solution
Listez vos sous-réseaux pour vérifier si votre connecteur utilise un masque de sous-réseau /28
. Si votre connecteur n'utilise pas le masque de sous-réseau /28
, recréez ou créez un connecteur.
Pour résoudre ce problème, appliquez l'une des solutions suivantes:
Si vous recréez le connecteur, vous n'avez pas besoin de redéployer les autres fonctions. Vous risquez de subir une interruption du réseau lors de la recréation du connecteur.
Si vous créez un autre connecteur, redéployez vos fonctions pour qu'elles utilisent le nouveau connecteur, puis supprimez le connecteur d'origine. Cette méthode évite toute interruption du réseau.
Assurez-vous que Cloud Run Functions et le connecteur associé sont déployés dans la même région.
Pour la configuration du VPC partagé :
Assurez-vous que les comptes de service
SERVICE_PROJECT_NUMBER@cloudservices.gserviceaccount.com
etservice-SERVICE_PROJECT_NUMBER@gcp-sa-vpcaccess.iam.gserviceaccount.com
utilisés par VPC Connector pour provisionner des ressources dans le projet ne manquent pas d'autorisations. Ces comptes de service doivent disposer du rôleroles/compute.networkUser
dans le projet hôte de la configuration du VPC partagé lorsque le connecteur se trouve dans le projet de service.Si le connecteur est créé dans le projet hôte, assurez-vous que le rôle
Serverless VPC Access User
est accordé sur l'agent de service Cloud Run dans votre projet hôte.
Si l'état du connecteur indique l'erreur
Connector is in a bad state, manual deletion recommended
et que l'agent de service des API Google ne dispose pas des autorisations requises pour provisionner des ressources de calcul dans le projet du connecteur, accordezroles/compute.admin
au compte de servicePROJECT_NUMBER@cloudservices.gserviceaccount.com
. Dans certains cas, il peut être nécessaire de recréer le connecteur après avoir ajouté ces autorisations.
Le trafic SMTP vers des adresses IP de destination externes via le port TCP 25 est bloqué
Pour plus de sécurité, Google Cloud bloque les connexions au port de destination TCP 25
lors de l'envoi d'e-mails à partir de fonctions.
Solution
Pour débloquer ces connexions, suivez l'une des solutions suivantes:
Connectez-vous à votre serveur SMTP sur un autre port, tel que le port
587
ou465
.
Erreur 404 pour l'URL functions.net
par défaut
La désactivation de l'URL run.app
dans Cloud Run empêche également l'accès à l'URL cloudfunctions.net
par défaut pour Cloud Run Functions (2e génération). Cette erreur peut également être due à une erreur de diffusion en raison de la configuration "Autoriser uniquement le trafic interne".
Message d'erreur
Code de réponse d'erreur HTTP: 404 NOT FOUND
Solution
Pour réactiver l'URL cloudfunctions.net
par défaut pour Cloud Run Functions (2e génération), vous devez réactiver l'URL run.app
dans Cloud Run en remplaçant le fichier service.yaml
par une nouvelle configuration où annotations:run.googleapis.com/default-url-disabled: false