Gérer les fonctions


Vous pouvez déployer, supprimer et modifier des fonctions à l'aide de commandes CLI Firebase ou en définissant des options d'exécution dans le code source de vos fonctions.

Déployer des fonctions

Pour déployer des fonctions, exécutez la commande CLI Firebase suivante :

firebase deploy --only functions

Par défaut, la CLI Firebase déploie toutes les fonctions de votre source en même temps. Si votre projet contient plus de 5 fonctions, nous vous recommandons d'utiliser l'option --only avec des noms de fonction spécifiques de déployer uniquement les fonctions que vous avez modifiés. Déployer des fonctions spécifiques de cette manière accélère le processus de déploiement et vous évite de rencontrer des quotas de déploiement. Exemple :

firebase deploy --only functions:addMessage,functions:makeUppercase

Lorsque vous déployez un grand nombre de fonctions, vous pouvez dépasser le quota standard et recevoir des messages d'erreur HTTP 429 ou 500. Pour résoudre déployer les fonctions par groupes de 10 ou moins.

Consultez la documentation de référence de la CLI Firebase pour obtenir la liste complète des commandes.

Par défaut, la CLI Firebase recherche dans le dossier functions/ les le code source. Si vous préférez, vous pouvez organiser les fonctions. dans des codebases ou plusieurs ensembles de fichiers.

Supprimer des fonctions

Vous pouvez supprimer des fonctions précédemment déployées de plusieurs manières:

  • explicitement dans la CLI Firebase avec functions:delete
  • explicitement dans la console Google Cloud.
  • implicitement en supprimant la fonction de la source avant le déploiement.

Toutes les opérations de suppression vous invitent à confirmer avant de supprimer la fonction de production.

La suppression explicite de fonction dans la CLI Firebase accepte plusieurs arguments, ainsi que des groupes de fonctions, et vous permet de spécifier une fonction exécutée dans une région particulière. Vous pouvez également ignorer l'invite de confirmation.

# Delete all functions that match the specified name in all regions.
firebase functions:delete myFunction
# Delete a specified function running in a specific region.
firebase functions:delete myFunction --region us-east-1
# Delete more than one function
firebase functions:delete myFunction myOtherFunction
# Delete a specified functions group.
firebase functions:delete groupA
# Bypass the confirmation prompt.
firebase functions:delete myFunction --force

Avec la suppression de fonction implicite, firebase deploy analyse votre source et supprime de la production toutes les fonctions qui ont été supprimées du fichier.

Modifier le nom, la région ou le déclencheur d'une fonction

Si vous renommez ou modifiez les régions ou le déclencheur des fonctions qui gèrent le trafic de production, suivez les étapes de cette section pour éviter de perdre des événements lors de la modification. Avant de suivre ces étapes, assurez-vous que votre est idempotente, car la nouvelle et l'ancienne version de votre fonction s'exécuteront en même temps pendant le changement.

Renommer une fonction

Pour renommer une fonction, créez une version renommée de la fonction dans votre source, puis exécutez deux commandes de déploiement distinctes. La première commande déploie que vous venez de nommer, et la seconde commande supprime la fonction précédemment déployée version. Par exemple, si vous souhaitez renommer un webhook déclenché par HTTP, modifiez le code comme suit :

Node.js

// before
const {onRequest}  = require('firebase-functions/v2/https');

exports.webhook = onRequest((req, res) => {
    res.send("Hello");
});

// after
const {onRequest}  = require('firebase-functions/v2/https');

exports.webhookNew = onRequest((req, res) => {
    res.send("Hello");
});

Python

# before
from firebase_functions import https_fn

@https_fn.on_request()
def webhook(req: https_fn.Request) -> https_fn.Response:
    return https_fn.Response("Hello world!")

# after
from firebase_functions import https_fn

@https_fn.on_request()
def webhook_new(req: https_fn.Request) -> https_fn.Response:
    return https_fn.Response("Hello world!")

Exécutez ensuite les commandes suivantes pour déployer la nouvelle fonction :

