Avant de connecter votre application à l'émulateur Cloud Functions, assurez-vous de comprendre le workflow global de Firebase Local Emulator Suite, d'installer et de configurer Local Emulator Suite, et de consulter ses commandes de CLI.
Choisir un projet Firebase
Firebase Local Emulator Suite émule les produits d'un seul projet Firebase.
Pour sélectionner le projet à utiliser, avant de démarrer les émulateurs, exécutez firebase use dans votre répertoire de travail dans la CLI. Vous pouvez également transmettre l'option --project à chaque commande de l'émulateur.
Local Emulator Suite est compatible avec l'émulation de projets Firebase réels et de projets de démonstration.
| Type de projet | Fonctionnalités | Utiliser avec des émulateurs |
|---|---|---|
| Situation réelle |
Un projet Firebase réel est un projet que vous avez créé et configuré (probablement via la console Firebase). Les projets réels disposent de ressources actives, telles que des instances de base de données, des buckets de stockage, des fonctions ou toute autre ressource que vous configurez pour ce projet Firebase. |
Lorsque vous travaillez avec de vrais projets Firebase, vous pouvez exécuter des émulateurs pour l'un ou l'ensemble des produits compatibles. Pour tous les produits que vous n'émulez pas, vos applications et votre code interagiront avec la ressource active (instance de base de données, bucket de stockage, fonction, etc.). |
| Démo |
Un projet de démonstration Firebase ne comporte pas de véritable configuration Firebase ni de ressources actives. Ces projets sont généralement accessibles via des ateliers de programmation ou d'autres tutoriels. Les ID des projets de démonstration ont le préfixe |
Lorsque vous travaillez avec des projets Firebase de démonstration, vos applications et votre code interagissent uniquement avec des émulateurs. Si votre application tente d'interagir avec une ressource pour laquelle un émulateur n'est pas en cours d'exécution, ce code échouera. |
Nous vous recommandons d'utiliser des projets de démonstration dans la mesure du possible. Voici quelques-uns de ses avantages :
- Configuration plus simple, car vous pouvez exécuter les émulateurs sans jamais créer de projet Firebase
- Sécurité renforcée : si votre code appelle accidentellement des ressources non émulées (production), il n'y a aucun risque de modification des données, d'utilisation et de facturation.
- Meilleure compatibilité hors connexion, car il n'est pas nécessaire d'accéder à Internet pour télécharger la configuration de votre SDK.
Instrumenter votre application pour communiquer avec les émulateurs
Instrumenter votre application pour les fonctions appelables
Si vos activités de prototypage et de test impliquent des fonctions de backend appelables, configurez l'interaction avec l'émulateur Cloud Functions for Firebase comme suit :
Kotlin
// 10.0.2.2 is the special IP address to connect to the 'localhost' of // the host computer from an Android emulator. val functions = Firebase.functions functions.useEmulator("10.0.2.2", 5001)
Java
// 10.0.2.2 is the special IP address to connect to the 'localhost' of // the host computer from an Android emulator. FirebaseFunctions functions = FirebaseFunctions.getInstance(); functions.useEmulator("10.0.2.2", 5001);
Swift
Functions.functions().useEmulator(withHost: "localhost", port: 5001)
Unity
FirebaseFunctions functions = FirebaseFunctions.DefaultInstance; // Connects to the Functions Emulator running on port 5001 functions.UseFunctionsEmulator("http://127.0.0.1:5001");
Web
import { getApp } from "firebase/app"; import { getFunctions, connectFunctionsEmulator } from "firebase/functions"; const functions = getFunctions(getApp()); connectFunctionsEmulator(functions, "127.0.0.1", 5001);
Web
firebase.functions().useEmulator("127.0.0.1", 5001);
Instrumenter votre application pour l'émulation des fonctions HTTPS
Chaque fonction HTTPS de votre code sera diffusée à partir de l'émulateur local au format d'URL suivant :
http://$HOST:$PORT/$PROJECT/$REGION/$NAME
Par exemple, une fonction helloWorld simple avec le port hôte et la région par défaut serait diffusée à l'adresse suivante :
https://localhost:5001/$PROJECT/us-central1/helloWorld
Instrumenter votre application pour l'émulation des fonctions de file d'attente de tâches
L'émulateur configure automatiquement les files d'attente de tâches émulées en fonction des définitions de déclencheurs, et le SDK Admin redirige les requêtes mises en file d'attente vers l'émulateur s'il détecte qu'il s'exécute via la variable d'environnement CLOUD_TASKS_EMULATOR_HOST.
Notez que le système de distribution utilisé en production est plus complexe que celui implémenté dans l'émulateur. Vous ne devez donc pas vous attendre à ce que le comportement émulé reflète précisément les environnements de production. Les paramètres de l'émulateur fournissent des limites supérieures au taux de distribution et de nouvelle tentative des tâches.
Instrumenter votre application pour l'émulation des fonctions déclenchées en arrière-plan
L'émulateur Cloud Functions est compatible avec les fonctions déclenchées en arrière-plan à partir des sources suivantes :
- Realtime Database emulator
- Cloud Firestore emulator
- Authentication emulator
- Pub/Sub emulator
- Émulateur Firebase Alerts
Pour déclencher des événements en arrière-plan, modifiez les ressources de backend à l'aide de Emulator Suite UI ou en connectant votre application ou votre code de test aux émulateurs à l'aide du SDK de votre plate-forme.
Tester les gestionnaires pour les événements personnalisés émis par les extensions
Pour les fonctions que vous implémentez afin de gérer les événements personnalisés Firebase Extensions avec Cloud Functions v2, l'émulateur Cloud Functions s'associe à l'émulateur Eventarc pour prendre en charge les déclencheurs Eventarc.
Pour tester les gestionnaires d'événements personnalisés pour les extensions qui émettent des événements, vous devez installer les émulateurs Cloud Functions et Eventarc.
L'environnement d'exécution Cloud Functions définit la variable d'environnement EVENTARC_EMULATOR sur localhost:9299 dans le processus actuel si l'émulateur Eventarc est en cours d'exécution. Les Firebase Admin SDK se connectent automatiquement à l'émulateur Eventarc lorsque la variable d'environnement EVENTARC_EMULATOR est définie. Vous pouvez modifier le port par défaut comme indiqué dans Configurer Local Emulator Suite.
Lorsque les variables d'environnement sont correctement configurées, Firebase Admin SDK envoie automatiquement des événements à l'émulateur Eventarc. À son tour, l'émulateur Eventarc rappelle l'émulateur Cloud Functions pour déclencher les gestionnaires enregistrés.
Vous pouvez consulter les journaux Functions dans Emulator Suite UI pour en savoir plus sur l'exécution du gestionnaire.
Configurer un environnement de test local
Si vos fonctions s'appuient sur une configuration d'environnement basée sur dotenv, vous pouvez émuler ce comportement dans votre environnement de test local.
Lorsque vous utilisez un émulateur Cloud Functions local, vous pouvez remplacer les variables d'environnement de votre projet en configurant un fichier .env.local. Le contenu de .env.local est prioritaire sur .env et sur le fichier .env spécifique au projet.
Par exemple, un projet peut inclure ces trois fichiers contenant des valeurs légèrement différentes pour le développement et les tests locaux :
.env
|
.env.dev
|
.env.local
|
| PLANET=Earth
AUDIENCE=Humans |
AUDIENCE=Dev Humans | AUDIENCE=Local Humans |
Lorsqu'il est démarré dans le contexte local, l'émulateur charge les variables d'environnement comme indiqué ci-dessous :
$ firebase emulators:start
i emulators: Starting emulators: functions
# Starts emulator with following environment variables:
# PLANET=Earth
# AUDIENCE=Local Humans
Secrets et identifiants dans l'émulateur Cloud Functions
L'émulateur Cloud Functions permet d'utiliser des secrets pour stocker des informations de configuration sensibles et y accéder. Par défaut, l'émulateur tente d'accéder à vos secrets de production à l'aide des identifiants par défaut de l'application. Dans certains cas, comme dans les environnements d'intégration continue, l'émulateur peut ne pas pouvoir accéder aux valeurs des secrets en raison de restrictions d'autorisation.
Comme pour la compatibilité de l'émulateur Cloud Functions avec les variables d'environnement, vous pouvez remplacer les valeurs des secrets en configurant un fichier .secret.local. Cela vous permet de tester facilement vos fonctions localement, en particulier si vous n'avez pas accès à la valeur du secret.
Quels autres outils existent pour tester Cloud Functions ?
L'émulateur Cloud Functions est complété par d'autres outils de prototypage et de test :
- Le shell Cloud Functions, qui permet de prototyper et de développer des fonctions de manière interactive et itérative. Le shell utilise l'émulateur Cloud Functions avec une interface de type REPL pour le développement. Aucune intégration avec les émulateurs Cloud Firestore ou Realtime Database n'est fournie. À l'aide du shell, vous simulez des données et effectuez des appels de fonction pour simuler l'interaction avec des produits que Local Emulator Suite n'est pas compatible actuellement : Analytics, Remote Config et Crashlytics.
- Le SDK Firebase Test pour Cloud Functions, un framework Node.js avec Mocha pour le développement de fonctions. En effet, le SDK de test Cloud Functions fournit une automatisation en plus du shell Cloud Functions.
Pour en savoir plus sur le shell Cloud Functions et le SDK de test Cloud Functions, consultez les pages Tester des fonctions de manière interactive et Tests unitaires de Cloud Functions.
Différences entre l'émulateur Cloud Functions et la production
L'émulateur Cloud Functions est assez proche de l'environnement de production pour la majorité des cas d'utilisation. Nous avons déployé des efforts considérables pour que l'environnement d'exécution Node soit aussi proche que possible de la production. Toutefois, l'émulateur n'imite pas l'intégralité de l'environnement de production conteneurisé. Par conséquent, même si le code de votre fonction s'exécute de manière réaliste, d'autres aspects de votre environnement (fichiers locaux, comportement après un plantage de fonction, etc.) seront différents.
Cloud IAM
La suite d'émulateurs Firebase ne tente pas de répliquer ni de respecter un comportement lié à IAM pour l'exécution. Les émulateurs respectent les règles de sécurité Firebase fournies, mais dans les situations où IAM serait normalement utilisé, par exemple pour définir le compte de service appelant Cloud Functions et donc les autorisations, l'émulateur n'est pas configurable et utilise le compte disponible de manière globale sur votre ordinateur de développement, comme si vous exécutiez directement un script local.
Restrictions de mémoire et de processeur
L'émulateur n'applique pas de restrictions de mémoire ou de processeur pour vos fonctions. Toutefois, l'émulateur accepte l'expiration des fonctions via l'argument d'exécution timeoutSeconds.
Notez que le temps d'exécution des fonctions peut différer de la production lorsque les fonctions sont exécutées dans l'émulateur. Nous vous recommandons d'effectuer des tests limités en production pour confirmer les temps d'exécution après avoir conçu et testé les fonctions avec l'émulateur.
Planifier les différences entre les environnements locaux et de production
Étant donné que l'émulateur s'exécute sur votre ordinateur local, il dépend de votre environnement local pour les applications, les programmes intégrés et les utilitaires.
Sachez que votre environnement local pour le développement Cloud Functions peut différer de l'environnement de production Google :
Les applications que vous installez localement pour simuler l'environnement de production (par exemple, ImageMagick dans ce tutoriel) peuvent se comporter différemment de la production, en particulier si vous avez besoin d'une version différente ou si vous développez dans un environnement non Linux. Envisagez de déployer votre propre copie binaire du programme manquant en même temps que le déploiement de votre fonction.
De même, les utilitaires intégrés (par exemple, les commandes shell telles que
ls,mkdir) peuvent différer des versions disponibles en production, en particulier si vous développez dans un environnement non Linux (par exemple, macOS). Vous pouvez résoudre ce problème en utilisant des alternatives Node-only aux commandes natives ou en créant des binaires Linux à regrouper avec votre déploiement.
Nouvelle tentative
L'émulateur Cloud Functions ne permet pas de réessayer les fonctions en cas d'échec.
Et maintenant ?
- Pour obtenir une sélection de vidéos et des exemples détaillés, suivez la playlist de formation sur les émulateurs Firebase.
- Pour en savoir plus sur l'émulateur Cloud Functions for Firebase, consultez Exécuter des fonctions localement.