Une nouvelle fonctionnalité ajoutée à Google Cloud Firestore est la gestion de plusieurs bases de données dans un même projet. Dans cet article/POC (proof of concept) nous allons explorer cette nouvelle fonctionnalité et voir comment l’intégrer dans un projet.
Cette fonctionalité est en Pre-GA. À utiliser avec précaution.
Scénario
Vous travaillez sur un projet bien structuré avec plusieurs environnements : dev, staging, prod et vous aimeriez tout garder dans un même projet. Vous avez alors la possibilité de :
- Suffixer chaque collection Firestore avec le suffix de l’environnement. Par exemple
dev_users,prod_userspour les collections des utilisateurs en dev et en prod - Créer une base de données dev et prod afin d’isoler vos données
Avantages de cette nouvelle fonctionnalité
- Isolation des bases de données : possibilité d’isoler les données
- Gestion individuelle des bases de données
- Suivi individuel de la facturation des bdd
- Surveillance et collection des métriques de bdd de façons séparée
- Gestion des règles de sécurité à différentes bases de données Firestore avec les Conditions IAM ou les Règles de sécurité Firebase
- Prise en charge des deux modes de Firestore (natif ou en mode Datastore)
Limitations
Cette fonctionnalité a actuellement quelques limitations :
- Maximum de 100 bases de données par projet pouvant être augmenté grâce à une requête d’augmentation du quota
- Après la suppression d'une ressource de base de données, l'ID de la base de données ne peut être réutilisé qu'après une période de 37 jours.
- Seuls les déclencheurs Cloud Firestore 2e génération peuvent utiliser les événements pour les bases de données nommées.
Prise en main
Le concept est assez simple à comprendre et à utiliser (il existe déjà dans presque toutes les bdd) : créer une base de données isolée et la gérer individuellement.
Pour interagir avec le service Firestore et les bdd, il est possible d’utiliser :
- Gcloud (l’utilitaire de commande de Google Cloud)
- Terraform
- L’API Google Cloud Platform
Pour cette partie, nous utiliserons gcloud.
Voici les opérations possibles :
- Créer une bdd
gcloud alphafirestore databases create --database=development --location=europe-west9 \
--type=firestore-native
Cette commande prend comme paramètres :
database: nom de la bdd. Entre 4 et 63 caractèreslocation: emplacement de la bdd (region, multiregion). voir: https://firebase.google.com/docs/firestore/locationstype: type/mode de la bdd firestore.firestore-nativepour le mode natif etdatastore-modepour le mode Datastore.firestore-nativepar défaut-delete-protection: pour activer la protection contre la suppression. C’est une fonctionnalité qui bloque la suppression d’une bdd tant qu'elle est activée.

- Lister les bdd
gcloud alpha firestore databases list
Cette commande liste toutes les bdd Firestore présente dans le projet.
gcloud firestore databases list
---
appEngineIntegrationMode: DISABLED
concurrencyMode: PESSIMISTIC
createTime: '2023-09-20T10:15:52.102833Z'
deleteProtectionState: DELETE_PROTECTION_DISABLED
earliestVersionTime: '2023-09-20T10:15:52.102833Z'
etag: IMbIiYH8uIEDMLGv98f6uIED
locationId: europe-west9
name: projects/loopbin/databases/development
pointInTimeRecoveryEnablement: POINT_IN_TIME_RECOVERY_DISABLED
type: FIRESTORE_NATIVE
uid: 0a181b17-eae8-4e68-864f-ba9cf9d3ae6d
updateTime: '2023-09-20T10:15:52.102833Z'
versionRetentionPeriod: 3600s
---
- Mettre à jour une bdd
gcloud alpha firestore databases update --database=development \
--type=firestore-native
Il permet aussi de gérer la protection de suppression de la bdd.
Activation sur la bdd se développent en utilisant --delete-protection
gcloud alpha firestore databases update --database=development --delete-protection
On peut utiliser --no-delete-protection pour retirer cette protection.
- Supprimer une bdd
gcloud alpha firestore databases delete --database=development
Bien sûr, cette commande échouera si la protection de suppression est activée.
Terraform
La resource google_firestore_database permet de créer des bdd Firestore grâce à Terraform.
Exemple :
resource "google_firestore_database" "database" {
project = var.project_id
name = "development"
location_id = "europe-west9"
type = "FIRESTORE_NATIVE"
concurrency_mode = "OPTIMISTIC"
app_engine_integration_mode = "DISABLED"
point_in_time_recovery_enablement = "POINT_IN_TIME_RECOVERY_ENABLED"
}
Utilisation
Maintenant, que nous avons nos 3 bases de donnee (default, development et staging) nous allons voir comment on peut les utiliser avec Python.
La spécification de la base de données à utiliser se fait durant l’initialisation du client dans notre code.
from google.cloud import firestore
db = firestore.Client(database='development')
collection_ref = db.collection("users")
Comme vous pouvez le voir dans la documentation, il est possible de passer la base de données en paramètre. La bdd de défaut est utilisé si rien n’est spécifié.

Pour les autres langages et SDK, veuillez consulter les documentations.
Until next time, stay in the loop, stay awesome.