# Deploy new function
firebase deploy --only functions:webhookNew

# Wait until deployment is done; now both functions are running

# Delete webhook
firebase functions:delete webhook

Modifier la région ou les régions d'une fonction

Si vous modifiez les régions spécifiées pour une qui gère le trafic de production, vous pouvez empêcher la perte d'événements en effectuant ces étapes dans l'ordre:

  1. Renommez la fonction et modifiez sa ou ses régions comme vous le souhaitez.
  2. Déployez la fonction renommée, ce qui entraîne l'exécution temporaire du même code dans les deux ensembles de régions.
  3. Supprimez la fonction précédente.

Par exemple, si une fonction est déclenchée par Cloud Firestore qui se trouve actuellement par défaut de la région us-central1, que vous souhaitez migrer vers asia-northeast1, vous devez d'abord modifier le code source pour renommer le et réviser la région.

Node.js

// before
exports.firestoreTrigger = onDocumentCreated(
  "my-collection/{docId}",
  (event) => {},
);

// after
exports.firestoreTriggerAsia = onDocumentCreated(
  {
    document: "my-collection/{docId}",
    region: "asia-northeast1",
  },
  (event) => {},
);

Le code mis à jour doit spécifier le bon filtre d'événement (dans ce cas, document) ainsi que la région. Pour en savoir plus, consultez la page Emplacements des fonctions Cloud Functions.

Python

# Before
@firestore_fn.on_document_created("my-collection/{docId}")
def firestore_trigger(event):
    pass

# After
@firestore_fn.on_document_created("my-collection/{docId}",
                                  region="asia-northeast1")
def firestore_trigger_asia(event):
    pass

Ensuite, déployez en exécutant la commande suivante:

firebase deploy --only functions:firestoreTriggerAsia

Deux fonctions identiques s'exécutent maintenant : firestoreTrigger s'exécute dans us-central1 et firestoreTriggerAsia s'exécute dans asia-northeast1.

Supprimez ensuite firestoreTrigger :

firebase functions:delete firestoreTrigger

Il n'y a désormais qu'une seule fonction : firestoreTriggerAsia, qui s'exécute dans asia-northeast1.

Modifier le type de déclencheur d'une fonction

Au fur et à mesure que vous développerez votre déploiement Cloud Functions for Firebase, vous pourrez avoir besoin de modifier le type de déclencheur d'une fonction pour diverses raisons. Par exemple, vous pouvez passer d'un type d'événement Firebase Realtime Database ou Cloud Firestore à un autre.

Il n'est pas possible de modifier le type d'événement d'une fonction en modifiant simplement code source et en exécutant firebase deploy. Pour éviter les erreurs, modifier le type de déclencheur d'une fonction en procédant comme suit:

  1. Modifiez le code source pour inclure une nouvelle fonction avec le type de déclencheur souhaité.
  2. Déployez la fonction, ce qui entraîne l'exécution temporaire des anciennes et nouvelles fonctions.
  3. Supprimez explicitement l'ancienne fonction de production à l'aide de la CLI Firebase.

Par exemple, si une fonction se déclenchait lorsqu'un objet était supprimé, mais vous avez ensuite activé gestion des versions des objets et que vous souhaitez plutôt vous abonner à l'événement d'archivage, renommez d'abord et modifiez-la pour qu'elle utilise le nouveau type de déclencheur.

Node.js

// before
const {onObjectDeleted} = require("firebase-functions/v2/storage");

exports.objectDeleted = onObjectDeleted((event) => {
    // ...
});

// after
const {onObjectArchived} = require("firebase-functions/v2/storage");

exports.objectArchived = onObjectArchived((event) => {
    // ...
});

Python

# before
from firebase_functions import storage_fn

@storage_fn.on_object_deleted()
def object_deleted(event):
  # ...

# after 
from firebase_functions import storage_fn

@storage_fn.on_object_archived()
def object_archived(event):
  # ...

