Firebase commence à prendre en charge Terraform . Si vous faites partie d'une équipe qui souhaite automatiser et standardiser la création de projets Firebase avec des ressources spécifiques fournies et des services activés, l'utilisation de Terraform avec Firebase peut être une bonne solution pour vous.
Le workflow de base pour l'utilisation de Terraform avec Firebase comprend les éléments suivants :
Création et personnalisation d'un fichier de configuration Terraform (un fichier
.tf
) qui spécifie l'infrastructure que vous souhaitez provisionner (c'est-à-dire les ressources que vous souhaitez provisionner et les services que vous souhaitez activer).Utiliser les commandes gCloud CLI qui s'interfacent avec Terraform pour provisionner l'infrastructure spécifiée dans le fichier
.tf
.
Que pouvez-vous faire avec Terraform et Firebase ?
L' exemple de flux de travail généralisé dans ce guide consiste à créer un nouveau projet Firebase avec une application Android. Mais vous pouvez faire bien plus avec Terraform, comme :
Supprimez et modifiez l'infrastructure existante à l'aide de Terraform.
Gérez la configuration et les tâches spécifiques au produit à l'aide de Terraform, telles que :
- Activation des fournisseurs de connexion à l'authentification Firebase.
- Création de buckets Cloud Storage ou d'instances de base de données et déploiement de règles de sécurité Firebase pour ceux-ci.
Vous pouvez utiliser des fichiers de configuration et des commandes Terraform standard pour accomplir toutes ces tâches. Et pour vous aider, nous avons fourni des exemples de fichiers de configuration Terraform pour plusieurs cas d'utilisation courants.
Workflow généralisé pour l'utilisation de Terraform avec Firebase
Conditions préalables
Ce guide est une introduction à l'utilisation de Terraform avec Firebase, il suppose donc une maîtrise de base de Terraform. Assurez-vous d'avoir rempli les conditions préalables suivantes avant de démarrer ce flux de travail.
Installez Terraform et familiarisez-vous avec Terraform à l'aide de leurs didacticiels officiels.
Installez Google Cloud CLI (gCloud CLI). Connectez-vous en utilisant un compte utilisateur ou un compte de service .
- Si vous utilisez un compte utilisateur, vous devez avoir accepté les conditions d'utilisation de Firebase (Firebase ToS). Vous avez accepté les conditions d'utilisation de Firebase si vous pouvez afficher un projet Firebase dans la console Firebase.
- Pour que Terraform puisse effectuer certaines actions (par exemple, créer des projets), les conditions suivantes doivent être vraies :
- L'utilisateur ou le compte de service doit disposer de l'accès IAM applicable pour ces actions.
- Si l'utilisateur ou le compte de service fait partie d'une organisation Google Cloud, les règles de l'organisation doivent autoriser le compte à effectuer ces actions.
Étape 1 : Créer et personnaliser un fichier de configuration Terraform
Un fichier de configuration Terraform nécessite deux sections principales (qui sont décrites en détail ci-dessous) :
- Une section de configuration
provider
qui dicte les ressources Terraform accessibles - Une section de blocs
resource
individuels qui spécifient quelle infrastructure créer
Configurez votre provider
Une configuration provider
est requise, quels que soient les produits ou services Firebase impliqués.
Créez un fichier de configuration Terraform (comme le fichier
main.tf
) dans votre répertoire local.Dans ce guide, vous utiliserez ce fichier de configuration pour spécifier à la fois la configuration du
provider
et toute l'infrastructure que vous souhaitez que Terraform crée. Notez cependant que vous disposez d'options pour inclure la configuration du fournisseur.Vous disposez des options suivantes pour inclure une configuration
provider
au reste de votre configuration Terraform :Option 1 : incluez-le en haut d'un seul fichier de configuration Terraform
.tf
(comme indiqué dans ce guide).- Utilisez cette option si vous débutez avec Terraform ou si vous essayez simplement Terraform avec Firebase.
Option 2 : incluez-le dans un fichier
.tf
distinct (comme un fichierprovider.tf
), en dehors du fichier.tf
dans lequel vous spécifiez l'infrastructure à créer (comme un fichiermain.tf
).- Utilisez cette option si vous faites partie d’une équipe plus grande qui doit standardiser la configuration.
- Lors de l'exécution de commandes Terraform, le fichier
provider.tf
et le fichiermain.tf
doivent se trouver dans le même répertoire.
Incluez la configuration
provider
suivante en haut du fichiermain.tf
Vous devez utiliser le fournisseur
google-beta
car il s'agit d'une version bêta de l'utilisation de Firebase avec Terraform. Soyez prudent lors de l’utilisation en production.# Terraform configuration to set up providers by version. terraform { required_providers { google-beta = { source = "hashicorp/google-beta" version = "~> 4.0" } } } # Configures the provider to use the resource block's specified project for quota checks. provider "google-beta" { user_project_override = true } # Configures the provider to not use the resource block's specified project for quota checks. # This provider should only be used during project creation and initializing services. provider "google-beta" { alias = "no_user_project_override" user_project_override = false }
Apprenez-en davantage sur les différents types d'attributs liés au projet (y compris ce que ce guide appelle le « projet de vérification des quotas ») lors de l'utilisation de Terraform avec Firebase.
Passez à la section suivante pour compléter votre fichier de configuration et spécifier quelle infrastructure créer.
Spécifiez quelle infrastructure créer à l'aide de blocs resource
Dans votre fichier de configuration Terraform (pour ce guide, votre fichier main.tf
), vous devez spécifier toute l'infrastructure que vous souhaitez que Terraform crée (c'est-à-dire toutes les ressources que vous souhaitez provisionner et tous les services que vous souhaitez activer). Dans ce guide, retrouvez une liste complète de toutes les ressources Firebase prenant en charge Terraform .
Ouvrez votre fichier
main.tf
Sous la configuration
provider
, incluez la configuration suivante de blocsresource
.Cet exemple de base crée un nouveau projet Firebase, puis crée une application Android Firebase au sein de ce projet.
# Terraform configuration to set up providers by version. ... # Configures the provider to use the resource block's specified project for quota checks. ... # Configures the provider to not use the resource block's specified project for quota checks. ... # Creates a new Google Cloud project. resource "google_project" "default" { provider = google-beta.no_user_project_override name = "Project Display Name" project_id = "project-id-for-new-project" # Required for any service that requires the Blaze pricing plan # (like Firebase Authentication with GCIP) billing_account = "000000-000000-000000" # Required for the project to display in any list of Firebase projects. labels = { "firebase" = "enabled" } } # Enables required APIs. resource "google_project_service" "default" { provider = google-beta.no_user_project_override project = google_project.default.project_id for_each = toset([ "cloudbilling.googleapis.com", "cloudresourcemanager.googleapis.com", "firebase.googleapis.com", # Enabling the ServiceUsage API allows the new project to be quota checked from now on. "serviceusage.googleapis.com", ]) service = each.key # Don't disable the service if the resource block is removed by accident. disable_on_destroy = false } # Enables Firebase services for the new project created above. resource "google_firebase_project" "default" { provider = google-beta project = google_project.default.project_id # Waits for the required APIs to be enabled. depends_on = [ google_project_service.default ] } # Creates a Firebase Android App in the new project created above. resource "google_firebase_android_app" "default" { provider = google-beta project = google_project.default.project_id display_name = "My Awesome Android app" package_name = "awesome.package.name" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.default, ] }
Si vous n'êtes pas familier avec l'infrastructure des projets et des applications en tant que ressources, consultez la documentation suivante :
- Comprendre les projets Firebase
- Documentation de référence pour la gestion de projet Firebase
# Terraform configuration to set up providers by version. ... # Configures the provider to use the resource block's specified project for quota checks. ... # Configures the provider to not use the resource block's specified project for quota checks. ... # Creates a new Google Cloud project. resource "google_project" "default" { # Use the provider that enables the setup of quota checks for a new project provider = google-beta.no_user_project_override name = "Project Display Name" // learn more about the project name project_id = "project-id-for-new-project" // learn more about the project ID # Required for any service that requires the Blaze pricing plan # (like Firebase Authentication with GCIP) billing_account = "000000-000000-000000" # Required for the project to display in any list of Firebase projects. labels = { "firebase" = "enabled" // learn more about the Firebase-enabled label } } # Enables required APIs. resource "google_project_service" "default" { # Use the provider without quota checks for enabling APIS provider = google-beta.no_user_project_override project = google_project.default.project_id for_each = toset([ "cloudbilling.googleapis.com", "cloudresourcemanager.googleapis.com", "firebase.googleapis.com", # Enabling the ServiceUsage API allows the new project to be quota checked from now on. "serviceusage.googleapis.com", ]) service = each.key # Don't disable the service if the resource block is removed by accident. disable_on_destroy = false } # Enables Firebase services for the new project created above. # This action essentially "creates a Firebase project" and allows the project to use # Firebase services (like Firebase Authentication) and # Firebase tooling (like the Firebase console). # Learn more about the relationship between Firebase projects and Google Cloud. resource "google_firebase_project" "default" { # Use the provider that performs quota checks from now on provider = google-beta project = google_project.default.project_id # Waits for the required APIs to be enabled. depends_on = [ google_project_service.default ] } # Creates a Firebase Android App in the new project created above. # Learn more about the relationship between Firebase Apps and Firebase projects. resource "google_firebase_android_app" "default" { provider = google-beta project = google_project.default.project_id display_name = "My Awesome Android app" # learn more about an app's display name package_name = "awesome.package.name" # learn more about an app's package name # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.default, ] }
Étape 2 : Exécutez les commandes Terraform pour créer l'infrastructure spécifiée
Pour provisionner les ressources et activer les services spécifiés dans votre fichier main.tf
, exécutez les commandes suivantes à partir du même répertoire que votre fichier main.tf
Pour des informations détaillées sur ces commandes, consultez la documentation Terraform .
Si c'est la première fois que vous exécutez des commandes Terraform dans le répertoire, vous devez initialiser le répertoire de configuration et installer le fournisseur Google Terraform. Pour ce faire, exécutez la commande suivante :
terraform init
Créez l'infrastructure spécifiée dans votre fichier
main.tf
en exécutant la commande suivante :terraform apply
Confirmez que tout a été provisionné ou activé comme prévu :
Option 1 : consultez la configuration imprimée dans votre terminal en exécutant la commande suivante :
terraform show
Option 2 : affichez votre projet Firebase dans la console Firebase .
Ressources Firebase avec prise en charge de Terraform
Les ressources Firebase et Google suivantes prennent en charge Terraform. Et nous ajoutons constamment de nouvelles ressources ! Donc, si vous ne voyez pas la ressource que vous souhaitez gérer avec Terraform, revenez bientôt pour voir si elle est disponible ou demandez-la en déposant un problème dans le dépôt GitHub .
Gestion de projets et d'applications Firebase
google_firebase_project
— active les services Firebase sur un projet Google Cloud existantgoogle_firebase_project_location
: définissez l'emplacement des ressources Google Cloud par défaut du projet.Applications Firebase
-
google_firebase_apple_app
— créer ou gérer une application Firebase pour les plateformes Apple -
google_firebase_android_app
— créer ou gérer une application Android Firebase -
google_firebase_web_app
— créer ou gérer une application Web Firebase
-
Authentification Firebase
google_identity_platform_config
— activez Google Cloud Identity Platform (GCIP) (qui est le backend de l'authentification Firebase) et fournissez les paramètres d'authentification au niveau du projetLa configuration de l'authentification Firebase via Terraform nécessite l'activation de GCIP. Assurez-vous de consulter l' exemple de fichier
.tf
pour savoir comment configurer l'authentification Firebase .Le projet dans lequel Terraform activera l'authentification GCIP et/ou Firebase doit figurer sur le plan tarifaire Blaze (c'est-à-dire que le projet doit avoir un compte de facturation Cloud associé). Vous pouvez le faire par programme en définissant l'attribut
billing_account
dans la ressourcegoogle_project
.Cette ressource permet également davantage de configurations, telles que les méthodes de connexion locales, telles que l'authentification anonyme, par e-mail/mot de passe et par téléphone, ainsi que les fonctions de blocage et les domaines autorisés.
google_identity_platform_default_supported_idp_config
— configurez les fournisseurs d'identité fédérés courants, comme Google, Facebook ou Appleidentity_platform_oauth_idp_config
— configurez des sources arbitraires du fournisseur d'identité OAuth (IdP)google_identity_platform_inbound_saml_config
— configurer les intégrations SAML
Pas encore pris en charge :
- Configuration de l'authentification multifacteur (MFA) via Terraform
Base de données en temps réel Firebase
-
google_firebase_database_instance
— crée une instance de base de données en temps réel
Pas encore pris en charge :
- Déploiement des règles de sécurité de la base de données en temps réel Firebase via Terraform (découvrez comment déployer ces règles à l'aide d'autres outils, y compris des options de programmation)
Cloud Firestore
google_firestore_database
— créer une instance Cloud Firestoregoogle_firestore_index
— activez des requêtes efficaces pour Cloud Firestoregoogle_firestore_document
: amorcez une instance Cloud Firestore avec un document spécifique dans une collectionImportant : n'utilisez pas de données réelles sur l'utilisateur final ou la production dans ce document de départ.
Stockage cloud pour Firebase
google_firebase_storage_bucket
: rend un bucket Cloud Storage existant accessible aux SDK Firebase, à l'authentification et aux règles de sécurité Firebase.- La configuration d'un bucket Cloud Storage par défaut pour un projet Firebase nécessite d'abord le provisionnement
google_app_engine_application
. Assurez-vous de consulter l' exemple de fichier.tf
pour savoir comment provisionner les buckets Cloud Storage .
- La configuration d'un bucket Cloud Storage par défaut pour un projet Firebase nécessite d'abord le provisionnement
google_storage_bucket_object
: ajoute un objet à un bucket Cloud StorageImportant : N'utilisez pas de données réelles d'utilisateur final ou de production dans ce fichier.
Règles de sécurité Firebase (pour Cloud Firestore et Cloud Storage)
Notez que Firebase Realtime Database utilise un système de provisionnement différent pour ses règles de sécurité Firebase.
google_firebaserules_ruleset
: définissez les règles de sécurité Firebase qui s'appliquent à l'instance Cloud Firestore ou à un bucket Cloud Storagegoogle_firebaserules_release
— déployez des ensembles de règles spécifiques sur l'instance Cloud Firestore ou un bucket Cloud Storage
Vérification de l'application Firebase
-
google_firebase_app_check_service_config
— activer l'application d'App Check pour un service -
google_firebase_app_check_app_attest_config
— enregistrez une application de plates-formes Apple auprès du fournisseur App Attest -
google_firebase_app_check_device_check_config
— enregistrez une application de plates-formes Apple auprès du fournisseur DeviceCheck -
google_firebase_app_check_play_integrity_config
— enregistrez une application Android auprès du fournisseur Play Integrity -
google_firebase_app_check_recaptcha_enterprise_config
— enregistrez une application Web auprès du fournisseur reCAPTCHA Enterprise -
google_firebase_app_check_recaptcha_v3_config
— enregistrez une application Web auprès du fournisseur reCAPTCHA v3 -
google_firebase_app_check_debug_token
— utilise des jetons de débogage pour les tests
Extensions Firebase
-
google_firebase_extensions_instance
- installer ou mettre à jour une instance d'une extension Firebase
Exemples de fichiers de configuration Terraform pour les cas d'utilisation courants
Cette configuration crée un nouveau projet Google Cloud, associe le projet à un compte Cloud Billing (le plan tarifaire Blaze est requis pour l'authentification Firebase avec GCIP), active les services Firebase pour le projet, configure l'authentification Firebase avec GCIP et enregistre trois applications différentes. types avec le projet.
Notez que l'activation de GCIP est requise pour configurer l'authentification Firebase via Terraform.
# Creates a new Google Cloud project. resource "google_project" "auth" { provider = google-beta.no_user_project_override folder_id = "folder-id-for-new-project" name = "Project Display Name" project_id = "project-id-for-new-project" # Associates the project with a Cloud Billing account # (required for Firebase Authentication with GCIP). billing_account = "000000-000000-000000" # Required for the project to display in a list of Firebase projects. labels = { "firebase" = "enabled" } } # Enables required APIs. resource "google_project_service" "auth" { provider = google-beta.no_user_project_override project = google_project.auth.project_id for_each = toset([ "cloudbilling.googleapis.com", "cloudresourcemanager.googleapis.com", "serviceusage.googleapis.com", "identitytoolkit.googleapis.com", ]) service = each.key # Don't disable the service if the resource block is removed by accident. disable_on_destroy = false } # Enables Firebase services for the new project created above. resource "google_firebase_project" "auth" { provider = google-beta project = google_project.auth.project_id depends_on = [ google_project_service.auth, ] } # Creates an Identity Platform config. # Also enables Firebase Authentication with Identity Platform in the project if not. resource "google_identity_platform_config" "auth" { provider = google-beta project = google_project.auth.project_id # Auto-deletes anonymous users autodelete_anonymous_users = true # Configures local sign-in methods, like anonymous, email/password, and phone authentication. sign_in { allow_duplicate_emails = true anonymous { enabled = true } email { enabled = true password_required = false } phone_number { enabled = true test_phone_numbers = { "+11231231234" = "000000" } } } # Sets an SMS region policy. sms_region_config { allowlist_only { allowed_regions = [ "US", "CA", ] } } # Configures blocking functions. blocking_functions { triggers { event_type = "beforeSignIn" function_uri = "https://us-east1-${google_project.auth.project_id}.cloudfunctions.net/before-sign-in" } forward_inbound_credentials { refresh_token = true access_token = true id_token = true } } # Configures a temporary quota for new signups for anonymous, email/password, and phone number. quota { sign_up_quota_config { quota = 1000 start_time = "" quota_duration = "7200s" } } # Configures authorized domains. authorized_domains = [ "localhost", "${google_project.auth.project_id}.firebaseapp.com", "${google_project.auth.project_id}.web.app", ] # Wait for identitytoolkit.googleapis.com to be enabled before initializing Authentication. depends_on = [ google_project_service.auth, ] } # Creates a Firebase Android App in the new project created above. resource "google_firebase_android_app" "auth" { provider = google-beta project = google_project.auth.project_id display_name = "My Android app" package_name = "android.package.name" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.auth, ] } # Creates a Firebase Apple-platforms App in the new project created above. resource "google_firebase_apple_app" "auth" { provider = google-beta project = google_project.auth.project_id display_name = "My Apple app" bundle_id = "apple.app.12345" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.auth, ] } # Creates a Firebase Web App in the new project created above. resource "google_firebase_web_app" "auth" { provider = google-beta project = google_project.auth.project_id display_name = "My Web app" # The other App types (Android and Apple) use "DELETE" by default. # Web apps don't use "DELETE" by default due to backward-compatibility. deletion_policy = "DELETE" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.auth, ] }
Cette configuration crée un nouveau projet Google Cloud, active les services Firebase pour le projet, provisionne l'instance de base de données en temps réel par défaut du projet et enregistre trois types d'applications différents avec le projet.
# Creates a new Google Cloud project. resource "google_project" "rtdb" { provider = google-beta.no_user_project_override folder_id = "folder-id-for-new-project" name = "Project Display Name" project_id = "project-id-for-new-project" # Required for the project to display in a list of Firebase projects. labels = { "firebase" = "enabled" } } # Enables required APIs. resource "google_project_service" "rtdb" { provider = google-beta.no_user_project_override project = google_project.rtdb.project_id for_each = toset([ "serviceusage.googleapis.com", "cloudresourcemanager.googleapis.com", "firebasedatabase.googleapis.com", ]) service = each.key # Don't disable the service if the resource block is removed by accident. disable_on_destroy = false } # Enables Firebase services for the new project created above. resource "google_firebase_project" "rtdb" { provider = google-beta project = google_project.rtdb.project_id } # Provisions the default Realtime Database default instance. resource "google_firebase_database_instance" "database" { provider = google-beta project = google_project.rtdb.project_id # See available locations: https://firebase.google.com/docs/projects/locations#rtdb-locations region = "name-of-region" # This value will become the first segment of the database's URL. instance_id = "${google_project.rtdb.project_id}-default-rtdb" type = "DEFAULT_DATABASE" # Wait for Firebase to be enabled in the Google Cloud project before initializing Realtime Database. depends_on = [ google_firebase_project.rtdb, ] } # Creates a Firebase Android App in the new project created above. resource "google_firebase_android_app" "rtdb" { provider = google-beta project = google_project.rtdb.project_id display_name = "My Android app" package_name = "android.package.name" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.rtdb, ] } # Creates a Firebase Apple-platforms App in the new project created above. resource "google_firebase_apple_app" "rtdb" { provider = google-beta project = google_project.rtdb.project_id display_name = "My Apple app" bundle_id = "apple.app.12345" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.rtdb, ] } # Creates a Firebase Web App in the new project created above. resource "google_firebase_web_app" "rtdb" { provider = google-beta project = google_project.rtdb.project_id display_name = "My Web app" # The other App types (Android and Apple) use "DELETE" by default. # Web apps don't use "DELETE" by default due to backward-compatibility. deletion_policy = "DELETE" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.rtdb, ] }
Cette configuration crée un nouveau projet Google Cloud, associe le projet à un compte de facturation Cloud (le plan tarifaire Blaze est requis pour plusieurs instances de base de données en temps réel), active les services Firebase pour le projet, provisionne plusieurs instances de base de données en temps réel (y compris la base de données en temps réel par défaut du projet). exemple), et enregistre trois types d'applications différents avec le projet.
# Creates a new Google Cloud project. resource "google_project" "rtdb-multi" { provider = google-beta.no_user_project_override folder_id = "folder-id-for-new-project" name = "Project Display Name" project_id = "project-id-for-new-project" # Associate the project with a Cloud Billing account # (required for multiple Realtime Database instances). billing_account = "000000-000000-000000" # Required for the project to display in a list of Firebase projects. labels = { "firebase" = "enabled" } } # Enables required APIs. resource "google_project_service" "rtdb-multi" { provider = google-beta.no_user_project_override project = google_project.rtdb-multi.project_id for_each = toset([ "cloudbilling.googleapis.com", "serviceusage.googleapis.com", "cloudresourcemanager.googleapis.com", "firebasedatabase.googleapis.com", ]) service = each.key # Don't disable the service if the resource block is removed by accident. disable_on_destroy = false } # Enables Firebase services for the new project created above. resource "google_firebase_project" "rtdb-multi" { provider = google-beta project = google_project.rtdb-multi.project_id } # Provisions the default Realtime Database default instance. resource "google_firebase_database_instance" "database-default" { provider = google-beta project = google_project.rtdb-multi.project_id # See available locations: https://firebase.google.com/docs/projects/locations#rtdb-locations region = "name-of-region" # This value will become the first segment of the database's URL. instance_id = "${google_project.rtdb-multi.project_id}-default-rtdb" type = "DEFAULT_DATABASE" # Wait for Firebase to be enabled in the Google Cloud project before initializing Realtime Database. depends_on = [ google_firebase_project.rtdb-multi, ] } # Provisions an additional Realtime Database instance. resource "google_firebase_database_instance" "database-additional" { provider = google-beta project = google_project.rtdb-multi.project_id # See available locations: https://firebase.google.com/docs/projects/locations#rtdb-locations # This location doesn't need to be the same as the default database instance. region = "name-of-region" # This value will become the first segment of the database's URL. instance_id = "name-of-additional-database-instance" type = "USER_DATABASE" # Wait for Firebase to be enabled in the Google Cloud project before initializing Realtime Database. depends_on = [ google_firebase_project.rtdb-multi, ] } # Creates a Firebase Android App in the new project created above. resource "google_firebase_android_app" "rtdb-multi" { provider = google-beta project = google_project.rtdb-multi.project_id display_name = "My Android app" package_name = "android.package.name" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.rtdb-multi, ] } # Creates a Firebase Apple-platforms App in the new project created above. resource "google_firebase_apple_app" "rtdb-multi" { provider = google-beta project = google_project.rtdb-multi.project_id display_name = "My Apple app" bundle_id = "apple.app.12345" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.rtdb-multi, ] } # Creates a Firebase Web App in the new project created above. resource "google_firebase_web_app" "rtdb-multi" { provider = google-beta project = google_project.rtdb-multi.project_id display_name = "My Web app" # The other App types (Android and Apple) use "DELETE" by default. # Web apps don't use "DELETE" by default due to backward-compatibility. deletion_policy = "DELETE" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.rtdb-multi, ] }
Cette configuration crée un nouveau projet Google Cloud, active les services Firebase pour le projet, provisionne l'instance Cloud Firestore du projet et enregistre trois types d'applications différents avec le projet.
Il fournit également des règles de sécurité Firebase pour l'instance Cloud Firestore, crée un index Cloud Firestore et ajoute un document Cloud Firestore avec des données de départ.
# Creates a new Google Cloud project. resource "google_project" "firestore" { provider = google-beta.no_user_project_override folder_id = "folder-id-for-new-project" name = "Project Display Name" project_id = "project-id-for-new-project" # Required for the project to display in a list of Firebase projects. labels = { "firebase" = "enabled" } } # Enables required APIs. resource "google_project_service" "firestore" { provider = google-beta.no_user_project_override project = google_project.firestore.project_id for_each = toset([ "cloudresourcemanager.googleapis.com", "serviceusage.googleapis.com", "firestore.googleapis.com", "firebaserules.googleapis.com", ]) service = each.key # Don't disable the service if the resource block is removed by accident. disable_on_destroy = false } # Enables Firebase services for the new project created above. resource "google_firebase_project" "firestore" { provider = google-beta project = google_project.firestore.project_id } # Provisions the Firestore database instance. resource "google_firestore_database" "firestore" { provider = google-beta project = google_project.firestore.project_id name = "(default)" # See available locations: https://firebase.google.com/docs/projects/locations#default-cloud-location location_id = "name-of-region" # "FIRESTORE_NATIVE" is required to use Firestore with Firebase SDKs, authentication, and Firebase Security Rules. type = "FIRESTORE_NATIVE" concurrency_mode = "OPTIMISTIC" # Wait for Firebase to be enabled in the Google Cloud project before initializing Firestore. depends_on = [ google_firebase_project.firestore, ] } # Creates a ruleset of Firestore Security Rules from a local file. resource "google_firebaserules_ruleset" "firestore" { provider = google-beta project = google_project.firestore.project_id source { files { name = "firestore.rules" # Write security rules in a local file named "firestore.rules". # Learn more: https://firebase.google.com/docs/firestore/security/get-started content = file("firestore.rules") } } # Wait for Firestore to be provisioned before creating this ruleset. depends_on = [ google_firestore_database.firestore, ] } # Releases the ruleset for the Firestore instance. resource "google_firebaserules_release" "firestore" { provider = google-beta name = "cloud.firestore" # must be cloud.firestore ruleset_name = google_firebaserules_ruleset.firestore.name project = google_project.firestore.project_id # Wait for Firestore to be provisioned before releasing the ruleset. depends_on = [ google_firestore_database.firestore, ] } # Adds a new Firestore index. resource "google_firestore_index" "indexes" { provider = google-beta project = google_project.firestore.project_id collection = "quiz" query_scope = "COLLECTION" fields { field_path = "question" order = "ASCENDING" } fields { field_path = "answer" order = "ASCENDING" } # Wait for Firestore to be provisioned before adding this index. depends_on = [ google_firestore_database.firestore, ] } # Adds a new Firestore document with seed data. # Don't use real end-user or production data in this seed document. resource "google_firestore_document" "doc" { provider = google-beta project = google_project.firestore.project_id collection = "quiz" document_id = "question-1" fields = "{\"question\":{\"stringValue\":\"Favorite Database\"},\"answer\":{\"stringValue\":\"Firestore\"}}" # Wait for Firestore to be provisioned before adding this document. depends_on = [ google_firestore_database.firestore, ] } # Creates a Firebase Android App in the new project created above. resource "google_firebase_android_app" "firestore" { provider = google-beta project = google_project.firestore.project_id display_name = "My Android app" package_name = "android.package.name" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.firestore, ] } # Creates a Firebase Apple-platforms App in the new project created above. resource "google_firebase_apple_app" "firestore" { provider = google-beta project = google_project.firestore.project_id display_name = "My Apple app" bundle_id = "apple.app.12345" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.firestore, ] } # Creates a Firebase Web App in the new project created above. resource "google_firebase_web_app" "firestore" { provider = google-beta project = google_project.firestore.project_id display_name = "My Web app" # The other App types (Android and Apple) use "DELETE" by default. # Web apps don't use "DELETE" by default due to backward-compatibility. deletion_policy = "DELETE" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.firestore, ] }
Il s'agit de l'ensemble de règles de sécurité Cloud Firestore qui doit se trouver dans un fichier local nommé firestore.rules
.
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { allow read: if request.auth != null; allow create: if request.auth != null; allow update: if request.auth != null; } }
Cette configuration crée un nouveau projet Google Cloud, active les services Firebase pour le projet, provisionne le bucket Cloud Storage par défaut du projet et enregistre trois types d'applications différents avec le projet.
Il fournit également des règles de sécurité Firebase pour le bucket Cloud Storage et télécharge un fichier dans le bucket.
# Creates a new Google Cloud project. resource "google_project" "storage" { provider = google-beta.no_user_project_override folder_id = "folder-id-for-new-project" name = "Project Display Name" project_id = "project-id-for-new-project" # Required for the project to display in a list of Firebase projects. labels = { "firebase" = "enabled" } } # Enables required APIs. resource "google_project_service" "storage" { provider = google-beta.no_user_project_override project = google_project.storage.project_id for_each = toset([ "serviceusage.googleapis.com", "cloudresourcemanager.googleapis.com", "firebaserules.googleapis.com", "firebasestorage.googleapis.com", "storage.googleapis.com", ]) service = each.key # Don't disable the service if the resource block is removed by accident. disable_on_destroy = false } # Enables Firebase services for the new project created above. resource "google_firebase_project" "storage" { provider = google-beta project = google_project.storage.project_id } # Provisions the default Cloud Storage bucket for the project via Google App Engine. resource "google_app_engine_application" "default" { provider = google-beta project = google_project.storage.project_id # See available locations: https://firebase.google.com/docs/projects/locations#default-cloud-location # This will set the location for the default Storage bucket and the App Engine App. location_id = "name-of-region-for-default-bucket" # If you use Firestore, uncomment this to make sure Firestore is provisioned first. # depends_on = [ # google_firestore_database.firestore # ] } # Makes the default Storage bucket accessible for Firebase SDKs, authentication, and Firebase Security Rules. resource "google_firebase_storage_bucket" "default-bucket" { provider = google-beta project = google_project.storage.project_id bucket_id = google_app_engine_application.default.default_bucket } # Creates a ruleset of Cloud Storage Security Rules from a local file. resource "google_firebaserules_ruleset" "storage" { provider = google-beta project = google_project.storage.project_id source { files { # Write security rules in a local file named "storage.rules". # Learn more: https://firebase.google.com/docs/storage/security/get-started name = "storage.rules" content = file("storage.rules") } } # Wait for the default Storage bucket to be provisioned before creating this ruleset. depends_on = [ google_firebase_project.storage, ] } # Releases the ruleset to the default Storage bucket. resource "google_firebaserules_release" "default-bucket" { provider = google-beta name = "firebase.storage/${google_app_engine_application.default.default_bucket}" ruleset_name = "projects/${google_project.storage.project_id}/rulesets/${google_firebaserules_ruleset.storage.name}" project = google_project.storage.project_id } # Uploads a new file to the default Storage bucket. # Don't use real end-user or production data in this file. resource "google_storage_bucket_object" "cat-picture" { provider = google-beta name = "cat.png" source = "path/to/cat.png" bucket = google_app_engine_application.default.default_bucket } # Creates a Firebase Android App in the new project created above. resource "google_firebase_android_app" "storage" { provider = google-beta project = google_project.storage.project_id display_name = "My Android app" package_name = "android.package.name" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.storage, ] } # Creates a Firebase Apple-platforms App in the new project created above. resource "google_firebase_apple_app" "storage" { provider = google-beta project = google_project.storage.project_id display_name = "My Apple app" bundle_id = "apple.app.12345" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.storage, ] } # Creates a Firebase Web App in the new project created above. resource "google_firebase_web_app" "storage" { provider = google-beta project = google_project.storage.project_id display_name = "My Web app" # The other App types (Android and Apple) use "DELETE" by default. # Web apps don't use "DELETE" by default due to backward-compatibility. deletion_policy = "DELETE" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.storage, ] }
Il s'agit de l'ensemble de règles de sécurité du stockage Cloud qui doit se trouver dans un fichier local nommé storage.rules
.
rules_version = '2'; service firebase.storage { match /b/{bucket}/o { match /{allPaths=**} { allow read, write: if request.auth != null; } } }
Cette configuration crée un nouveau projet Google Cloud, associe le projet à un compte de facturation Cloud (le plan tarifaire Blaze est requis pour plusieurs compartiments), active les services Firebase pour le projet, provisionne plusieurs compartiments Cloud Storage (y compris le compartiment Cloud Storage par défaut du projet). , et enregistre trois types d'applications différents avec le projet.
Il fournit également des règles de sécurité Firebase pour les buckets Cloud Storage et télécharge un fichier dans le bucket Cloud Storage par défaut.
# Creates a new Google Cloud project. resource "google_project" "storage-multi" { provider = google-beta.no_user_project_override folder_id = "folder-id-for-new-project" name = "Project Display Name" project_id = "project-id-for-new-project" # Associates the project with a Cloud Billing account # (required for multiple Cloud Storage buckets). billing_account = "000000-000000-000000" # Required for the project to display in a list of Firebase projects. labels = { "firebase" = "enabled" } } # Enables required APIs. resource "google_project_service" "storage-multi" { provider = google-beta.no_user_project_override project = google_project.storage-multi.project_id for_each = toset([ "cloudbilling.googleapis.com", "serviceusage.googleapis.com", "cloudresourcemanager.googleapis.com", "firebaserules.googleapis.com", "firebasestorage.googleapis.com", "storage.googleapis.com", ]) service = each.key # Don't disable the service if the resource block is removed by accident. disable_on_destroy = false } # Enables Firebase services for the new project created above. resource "google_firebase_project" "storage-multi" { provider = google-beta project = google_project.storage-multi.project_id } # Provisions the default Cloud Storage bucket for the project via Google App Engine. resource "google_app_engine_application" "default-multi" { provider = google-beta project = google_project.storage-multi.project_id # See available locations: https://firebase.google.com/docs/projects/locations#default-cloud-location # This will set the location for the default Storage bucket and the App Engine App. location_id = "name-of-region-for-default-bucket" # If you use Firestore, uncomment this to make sure Firestore is provisioned first. # depends_on = [ # google_firestore_database.firestore # ] } # Provisions an additional Cloud Storage bucket. # Additional Cloud Storage buckets are not provisioned via App Engine. resource "google_storage_bucket" "bucket-multi" { provider = google-beta project = google_project.storage-multi.project_id name = "name-of-additional-storage-bucket" # See available locations: https://cloud.google.com/storage/docs/locations#available-locations # This location does not need to be the same as the default Storage bucket. location = "name-of-region-for-additional-bucket" } # Makes the default Storage bucket accessible for Firebase SDKs, authentication, and Firebase Security Rules. resource "google_firebase_storage_bucket" "default-bucket-multi" { provider = google-beta project = google_project.storage-multi.project_id bucket_id = google_app_engine_application.default-multi.default_bucket } # Makes the additional Storage bucket accessible for Firebase SDKs, authentication, and Firebase Security Rules. resource "google_firebase_storage_bucket" "bucket-multi" { provider = google-beta project = google_project.storage-multi.project_id bucket_id = google_storage_bucket.bucket-multi.name } # Creates a ruleset of Firebase Security Rules from a local file. resource "google_firebaserules_ruleset" "storage-multi" { provider = google-beta project = google_project.storage-multi.project_id source { files { # Write security rules in a local file named "storage.rules" # Learn more: https://firebase.google.com/docs/storage/security/get-started name = "storage.rules" content = file("storage.rules") } } # Wait for the Storage buckets to be provisioned before creating this ruleset. depends_on = [ google_firebase_project.storage-multi, ] } # Releases the ruleset to the default Storage bucket. resource "google_firebaserules_release" "default-bucket-multi" { provider = google-beta name = "firebase.storage/${google_app_engine_application.default-multi.default_bucket}" ruleset_name = "projects/${google_project.storage-multi.project_id}/rulesets/${google_firebaserules_ruleset.storage-multi.name}" project = google_project.storage-multi.project_id } # Releases the ruleset to the additional Storage bucket. resource "google_firebaserules_release" "bucket-multi" { provider = google-beta name = "firebase.storage/${google_storage_bucket.bucket-multi.name}" ruleset_name = "projects/${google_project.storage-multi.project_id}/rulesets/${google_firebaserules_ruleset.storage-multi.name}" project = google_project.storage-multi.project_id } # Uploads a new file to the default Storage bucket. # Do not use real end-user or production data in this file. resource "google_storage_bucket_object" "cat-picture-multi" { provider = google-beta name = "cat.png" source = "path/to/cat.png" bucket = google_app_engine_application.default-multi.default_bucket } # Creates a Firebase Android App in the new project created above. resource "google_firebase_android_app" "storage-multi" { provider = google-beta project = google_project.storage-multi.project_id display_name = "My Android app" package_name = "android.package.name" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.storage-multi, ] } # Creates a Firebase Apple-platforms App in the new project created above. resource "google_firebase_apple_app" "storage-multi" { provider = google-beta project = google_project.storage-multi.project_id display_name = "My Apple app" bundle_id = "apple.app.12345" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.storage-multi, ] } # Creates a Firebase Web App in the new project created above. resource "google_firebase_web_app" "storage-multi" { provider = google-beta project = google_project.storage-multi.project_id display_name = "My Web app" # The other App types (Android and Apple) use "DELETE" by default. # Web apps don't use "DELETE" by default due to backward-compatibility. deletion_policy = "DELETE" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.storage-multi, ] }
Il s'agit de l'ensemble de règles de sécurité du stockage Cloud qui doit se trouver dans un fichier local nommé storage.rules
.
rules_version = '2'; service firebase.storage { match /b/{bucket}/o { match /{allPaths=**} { allow read, write: if request.auth != null; } } }
Cette configuration crée un nouveau projet Google Cloud, active les services Firebase pour le projet, provisionne l'instance Cloud Firestore, puis provisionne le bucket Cloud Storage par défaut.
Il fournit également des règles de sécurité Firebase pour l'instance Cloud Firestore et le bucket Cloud Storage par défaut.
# Creates a new Google Cloud project. resource "google_project" "fs" { # fs = Firestore + Storage provider = google-beta.no_user_project_override folder_id = "folder-id-for-new-project" name = "Project Display Name" project_id = "project-id-for-new-project" # Required for the project to display in a list of Firebase projects. labels = { "firebase" = "enabled" } } # Enables required APIs. resource "google_project_service" "fs" { provider = google-beta.no_user_project_override project = google_project.fs.project_id for_each = toset([ "serviceusage.googleapis.com", "cloudresourcemanager.googleapis.com", "firebaserules.googleapis.com", "firebasestorage.googleapis.com", "storage.googleapis.com", "firestore.googleapis.com", ]) service = each.key # Don't disable the service if the resource block is removed by accident disable_on_destroy = false } # Enables Firebase services for the new project created above. resource "google_firebase_project" "fs" { provider = google-beta project = google_project.fs.project_id } #### Set up Firestore before default Cloud Storage bucket #### # Provisions the Firestore database instance. resource "google_firestore_database" "firestore-fs" { provider = google-beta project = google_project.fs.project_id name = "(default)" # See available locations: https://firebase.google.com/docs/projects/locations#default-cloud-location location_id = "name-of-region" # "FIRESTORE_NATIVE" is required to use Firestore with Firebase SDKs, authentication, and Firebase Security Rules. type = "FIRESTORE_NATIVE" concurrency_mode = "OPTIMISTIC" # Wait for Firebase to be enabled in the Google Cloud project before initializing Firestore. depends_on = [ google_firebase_project.fs, ] } # Creates a ruleset of Firestore Security Rules from a local file. resource "google_firebaserules_ruleset" "firestore-fs" { provider = google-beta project = google_project.fs.project_id source { files { # Write security rules in a local file named "firestore.rules". # Learn more: https://firebase.google.com/docs/firestore/security/get-started name = "firestore.rules" content = file("firestore.rules") } } # Wait for Firestore to be provisioned before creating this ruleset. depends_on = [ google_firestore_database.firestore-fs ] } # Releases the ruleset for the Firestore instance. resource "google_firebaserules_release" "firestore-fs" { provider = google-beta name = "cloud.firestore" # must be cloud.firestore ruleset_name = google_firebaserules_ruleset.firestore-fs.name project = google_project.fs.project_id # Wait for Firestore to be provisioned before releasing the ruleset. depends_on = [ google_firestore_database.firestore-fs, ] } #### Set up default Cloud Storage default bucket after Firestore #### # Provisions the default Cloud Storage bucket for the project via Google App Engine. resource "google_app_engine_application" "default-bucket-fs" { provider = google-beta project = google_project.fs.project_id # See available locations: https://firebase.google.com/docs/projects/locations#default-cloud-location # This will set the location for the default Storage bucket and the App Engine App. location_id = "name-of-region" # Must be in the same location as Firestore (above) # Wait for Firestore to be provisioned first. # Otherwise, the Firestore instance will be provisioned in Datastore mode (unusable by Firebase). depends_on = [ google_firestore_database.firestore-fs, ] } # Makes the default Storage bucket accessible for Firebase SDKs, authentication, and Firebase Security Rules. resource "google_firebase_storage_bucket" "default-bucket-fs" { provider = google-beta project = google_project.fs.project_id bucket_id = google_app_engine_application.default-bucket-fs.default_bucket } # Creates a ruleset of Cloud Storage Security Rules from a local file. resource "google_firebaserules_ruleset" "default-bucket-fs" { provider = google-beta project = google_project.fs.project_id source { files { # Write security rules in a local file named "storage.rules". # Learn more: https://firebase.google.com/docs/storage/security/get-started name = "storage.rules" content = file("storage.rules") } } # Wait for the Cloud Storage bucket to be provisioned before creating this ruleset. depends_on = [ google_firebase_project.fs, ] } # Releases the ruleset to the default Storage bucket. resource "google_firebaserules_release" "default-bucket-fs" { provider = google-beta name = "firebase.storage/${google_app_engine_application.default-bucket-fs.default_bucket}" ruleset_name = "projects/${google_project.fs.project_id}/rulesets/${google_firebaserules_ruleset.default-bucket-fs.name}" project = google_project.fs.project_id }
Il s'agit de l'ensemble de règles de sécurité Cloud Firestore qui doit se trouver dans un fichier local nommé firestore.rules
.
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { allow read: if request.auth != null; allow create: if request.auth != null; allow update: if request.auth != null; } }
Il s'agit de l'ensemble de règles de sécurité du stockage cloud qui doit se trouver dans un fichier local nommé storage.rules
.
rules_version = '2'; service firebase.storage { match /b/{bucket}/o { match /{allPaths=**} { allow read, write: if request.auth != null; } } }
Cette configuration crée un nouveau projet Google Cloud, active les services Firebase pour le projet, et configure et active l'application de Firebase App Check pour Cloud Firestore afin qu'il ne soit accessible qu'à partir de votre application Android.
# Creates a new Google Cloud project. resource "google_project" "appcheck" { provider = google-beta.no_user_project_override folder_id = "folder-id-for-new-project" name = "Project Display Name" project_id = "project-id-for-new-project" # Required for the project to display in a list of Firebase projects. labels = { "firebase" = "enabled" } } # Enables required APIs. resource "google_project_service" "services" { provider = google-beta.no_user_project_override project = google_project.appcheck.project_id for_each = toset([ "cloudresourcemanager.googleapis.com", "firebase.googleapis.com", "firebaseappcheck.googleapis.com", "firestore.googleapis.com", "serviceusage.googleapis.com", ]) service = each.key # Don't disable the service if the resource block is removed by accident. disable_on_destroy = false } # Enables Firebase services for the new project created earlier. resource "google_firebase_project" "appcheck" { provider = google-beta project = google_project.appcheck.project_id depends_on = [google_project_service.services] } # Provisions the Firestore database instance. resource "google_firestore_database" "database" { provider = google-beta project = google_firebase_project.appcheck.project name = "(default)" # See available locations: https://firebase.google.com/docs/projects/locations#default-cloud-location location_id = "name-of-region" # "FIRESTORE_NATIVE" is required to use Firestore with Firebase SDKs, authentication, and Firebase Security Rules. type = "FIRESTORE_NATIVE" concurrency_mode = "OPTIMISTIC" # Wait for Firebase to be enabled in the Google Cloud project before initializing Firestore. depends_on = [ google_firebase_project.appcheck, ] } # Creates a Firebase Android App in the new project created earlier. resource "google_firebase_android_app" "appcheck" { provider = google-beta project = google_firebase_project.appcheck.project display_name = "Play Integrity app" package_name = "package.name.playintegrity" sha256_hashes = [ # TODO: insert your Android app's SHA256 certificate ] } # It takes a while for App Check to recognize the new app # If your app already exists, you don't have to wait 30 seconds. resource "time_sleep" "wait_30s" { depends_on = [google_firebase_android_app.appcheck] create_duration = "30s" } # Register the Android app with the Play Integrity provider resource "google_firebase_app_check_play_integrity_config" "appcheck" { provider = google-beta project = google_firebase_project.appcheck.project app_id = google_firebase_android_app.appcheck.app_id depends_on = [time_sleep.wait_30s, google_firestore_database.database] lifecycle { precondition { condition = length(google_firebase_android_app.appcheck.sha256_hashes) > 0 error_message = "Provide a SHA-256 certificate on the Android App to use App Check" } } } # Enable enforcement of App Check for Firestore resource "google_firebase_app_check_service_config" "firestore" { provider = google-beta project = google_firebase_project.appcheck.project service_id = "firestore.googleapis.com" depends_on = [google_project_service.services] }
Cette configuration crée un nouveau projet Google Cloud, active les services Firebase pour le projet et installe une nouvelle instance d'une extension Firebase dans le projet. Si l'instance existe déjà, ses paramètres sont mis à jour en fonction des valeurs fournies dans la configuration.
# Creates a new Google Cloud project. resource "google_project" "extensions" { provider = google-beta.no_user_project_override folder_id = "folder-id-for-new-project" name = "Project Display Name" project_id = "project-id-for-new-project" # Associates the project with a Cloud Billing account # (required to use Firebase Extensions). billing_account = "000000-000000-000000" # Required for the project to display in a list of Firebase projects. labels = { "firebase" = "enabled" } } # Enables required APIs. resource "google_project_service" "extensions" { provider = google-beta.no_user_project_override project = google_project.extensions.project_id for_each = toset([ "cloudbilling.googleapis.com", "cloudresourcemanager.googleapis.com", "serviceusage.googleapis.com", "firebase.googleapis.com", "firebaseextensions.googleapis.com", ]) service = each.key # Don't disable the service if the resource block is removed by accident. disable_on_destroy = false } # Enables Firebase services for the new project created above. resource "google_firebase_project" "extensions" { provider = google-beta project = google_project.extensions.project_id depends_on = [ google_project_service.extensions, ] } # Installs an instance of the "Translate Text in Firestore" extension. # Or updates the extension if the specified instance already exists. resource "google_firebase_extensions_instance" "translation" { provider = google-beta project = google_project.extensions.project_id instance_id = "translate-text-in-firestore" config { extension_ref = "firebase/firestore-translate-text" params = { COLLECTION_PATH = "posts/comments/translations" DO_BACKFILL = true LANGUAGES = "ar,en,es,de,fr" INPUT_FIELD_NAME = "input" LANGUAGES_FIELD_NAME = "languages" OUTPUT_FIELD_NAME = "translated" } system_params = { "firebaseextensions.v1beta.function/location" = "us-central1" "firebaseextensions.v1beta.function/memory" = "256" "firebaseextensions.v1beta.function/minInstances" = "0" "firebaseextensions.v1beta.function/vpcConnectorEgressSettings" = "VPC_CONNECTOR_EGRESS_SETTINGS_UNSPECIFIED" } } }
Dépannage et FAQ
Ce guide utilise les attributs Terraform suivants lorsque vous travaillez avec des « projets ».
-
project
dans un blocresource
Recommandé : dans la mesure du possible, incluez l'attribut
project
dans chaque blocresource
En incluant un attribut de projet, Terraform créera l'infrastructure spécifiée dans le bloc de ressources au sein du projet spécifié. Ce guide et nos exemples de fichiers de configuration utilisent tous cette pratique.
Consultez la documentation officielle de Terraform sur
project
.-
user_project_override
dans le blocprovider
Pour provisionner la plupart des ressources, vous devez utiliser
user_project_override = true
, ce qui signifie vérifier le quota par rapport à votre propre projet Firebase. Cependant, pour configurer votre nouveau projet afin qu'il puisse accepter les contrôles de quota, vous devez d'abord utiliseruser_project_override = false
.Consultez la documentation officielle de Terraform sur
user_project_override
.
Assurez-vous que le compte utilisateur que vous utilisez pour exécuter les commandes gCloud CLI a accepté les conditions d'utilisation de Firebase (Firebase ToS).
Vous pouvez effectuer cette vérification en utilisant un navigateur connecté au compte utilisateur et en essayant d'afficher un projet Firebase existant dans la console Firebase . Si vous pouvez afficher un projet Firebase existant, cela signifie que le compte utilisateur a accepté les ToS Firebase.
Si vous ne pouvez afficher aucun projet Firebase existant, cela signifie que le compte utilisateur n'a probablement pas accepté les ToS Firebase. Pour résoudre ce problème, créez un nouveau projet Firebase via la console Firebase et acceptez les ToS Firebase dans le cadre de la création du projet. Vous pouvez immédiatement supprimer ce projet via les paramètres du projet dans la console.
Attendez quelques minutes, puis essayez à nouveau d'exécuter terraform apply
.
Cela pourrait être dû à un retard de propagation dans divers systèmes. Essayez de résoudre ce problème en important la ressource dans l'état Terraform en exécutant terraform import
. Essayez ensuite d'exécuter à nouveau terraform apply
.
Vous pouvez apprendre à importer chaque ressource dans la section "Importer" de sa documentation Terraform (par exemple, la documentation "Importer" pour Cloud Firestore ).
Comme l'erreur le suggère, Terraform essaie peut-être de fournir plusieurs index et/ou de créer un document en même temps et a rencontré une erreur de concurrence. Essayez à nouveau d'exécuter terraform apply
.
Cette erreur signifie que Terraform ne sait pas sur quel projet vérifier le quota. Pour résoudre le problème, vérifiez les éléments suivants dans le bloc resource
:
- Assurez-vous d'avoir spécifié une valeur pour l'attribut
project
. - Assurez-vous que vous utilisez le fournisseur avec
user_project_override = true
(pas d'alias), qui dans les exemples Firebase estgoogle-beta
.
Voici les raisons possibles pour lesquelles l'ID du projet peut déjà exister :
Le projet associé à cet ID appartient à quelqu'un d'autre.
- Pour résoudre : Choisissez un autre ID de projet.
Le projet associé à cet ID a été récemment supprimé (en état de suppression logicielle).
- Pour résoudre : Si vous pensez que le projet associé à l'ID vous appartient, alors vérifiez l'état du projet à l'aide de l' API
projects.get
.
- Pour résoudre : Si vous pensez que le projet associé à l'ID vous appartient, alors vérifiez l'état du projet à l'aide de l' API
Le projet associé à cet ID existe correctement sous l'utilisateur actuel. Une cause possible de l'erreur pourrait être qu'une
terraform apply
précédente ait été interrompue.- Pour résoudre : Exécutez les commandes suivantes :
terraform import google_project.default PROJECT_ID
et puis
terraform import google_firebase_project.default PROJECT_ID
- Pour résoudre : Exécutez les commandes suivantes :
Une application App Engine nécessite une instance Cloud Firestore, mais vous ne pouvez avoir qu'une seule instance Cloud Firestore par projet. Ainsi, comme le suggère le message d'erreur, si vous avez déjà provisionné l'instance Cloud Firestore du projet à un emplacement, App Engine générera une erreur si vous essayez de provisionner une instance Cloud Firestore à un autre emplacement. App Engine pense que vous essayez de « réapprovisionner » l'instance Cloud Firestore déjà existante.
Pour résoudre cette erreur, utilisez le même emplacement pour Cloud Firestore et l'application App Engine. Si vous avez besoin d'un bucket Cloud Storage dans un emplacement différent de Cloud Firestore, vous pouvez provisionner des buckets supplémentaires (voir l' exemple de configuration pour créer plusieurs buckets Cloud Storage ).
Lorsque vous provisionnez le bucket Cloud Storage par défaut d'un projet (via google_app_engine_application
) et que le projet ne dispose pas encore d'instance Cloud Firestore, google_app_engine_application
provisionne automatiquement l'instance Cloud Firestore du projet.
Ainsi, si l'instance Cloud Firestore de votre projet est déjà provisionnée, google_firestore_database
générera une erreur si vous essayez de provisionner explicitement une instance Cloud Firestore.
Une fois l'instance Cloud Firestore du projet provisionnée, vous ne pouvez pas la « réapprovisionner » ni modifier son emplacement. Pour empêcher l'erreur de se produire, supprimez le bloc de ressources google_firestore_database
de votre fichier de configuration. Notez cependant que nous recommandons de provisionner Cloud Firestore avant le bucket Cloud Storage par défaut du projet (voir le côté ci-dessous pour savoir pourquoi).