Comment faire un backup d'une base de données fire store ?

Comment faire un backup d'une base de données fire store ?

  Firebase Javascript

Introduction

À l’ère du prototypage rapide, nous pouvons avoir des idées brillantes, mais parfois elles ne sont pas applicables si elles demandent trop de travail.

Souvent, le back-end est le facteur limitant, de nombreuses considérations ne s’appliquent jamais du côté serveur en raison d’un manque de connaissances ou de temps.

Firebase est un Backend-as-a-Service (BaaS). Il est devenu une plate-forme de développement d’applications de nouvelle génération sur Google Cloud Platform (GCP).

Firebase dispose d’une base de données nommée Fire Store très performante et orientée document.

Je vous propose dans cet article de voir ensemble, comment mettre en place une sauvegarde automatique de votre base de données Fire Store, toutes les nuits.

💫 La cloud function

Les cloud functions sont des scripts qui vous permettent d’exécuter automatiquement du code backend en réponse à des événements déclenchés par des fonctionnalités Firebase, et des requêtes HTTPS.

Votre code JavaScript ou TypeScript est stocké dans le cloud de Google, et s’exécute dans un environnement géré.

Nous allons déclarer ensemble une cloud function qui s’exécutera tous les soirs à minuit :

import * as admin from 'firebase-admin';
import { logger, runWith } from 'firebase-functions';

/**
 * Backup fire store database at 00:00am each day
 */
export const fireStoreBackupScheduler = runWith({ timeoutSeconds: 120 })
  .pubsub.schedule('every day 00:00')
  .timeZone('Europe/Paris')
  .onRun(async () => {
    logger.info('backup fire store database batch starting');

    admin.initializeApp();

    // TODO save fire store documents
  });

La cloud function n’est pas encore complète, mais cela vous donne déjà un aperçu de comment cela fonctionne.

Nous utilisons un scheduler qui sera planifié toutes les nuits à minuit, avec la timezone Europe/Paris.

🪣 Utilisation d’un bucket

Un bucket est un emplacement permettant de stocker les objets, à l’image d’un entrepôt. La taille d’un bucket n’a pas de limite et s’ajuste au besoin des utilisateurs. Notez qu’un bucket est associé à un data center et donc à une certaine zone géographique (cela peut avoir son importance pour des questions de bande passante et de réactivité).

Nous allons utiliser le storage firebase qui est en réalité un bucket, afin de sauvegarder le résultat de notre backup.

Avant de pouvoir effectuer la sauvegarde vous devez activer cette option dans votre projet en accédant au panneau Créer > Storage depuis la console Firebase.

🗂 Exporter les documents Fire Store

Il ne nous reste plus qu’à exporter les documents de notre base de données Fire Store.

Pour ce faire, nous allons utiliser la classe FirestoreAdminClient du package firebase-admin :

import * as admin from 'firebase-admin';
import { logger, runWith } from 'firebase-functions';

/**
 * Backup fire store database at 00:00am each day
 */
export const fireStoreBackupScheduler = runWith({ timeoutSeconds: 120 })
  .pubsub.schedule('every day 00:00')
  .timeZone('Europe/Paris')
  .onRun(async () => {
    logger.info('backup fire store database batch starting');

    admin.initializeApp();

    const client = new admin.firestore.v1.FirestoreAdminClient(); 

    const projectId = process.env.GCP_PROJECT ?? process.env.GCLOUD_PROJECT; 
    const databaseName = client.databasePath(projectId!, '(default)'); 
    const timeStamp = new Date().toISOString().slice(0, 10); 

    try { 
      await client.exportDocuments({ 
        name: databaseName, 
        outputUriPrefix: `gs://<BUCKET_ID>/${BACKUP_FOLDER}/${timeStamp}`
      }); 
    } catch (error) { 
      logger.error('An error happened when exporting fire store documents', error); 
    } 
  });

Notez qu’il faudra remplacer BUCKET_ID par l’id de votre bucket cloud storage.

🪬 Ajout de droits IAM

Afin que la cloud function fonctionne, il sera indispensable d’ajouter des rôles supplémentaires IAM sur l’utilisateur appspot.gserviceaccount.com.

Pour ce faire, accéder à la console google cloud depuis ce lien : https://console.cloud.google.com/iam-admin/iam

Cliquez sur modifier le compte principal pour l’utilisateur <project-id>@appspot.gserviceaccount.com.

Ajouter ensuite les rôles :