Exécutez ensuite les commandes suivantes pour créer d'abord la nouvelle fonction, avant de supprimer l'ancienne :

# Create new function objectArchived
firebase deploy --only functions:objectArchived

# Wait until deployment is done; now both objectDeleted and objectArchived are running

# Delete objectDeleted
firebase functions:delete objectDeleted

Définir les options d'exécution

Cloud Functions for Firebase vous permet de sélectionner des options d'exécution telles que Node.js la version d'exécution et le délai avant expiration par fonction, l'allocation de mémoire et instances de fonction.

Ces options (à l'exception de la version de Node.js) doivent être définies sur un objet de configuration dans le code de la fonction. Cet objet RuntimeOptions est la source de vérité pour les options d'exécution de votre fonction et remplace les options définies via toute autre méthode (par exemple, via la console Google Cloud ou la gcloud CLI).

Si votre workflow de développement implique de définir manuellement des options d'exécution via la console Google Cloud ou gcloud CLI, et vous ne souhaitez pas que ces valeurs soient remplacée à chaque déploiement, définissez l'option preserveExternalChanges sur true. Lorsque cette option est définie sur true, Firebase fusionne les options d'exécution définies dans votre avec les paramètres de la version actuellement déployée de votre fonction la priorité suivante:

  1. L'option est définie dans le code des fonctions : forcer les modifications externes.
  2. L'option est définie sur RESET_VALUE dans le code des fonctions : remplacez les modifications externes par la valeur par défaut.
  3. L'option n'est pas définie dans le code des fonctions, mais elle est définie dans la fonction actuellement déployée: utilisez l'option spécifiée dans la fonction déployée.

L'utilisation de l'option preserveExternalChanges: true n'est pas recommandée pour la plupart des scénarios, car votre code ne sera plus la source complète de vérité pour les options d'exécution de vos fonctions. Si vous l'utilisez, consultez la console Google Cloud ou utilisez la commande CLI pour afficher la configuration complète d'une fonction.

Définir la version de Node.js

Le SDK Firebase pour Cloud Functions permet de sélectionner un environnement d'exécution Node.js. Vous pouvez choisir d'exécuter toutes les fonctions d'un projet exclusivement dans l'environnement d'exécution correspondant à l'une des versions Node.js compatibles suivantes :

  • Node.js 22 (preview)
  • Node.js 20
  • Node.js 18

Les versions 14 et 16 de Node.js sont obsolètes et seront mises hors service début 2025. Le déploiement avec ces versions obsolètes est désactivé.

Pour définir la version de Node.js, procédez comme suit:

Vous pouvez définir la version dans le champ engines du fichier package.json créé dans votre répertoire functions/ lors de l'initialisation. Par exemple, pour n'utiliser que la version 18, modifiez cette ligne dans package.json :

  "engines": {"node": "20"}

Si vous utilisez le gestionnaire de packages Yarn ou si vous avez d'autres exigences spécifiques pour le champ engines, vous pouvez définir l'environnement d'exécution pour le SDK Firebase pour Cloud Functions dans firebase.json à la place:

  {
    "functions": {
      "runtime": "nodejs18" // or nodejs20
    }
  }

La CLI utilise la valeur définie dans firebase.json plutôt que n'importe quelle valeur ou que vous avez définie séparément dans package.json.

Mettre à niveau votre environnement d'exécution Node.js

Pour mettre à niveau votre environnement d'exécution Node.js, procédez comme suit:

  1. Assurez-vous que votre projet est associé au forfait Blaze.
  2. Assurez-vous d'utiliser la version 11.18.0 ou ultérieure de la CLI Firebase.
  3. Modifiez la valeur engines dans le fichier package.json créé dans votre répertoire functions/ lors de l'initialisation. Par exemple, si vous passez de la version 18 à la version 20, l'entrée doit se présenter comme suit: "engines": {"node": "20"}
  4. Vous pouvez également tester vos modifications à l'aide de la méthode Firebase Local Emulator Suite
  5. Redéployez toutes les fonctions.

Définir la version Python

Le SDK Firebase pour Cloud Functions 12.0.0 et versions ultérieures permet de sélectionner le fichier de l'environnement d'exécution. Définissez la version d'exécution dans firebase.json comme indiqué :

  {
    "functions": {
      "runtime": "python310" // or python311
    }
  }

Contrôler le comportement du scaling

Par défaut, Cloud Functions for Firebase adapte le nombre d'instances en cours d'exécution en fonction du nombre de requêtes entrantes, et peut réduire le nombre d'instances à zéro en cas de trafic réduit. Toutefois, si votre application nécessite moins et que vous souhaitez limiter le nombre de démarrages à froid, vous pouvez modifier par défaut en spécifiant un nombre minimal d'instances de conteneur gardé en chaud et prêt à traiter les demandes.

De même, vous pouvez définir un nombre maximal pour limiter le scaling des instances en réponse aux requêtes entrantes. Utilisez ce paramètre pour contrôler vos coûts ou pour limiter le nombre de connexions à un service externe base de données.

L'utilisation de ces paramètres avec le paramètre de simultanéité par instance (nouveau de 2e génération), vous pouvez contrôler et ajuster le comportement de mise à l'échelle de vos fonctions. La nature de votre application et de sa fonction déterminera les paramètres les plus rentables et qui offrent les meilleures performances.

Pour certaines applications à faible trafic, une option de processeur inférieure sans multiconcurrency est optimale. Pour les autres cas où les démarrages à froid sont un problème critique, définir une simultanéité et un nombre minimal d'instances élevés signifie qu'un ensemble d'instances est toujours maintenu à chaud pour gérer les pics de trafic importants.

Pour les applications de petite envergure qui reçoivent très peu de trafic, définir un nombre d'instances maximales faible avec une concurrence élevée signifie que l'application peut gérer des pics de trafic sans encourir de coûts excessifs. Toutefois, n'oubliez pas que lorsque le nombre maximal d'instances est défini trop bas, les requêtes peuvent être abandonnées lorsque le plafond est atteint.

Autoriser les requêtes simultanées

Dans Cloud Functions for Firebase (1re génération), chaque instance pouvait gérer une seule requête à la fois. Le comportement de scaling n'était donc défini qu'avec les paramètres d'instance minimal et maximal. En plus de contrôler le nombre d'instances, dans Cloud Functions for Firebase (2e génération), vous peuvent contrôler le nombre de requêtes pouvant être traitées par chaque instance l'option concurrency. La valeur par défaut de la simultanéité est 80, mais vous pouvez la définir sur n'importe quel entier compris entre 1 et 1 000.

Les fonctions avec des paramètres de simultanéité élevés peuvent absorber les pics de trafic sans le démarrage à froid, car chaque instance a probablement une marge de progression. Si une instance est configuré pour traiter jusqu'à 50 requêtes simultanées, mais ne traite actuellement que 25, il peut gérer un pic de 25 requêtes supplémentaires l'instance en cours de démarrage à froid. En revanche, avec un paramètre de simultanéité défini sur seulement 1, d'un pic de requêtes peut entraîner 25 démarrages à froid.

Ce scénario simplifié illustre les gains d'efficacité potentiels de la simultanéité. En réalité, le scaling du comportement pour optimiser l'efficacité et réduire les démarrages à froid avec simultanéité sont plus complexes. Simultanéité dans Cloud Functions for Firebase 2e génération fonctionne avec Cloud Run et suit Règles de Cloud Run l'autoscaling des instances de conteneur.

Lorsque vous testez des paramètres de simultanéité plus élevés dans Cloud Functions for Firebase (2e génération), tenez compte des points suivants :

  • Des paramètres de simultanéité plus élevés peuvent nécessiter une quantité de processeur et de mémoire RAM plus élevée pour jusqu'à atteindre une limite pratique. Une fonction qui fait des le traitement d'images ou de vidéos, par exemple, peut ne pas disposer des ressources nécessaires 1 000 requêtes simultanées, même lorsque les paramètres de processeur et de RAM sont maximisés
  • Étant donné que Cloud Functions for Firebase (2e génération) est alimenté par Cloud Run, vous pouvez également consulter les conseils sur Google Cloud pour optimiser la simultanéité.
  • Veillez à tester minutieusement la simultanéité dans un environnement de test avant le passage à la multisimultanéité en production.

Garder un nombre minimal d'instances en attente

Vous pouvez définir un nombre minimal d'instances pour une fonction dans le code source. Par exemple, cette fonction définit un minimum de cinq instances pour maintenir la température :

Node.js

const { onCall } = require("firebase-functions/v2/https");

exports.getAutocompleteResponse = onCall(
  {
    // Keep 5 instances warm for this latency-critical function
    minInstances: 5,
  },
  (event) => {
    // Autocomplete user’s search term
  }
);

Python

@https_fn.on_call(min_instances=5)
def get_autocomplete_response(event: https_fn.CallableRequest) -> https_fn.Response:

Voici quelques éléments à prendre en compte lorsque vous définissez une valeur minimale d'instances :

  • Si Cloud Functions for Firebase met à l'échelle votre application au-delà de votre paramètre, un démarrage à froid se produira pour chaque instance au-dessus de ce seuil.
  • Les démarrages à froid ont l'effet le plus grave sur les applications dont le trafic est dense. Si votre application enregistre un trafic dense et que vous définissez une valeur suffisamment élevée pour les démarrages à froid sont réduits à chaque augmentation du trafic, vous constaterez que une latence réduite. Pour les applis au trafic constant, il est peu probable que les démarrages à froid peut avoir un impact important sur les performances.
  • Il peut être judicieux de définir un nombre minimal d'instances doivent généralement être évitées dans les environnements de test. Pour effectuer un scaling à zéro instance tout en réduisant les démarrages à froid dans votre projet de production, Vous pouvez définir un nombre minimal d'instances dans votre configuration paramétrée:

    Node.js

    const functions = require('firebase-functions/v1');
    const { defineInt, defineString } = require('firebase-functions/params');
    
    // Define some parameters
    const minInstancesConfig = defineInt('HELLO_WORLD_MININSTANCES');
    const welcomeMessage = defineString('WELCOME_MESSAGE');
    
    // To use configured parameters inside the config for a function, provide them 
    // directly. To use them at runtime, call .value() on them.
    export const helloWorld = functions.runWith({ minInstances: minInstancesConfig}).https.onRequest(
      (req, res) => {
        res.send(`${welcomeMessage.value()}! I am a function.`);
      }
    );
    

    Python

    MIN_INSTANCES = params.IntParam("HELLO_WORLD_MININSTANCES")
    WELCOME_MESSAGE = params.StringParam("WELCOME_MESSAGE")
    
    @https_fn.on_request(min_instances=MIN_INSTANCES.value())
    def get_autocomplete_response(event: https_fn.Request) -> https_fn.Response:
        return https_fn.Response(f"{WELCOME_MESSAGE.value()} I'm a function.")
    

Limiter le nombre maximal d'instances pour une fonction

Vous pouvez définir une valeur pour le nombre maximal d'instances dans le code source de la fonction. Par exemple, cette fonction définit une limite de 100 instances afin de ne pas surcharger une base de données existante hypothétique :

Node.js

const { onMessagePublished } = require("firebase-functions/v2/pubsub");

exports.mirrorevents = onMessagePublished(
  { topic: "topic-name", maxInstances: 100 },
  (event) => {
    // Connect to legacy database
  }
);

Python

@pubsub_fn.on_message_published(topic="topic-name", max_instances=100)
def mirrorevents(event: pubsub_fn.CloudEvent):
#  Connect to legacy database

Si le scaling à la hausse d'une fonction HTTP est défini pour atteindre le nombre maximal d'instances, les nouvelles requêtes sont mis en file d'attente pendant 30 secondes, puis rejeté avec le code de réponse suivant : 429 Too Many Requests si aucune instance n'est disponible d'ici cette date.

Pour en savoir plus sur les bonnes pratiques d'utilisation des paramètres de nombre maximal d'instances, consultez CANNOT TRANSLATE Bonnes pratiques pour définir un nombre maximal d'instances.

Définir le délai avant expiration et l'allocation de mémoire

Dans certains cas, vos fonctions peuvent avoir des exigences particulières pour un délai d'inactivité long ou une allocation importante de la mémoire. Vous pouvez définir ces valeurs dans la console Google Cloud ou dans le code source de la fonction (Firebase uniquement).

Pour définir l'allocation de mémoire et le délai avant expiration dans le code source des fonctions, utilisez les options globales pour la mémoire et le délai avant expiration pour personnaliser la machine virtuelle qui exécute vos fonctions. Par exemple, cette fonction Cloud Storage utilise 1 Gio de mémoire après 300 secondes:

Node.js

exports.convertLargeFile = onObjectFinalized({
  timeoutSeconds: 300,
  memory: "1GiB",
}, (event) => {
  // Do some complicated things that take a lot of memory and time
});

Python

@storage_fn.on_object_finalized(timeout_sec=300, memory=options.MemoryOption.GB_1)
def convert_large_file(event: storage_fn.CloudEvent):
# Do some complicated things that take a lot of memory and time.

La valeur maximale du délai avant expiration est de 540, soit 9 minutes.

Pour définir l'allocation de mémoire et le délai avant expiration dans la console Google Cloud :

  1. Dans la console Google Cloud, sélectionnez Cloud Functions for Firebase dans le menu de gauche.
  2. Sélectionnez une fonction en cliquant sur son nom dans la liste des fonctions.
  3. Cliquez sur l'icône Modifier dans le menu supérieur.
  4. Sélectionnez une allocation de mémoire dans le menu déroulant Memory allocated (Mémoire allouée).
  5. Cliquez sur Plus pour afficher les options avancées, puis saisissez un nombre de secondes dans la zone de texte Délai avant expiration.
  6. Cliquez sur Enregistrer pour mettre à jour la fonction.

Remplacer les paramètres par défaut du processeur

Jusqu'à 2 Go de mémoire allouée, chaque fonction dans Cloud Functions for Firebase (2e génération) est par défaut associée à un seul processeur, puis à deux processeurs pour 4 et 8 Go. Notez que ce comportement est très différent de celui par défaut de 1re génération de façon à ce que entraînent des coûts légèrement plus élevés pour les fonctions à faible mémoire, comme indiqué dans le tableau suivant:

RAM allouée Processeur par défaut de la version 1 (fractionnel) Processeur par défaut dans la version 2 Augmentation du prix par ms
128 Mo 12/01 1 x10,5
256 Mo 1/6 1 5,3 x
512 Mo 1/3 1 x 2,7
1 Go 12/07 1 x 1,6
2 Go 1 1 x 1
4GB 2 2 x 1
8 Go 2 2 x 1
16 Go Non disponible 4 Non disponible

Si vous préférez le comportement de la 1re génération pour vos fonctions de 2e génération, définissez les valeurs par défaut de la 1re génération comme option globale :

Node.js

// Turn off Firebase defaults
setGlobalOptions({ cpu: 'gcf_gen1' });

Python

# Use 1st gen behavior
set_global_options(cpu="gcf_gen1")

Pour les fonctions nécessitant une utilisation intensive des processeurs, la 2e génération permet de configurer CPU Vous pouvez accélérer le processeur par fonction, comme illustré ci-dessous :

Node.js

// Boost CPU in a function:
export const analyzeImage = onObjectFinalized({ cpu: 2 }, (event) => {
  // computer vision goes here
});

Python

# Boost CPU in a function:
@storage_fn.on_object_finalized(cpu=2)
def analyze_image(event: storage_fn.CloudEvent):
# computer vision goes here