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 provisionnées et des services activés, l'utilisation de Terraform avec Firebase peut être une bonne solution pour vous.
Le workflow de base pour utiliser Terraform avec Firebase comprend les éléments suivants :
Créez et personnalisez un fichier de configuration Terraform (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 interagissent avec Terraform pour provisionner l'infrastructure spécifiée dans le fichier
.tf
.
Que pouvez-vous faire avec Terraform et Firebase ?
L'exemple de workflow généralisé de ce guide crée un projet Firebase avec une application Android. Toutefois, vous pouvez faire beaucoup plus avec Terraform, par exemple :
Supprimez et modifiez l'infrastructure existante à l'aide de Terraform.
Gérez la configuration et les tâches spécifiques aux produits à l'aide de Terraform, par exemple :
- Activer les fournisseurs de connexion Firebase Authentication.
- Créer des buckets Cloud Storage ou des instances de base de données et déployer Firebase Security Rules pour eux.
- Créer des backends Firebase App Hosting, des builds et d'autres ressources associées.
Vous pouvez utiliser des fichiers de configuration et des commandes Terraform standards pour effectuer toutes ces tâches. Pour vous aider, nous vous avons fourni des exemples de fichiers de configuration Terraform pour plusieurs cas d'utilisation courants.
Workflow généralisé pour utiliser Terraform avec Firebase
Conditions préalables
Ce guide est une introduction à l'utilisation de Terraform avec Firebase. Il suppose donc que vous maîtrisez les bases de Terraform. Assurez-vous d'avoir rempli les conditions préalables suivantes avant de commencer ce workflow.
Installez Terraform et familiarisez-vous avec cet outil à l'aide de ses tutoriels officiels.
Installez Google Cloud CLI (gcloud CLI). Connectez-vous à l'aide d'un compte utilisateur ou d'un compte de service.
Afficher les exigences pour les comptes utilisateur et les comptes de service
- Si vous utilisez un compte utilisateur, vous devez avoir accepté les conditions d'utilisation de Firebase. 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 remplies :
- 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éez et personnalisez un fichier de configuration Terraform
Un fichier de configuration Terraform doit comporter deux sections principales (décrites en détail ci-dessous) :
- Section de configuration
provider
qui indique les ressources Terraform auxquelles vous pouvez accéder - Section de blocs
resource
individuels qui spécifient l'infrastructure à créer
Configurer votre provider
Une configuration provider
est requise, quels que soient les produits ou services Firebase concernés.
Créez un fichier de configuration Terraform (tel qu'un fichier
main.tf
) dans votre répertoire local.Dans ce guide, vous utiliserez ce fichier de configuration pour spécifier à la fois la configuration
provider
et toute l'infrastructure que vous souhaitez que Terraform crée. Notez toutefois que vous avez le choix de la manière dont vous incluez la configuration du fournisseur.Afficher les options pour inclure la configuration
provider
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
.tf
Terraform (comme indiqué dans ce guide).- Utilisez cette option si vous débutez avec Terraform ou si vous essayez 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.
- Lorsque vous exécutez des commandes Terraform, les fichiers
provider.tf
etmain.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 lorsque vous l'utilisez en production.# Terraform configuration to set up providers by version. terraform { required_providers { google-beta = { source = "hashicorp/google-beta" version = "~> 6.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 }
En savoir plus sur les différents types d'attributs liés aux projets (y compris ce que ce guide appelle le "projet de vérification des quotas") lorsque vous utilisez Terraform avec Firebase.
Passez à la section suivante pour finaliser votre fichier de configuration et spécifier l'infrastructure à créer.
Spécifier l'infrastructure à créer à l'aide de blocs resource
Dans votre fichier de configuration Terraform (main.tf
pour ce guide), 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). Ce guide contient la liste complète de toutes les ressources Firebase compatibles avec Terraform.
Ouvrez votre fichier
main.tf
.Sous la configuration
provider
, incluez la configuration suivante des blocsresource
.Cet exemple de base crée un projet Firebase, puis une application Android Firebase dans 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, ] }
Afficher une version très annotée de cet exemple de fichier de configuration
Si vous ne connaissez pas 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 des projets 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 en savoir plus sur ces commandes, consultez la documentation Terraform.
Si vous exécutez des commandes Terraform dans le répertoire pour la première fois, 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
Vérifiez que tout a été provisionné ou activé comme prévu :
Option 1 : Affichez la configuration dans votre terminal en exécutant la commande suivante :
terraform show
Option 2 : Affichez votre projet Firebase dans la console Firebase.
Ressources Firebase compatibles avec Terraform
Les ressources Firebase et Google suivantes sont compatibles avec Terraform. Nous ajoutons des ressources en permanence. Par conséquent, 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 signalant un problème dans le dépôt GitHub.
Gestion des projets et des applications Firebase
google_firebase_project
: activez les services Firebase sur un projet Google Cloud existant.Applications Firebase
google_firebase_apple_app
: créer ou gérer une application Firebase pour les plates-formes Applegoogle_firebase_android_app
: créer ou gérer une application Android Firebasegoogle_firebase_web_app
: créer ou gérer une application Web Firebase
Firebase Authentication
google_identity_platform_config
: activez Google Cloud Identity Platform (GCIP), qui est le backend de Firebase Authentication, et fournissez les paramètres d'authentification au niveau du projet.Pour configurer Firebase Authentication avec Terraform, vous devez activer GCIP. Veillez à consulter l'exemple de fichier
.tf
pour savoir comment configurer Firebase Authentication.Le projet dans lequel Terraform activera GCIP et/ou Firebase Authentication doit être associé à la formule tarifaire Blaze (c'est-à-dire que le projet doit être associé à un compte Cloud Billing). Vous pouvez le faire de manière programmatique en définissant l'attribut
billing_account
dans la ressourcegoogle_project
.Cette ressource permet également d'effectuer davantage de configurations, comme les méthodes de connexion locales (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ée courants, comme Google, Facebook ou Apple.identity_platform_oauth_idp_config
: configurez des sources arbitraires de fournisseur d'identité (IdP) OAuth.google_identity_platform_inbound_saml_config
: configurer les intégrations SAML
Pas encore compatible :
- Configurer l'authentification multifacteur (MFA) avec Terraform
Firebase App Hosting
google_firebase_app_hosting_backend
: créez et gérez un backend Firebase App Hosting, y compris sa connexion au dépôt GitHub et sa branche active pour le déploiement continu.google_firebase_app_hosting_build
: créez un build pour un backend, à un point spécifique de la balise de référence du codebase et à un moment donné.google_firebase_app_hosting_traffic
: déployez une compilation ou configurez le déploiement continu GitHub.
Firebase Data Connect
google_firebase_data_connect_service
: créez un service Data Connect.
Firebase Realtime Database
google_firebase_database_instance
: créez une instance Realtime Database.
Pas encore compatible :
- Déployer Firebase Realtime Database Security Rules via Terraform (découvrez comment déployer ces Rules à l'aide d'autres outils, y compris des options programmatiques)
Cloud Firestore
google_firestore_database
: créez une instance Cloud Firestore.google_firestore_index
: permet d'effectuer des requêtes efficaces pour Cloud Firestoregoogle_firestore_document
: amorce une instance Cloud Firestore avec un document spécifique d'une collection.Important : N'utilisez pas de données de production ni de données réelles d'utilisateur final dans ce document de départ.
Cloud Storage for Firebase
google_firebase_storage_bucket
: rendre un bucket Cloud Storage existant accessible aux SDK Firebase, à l'authentification et à Firebase Security Rulesgoogle_storage_bucket_object
: ajoute un objet à un bucket Cloud StorageImportant : N'utilisez pas de données de production ni de données d'utilisateurs finaux réelles dans ce fichier.
Firebase Security Rules (pour Cloud Firestore et Cloud Storage)
Notez que Firebase Realtime Database utilise un système de provisionnement différent pour ses Firebase Security Rules.
google_firebaserules_ruleset
: définit les Firebase Security Rules qui s'appliquent à une instance Cloud Firestore ou à un bucket Cloud Storage.google_firebaserules_release
: déployer des ensembles de règles spécifiques sur une instance Cloud Firestore ou un bucket Cloud Storage
Firebase App Check
google_firebase_app_check_service_config
: active l'application de App Check pour un servicegoogle_firebase_app_check_app_attest_config
: enregistrer une application de plates-formes Apple auprès du fournisseur App Attestgoogle_firebase_app_check_device_check_config
: enregistrer une application de plates-formes Apple auprès du fournisseur DeviceCheckgoogle_firebase_app_check_play_integrity_config
: enregistrer une application Android auprès du fournisseur Play Integritygoogle_firebase_app_check_recaptcha_enterprise_config
: enregistrer une application Web auprès du fournisseur reCAPTCHA Enterprisegoogle_firebase_app_check_recaptcha_v3_config
: enregistrer une application Web avec le fournisseur reCAPTCHA v3google_firebase_app_check_debug_token
: utiliser des jetons de débogage pour les tests
Firebase Extensions
google_firebase_extensions_instance
: installez ou mettez à jour une instance de Firebase Extension.
Exemples de fichiers de configuration Terraform pour des cas d'utilisation courants
Configurer Firebase Authentication avec GCIP
Cette configuration crée un projet Google Cloud, l'associe à un compte Cloud Billing (le forfait Blaze est requis pour Firebase Authentication avec GCIP), active les services Firebase pour le projet, configure Firebase Authentication avec GCIP et enregistre trois types d'applications différents avec le projet.
Notez que vous devez activer GCIP pour configurer Firebase Authentication avec 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" } # 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_firebase_project.auth.project # 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", ] } # Creates a Firebase Android App in the new project created above. resource "google_firebase_android_app" "auth" { provider = google-beta project = google_firebase_project.auth.project display_name = "My Android app" package_name = "android.package.name" } # Creates a Firebase Apple-platforms App in the new project created above. resource "google_firebase_apple_app" "auth" { provider = google-beta project = google_firebase_project.auth.project display_name = "My Apple app" bundle_id = "apple.app.12345" } # Creates a Firebase Web App in the new project created above. resource "google_firebase_web_app" "auth" { provider = google-beta project = google_firebase_project.auth.project display_name = "My Web app" }
Provisionner un service Firebase Data Connect
Cette configuration crée un projet Google Cloud, active les services Firebase pour le projet et provisionne un service Data Connect.
# Creates a new Google Cloud project. resource "google_project" "dataconnect" { 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 Data Connect). 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" "services" { provider = google-beta.no_user_project_override project = google_project.dataconnect.project_id for_each = toset([ "serviceusage.googleapis.com", "cloudresourcemanager.googleapis.com", "firebasedataconnect.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" "dataconnect" { provider = google-beta project = google_project.dataconnect.project_id depends_on = [google_project_service.services] } # Create a Firebase Data Connect service resource "google_firebase_data_connect_service" "dataconnect-default" { project = google_firebase_project.dataconnect.project location = "name-of-region-for-service" service_id = "${google_firebase_project.dataconnect.project}-default-fdc" deletion_policy = "DEFAULT" }
Provisionner l'instance Firebase Realtime Database par défaut
Cette configuration crée un projet Google Cloud, active les services Firebase pour le projet, provisionne l'instance Realtime Database 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" } # 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 depends_on = [google_project_service.rtdb] } # Provisions the default Realtime Database default instance. resource "google_firebase_database_instance" "database" { provider = google-beta project = google_firebase_project.rtdb.project # See available locations: https://firebase.google.com/docs/database/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" } # Creates a Firebase Android App in the new project created above. resource "google_firebase_android_app" "rtdb" { provider = google-beta project = google_firebase_project.rtdb.project display_name = "My Android app" package_name = "android.package.name" } # Creates a Firebase Apple-platforms App in the new project created above. resource "google_firebase_apple_app" "rtdb" { provider = google-beta project = google_firebase_project.rtdb.project display_name = "My Apple app" bundle_id = "apple.app.12345" } # Creates a Firebase Web App in the new project created above. resource "google_firebase_web_app" "rtdb" { provider = google-beta project = google_firebase_project.rtdb.project display_name = "My Web app" }
Provisionner plusieurs instances Firebase Realtime Database
Cette configuration crée un projet Google Cloud, l'associe à un compte Cloud Billing (le forfait Blaze est requis pour plusieurs instances Realtime Database), active les services Firebase pour le projet, provisionne plusieurs instances Realtime Database (y compris l'instance Realtime Database 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-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" } # 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 depends_on = [google_project_service.rtdb-multi] } # Provisions the default Realtime Database default instance. resource "google_firebase_database_instance" "database-default" { provider = google-beta project = google_firebase_project.rtdb-multi.project # See available locations: https://firebase.google.com/docs/database/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" } # Provisions an additional Realtime Database instance. resource "google_firebase_database_instance" "database-additional" { provider = google-beta project = google_firebase_project.rtdb-multi.project # 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" } # Creates a Firebase Android App in the new project created above. resource "google_firebase_android_app" "rtdb-multi" { provider = google-beta project = google_firebase_project.rtdb-multi.project display_name = "My Android app" package_name = "android.package.name" } # Creates a Firebase Apple-platforms App in the new project created above. resource "google_firebase_apple_app" "rtdb-multi" { provider = google-beta project = google_firebase_project.rtdb-multi.project display_name = "My Apple app" bundle_id = "apple.app.12345" } # Creates a Firebase Web App in the new project created above. resource "google_firebase_web_app" "rtdb-multi" { provider = google-beta project = google_firebase_project.rtdb-multi.project display_name = "My Web app" }
Provisionner l'instance Cloud Firestore par défaut
Cette configuration crée un projet Google Cloud, active les services Firebase pour le projet, provisionne l'instance Cloud Firestore par défaut du projet et enregistre trois types d'applications différents avec le projet.
Il provisionne également Firebase Security Rules pour l'instance Cloud Firestore par défaut, crée un index Cloud Firestore et ajoute un document Cloud Firestore avec des données d'amorçage.
# 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" } # 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 depends_on = [google_project_service.firestore] } # Provisions the Firestore database instance. resource "google_firestore_database" "firestore" { provider = google-beta project = google_firebase_project.firestore.project name = "(default)" # See available locations: https://firebase.google.com/docs/firestore/locations 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" } # Creates a ruleset of Firestore Security Rules from a local file. resource "google_firebaserules_ruleset" "firestore" { provider = google-beta project = google_firestore_database.firestore.project 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") } } } # 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_firestore_database.firestore.project } # Adds a new Firestore index. resource "google_firestore_index" "indexes" { provider = google-beta project = google_firestore_database.firestore.project collection = "quiz" query_scope = "COLLECTION" fields { field_path = "question" order = "ASCENDING" } fields { field_path = "answer" order = "ASCENDING" } } # 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_firestore_database.firestore.project collection = "quiz" document_id = "question-1" fields = "{\"question\":{\"stringValue\":\"Favorite Database\"},\"answer\":{\"stringValue\":\"Firestore\"}}" } # Creates a Firebase Android App in the new project created above. resource "google_firebase_android_app" "firestore" { provider = google-beta project = google_firebase_project.firestore.project display_name = "My Android app" package_name = "android.package.name" } # Creates a Firebase Apple-platforms App in the new project created above. resource "google_firebase_apple_app" "firestore" { provider = google-beta project = google_firebase_project.firestore.project display_name = "My Apple app" bundle_id = "apple.app.12345" } # Creates a Firebase Web App in the new project created above. resource "google_firebase_web_app" "firestore" { provider = google-beta project = google_firebase_project.firestore.project display_name = "My Web app" }
Il s'agit de l'ensemble de règles Cloud Firestore Security Rules qui doit se trouver dans un fichier local nommé firestore.rules
.
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /some_collection/{document} { allow read, create, update: if request.auth != null; } } }
Provisionner le bucket Cloud Storage par défaut
Provisionner des buckets Cloud Storage supplémentaires
Cette configuration crée un projet Google Cloud, associe le projet à un compte Cloud Billing (le forfait Blaze est requis pour les buckets supplémentaires), active les services Firebase pour le projet, provisionne des buckets Cloud Storage supplémentaires non définis par défaut et enregistre trois types d'applications différents avec le projet.
Il provisionne également Firebase Security Rules pour chaque bucket Cloud Storage et importe un fichier dans l'un des buckets Cloud Storage.
# 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" } # 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 depends_on = [google_project_service.storage-multi] } # Provisions a Cloud Storage bucket. resource "google_storage_bucket" "bucket-1" { provider = google-beta project = google_firebase_project.storage-multi.project name = "name-of-storage-bucket" # See available locations: https://cloud.google.com/storage/docs/locations#available-locations location = "name-of-region-for-bucket" } # Provisions an additional Cloud Storage bucket. resource "google_storage_bucket" "bucket-2" { provider = google-beta project = google_firebase_project.storage-multi.project 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 existing Storage bucket. location = "name-of-region-for-additional-bucket" } # Makes the first Storage bucket accessible for Firebase SDKs, authentication, and Firebase Security Rules. resource "google_firebase_storage_bucket" "bucket-1" { provider = google-beta project = google_firebase_project.storage-multi.project bucket_id = google_storage_bucket.bucket-1.name } # Makes the additional Storage bucket accessible for Firebase SDKs, authentication, and Firebase Security Rules. resource "google_firebase_storage_bucket" "bucket-2" { provider = google-beta project = google_firebase_project.storage-multi.project bucket_id = google_storage_bucket.bucket-2.name } # Creates a ruleset of Firebase Security Rules from a local file. resource "google_firebaserules_ruleset" "storage-multi" { provider = google-beta project = google_firebase_project.storage-multi.project 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") } } } # Releases the ruleset to the first Storage bucket. resource "google_firebaserules_release" "bucket-1" { provider = google-beta name = "firebase.storage/${google_storage_bucket.bucket-1.name}" ruleset_name = "projects/${google_project.storage-multi.project_id}/rulesets/${google_firebaserules_ruleset.storage-multi.name}" project = google_firebase_project.storage-multi.project } # Releases the ruleset to the additional Storage bucket. resource "google_firebaserules_release" "bucket-2" { provider = google-beta name = "firebase.storage/${google_storage_bucket.bucket-2.name}" ruleset_name = "projects/${google_project.storage-multi.project_id}/rulesets/${google_firebaserules_ruleset.storage-multi.name}" project = google_firebase_project.storage-multi.project } # Uploads a new file to the first 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_storage_bucket.bucket-1.name } # Creates a Firebase Android App in the new project created above. resource "google_firebase_android_app" "storage-multi" { provider = google-beta project = google_firebase_project.storage-multi.project display_name = "My Android app" package_name = "android.package.name" } # Creates a Firebase Apple-platforms App in the new project created above. resource "google_firebase_apple_app" "storage-multi" { provider = google-beta project = google_firebase_project.storage-multi.project display_name = "My Apple app" bundle_id = "apple.app.12345" } # Creates a Firebase Web App in the new project created above. resource "google_firebase_web_app" "storage-multi" { provider = google-beta project = google_firebase_project.storage-multi.project display_name = "My Web app" }
Il s'agit de l'ensemble de règles Cloud Storage Security Rules qui doit se trouver dans un fichier local nommé storage.rules
.
rules_version = '2'; service firebase.storage { match /b/{bucket}/o { match /some_folder/{fileName} { allow read, write: if request.auth != null; } } }
Protéger une ressource d'API avec Firebase App Check
Cette configuration crée un 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'elle ne soit accessible que depuis 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" } # 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" } # 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 ] } # 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 = [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] }
Installer une instance de Firebase Extension
Cette configuration crée un projet Google Cloud, active les services Firebase pour le projet et installe une nouvelle instance de Firebase Extension 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" } # 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_firebase_project.extensions.project 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" } } }
Activer et protéger Firebase AI Logic
Cette configuration crée un projet Google Cloud, active les services Firebase pour le projet, y compris Firebase AI Logic, et configure et active l'application de Firebase App Check pour Firebase AI Logic afin qu'il ne soit accessible que depuis vos applications.
# Creates a new Google Cloud project. resource "google_project" "vertex" { 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 Vertex AI in Firebase). billing_account = "000000-000000-000000" } # Enables required APIs. resource "google_project_service" "services" { provider = google-beta.no_user_project_override project = google_project.vertex.project_id for_each = toset([ "cloudresourcemanager.googleapis.com", "firebase.googleapis.com", "serviceusage.googleapis.com", # Required APIs for Vertex AI in Firebase "aiplatform.googleapis.com", "firebasevertexai.googleapis.com", # App Check is recommended to protect Vertex AI in Firebase from abuse "firebaseappcheck.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" "vertex" { provider = google-beta project = google_project.vertex.project_id depends_on = [google_project_service.services] } # Creates a Firebase Web App in the new project created earlier. resource "google_firebase_web_app" "app" { provider = google-beta project = google_firebase_project.vertex.project display_name = "My Web App" } # Creates a Firebase Android App in the new project created earlier. resource "google_firebase_android_app" "app" { provider = google-beta project = google_firebase_project.vertex.project display_name = "My Android App" package_name = "package.name.playintegrity" sha256_hashes = [ # TODO: insert your Android app's SHA256 certificate ] } # Creates a Firebase Apple App in the new project created earlier. resource "google_firebase_apple_app" "app" { provider = google-beta project = google_firebase_project.vertex.project display_name = "My Apple App" bundle_id = "bundle.id" team_id = "1234567890" } ### Protects Vertex AI in Firebase with App Check. # Turns on enforcement for Vertex AI in Firebase resource "google_firebase_app_check_service_config" "vertex" { provider = google-beta project = google_firebase_project.vertex.project service_id = "firebaseml.googleapis.com" enforcement_mode = "ENFORCED" } # Enables the reCAPTCHA Enterprise API resource "google_project_service" "recaptcha_enterprise" { provider = google-beta project = google_firebase_project.vertex.project service = "recaptchaenterprise.googleapis.com" # Don't disable the service if the resource block is removed by accident. disable_on_destroy = false } # Enables the Play Integrity API resource "google_project_service" "play_integrity" { provider = google-beta project = google_firebase_project.vertex.project service = "playintegrity.googleapis.com" # Don't disable the service if the resource block is removed by accident. disable_on_destroy = false } # Allows the web app to use reCAPTCHA Enterprise with App Check resource "google_firebase_app_check_recaptcha_enterprise_config" "appcheck" { provider = google-beta project = google_firebase_project.vertex.project app_id = google_firebase_web_app.app.app_id site_key = "your site key" token_ttl = "7200s" # Optional depends_on = [google_project_service.recaptcha_enterprise] } # Registers the Android app with the Play Integrity provider resource "google_firebase_app_check_play_integrity_config" "appcheck" { provider = google-beta project = google_firebase_project.vertex.project app_id = google_firebase_android_app.app.app_id token_ttl = "7200s" # Optional lifecycle { precondition { condition = length(google_firebase_android_app.app.sha256_hashes) > 0 error_message = "Provide a SHA-256 certificate on the Android App to use App Check" } } depends_on = [google_project_service.play_integrity] } # Registers the Apple app with the AppAttest provider resource "google_firebase_app_check_app_attest_config" "appcheck" { provider = google-beta project = google_firebase_project.vertex.project app_id = google_firebase_apple_app.app.app_id token_ttl = "7200s" # Optional lifecycle { precondition { condition = google_firebase_apple_app.app.team_id != "" error_message = "Provide a Team ID on the Apple App to use App Check" } } }
Provisionner manuellement un backend App Hosting
Cette configuration montre comment provisionner manuellement un backend App Hosting à l'aide de Terraform. Cette approche vous permet de contrôler précisément les ressources créées, mais vous oblige à définir chaque ressource individuellement. Cela est utile lorsque vous devez personnaliser le backend au-delà des options par défaut.
# Creates a new Google Cloud project. resource "google_project" "apphosting" { 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 App Hosting). billing_account = "000000-000000-000000" } # Enables required APIs. resource "google_project_service" "services" { provider = google-beta.no_user_project_override project = google_project.apphosting.project_id for_each = toset([ "cloudresourcemanager.googleapis.com", "firebase.googleapis.com", "firebaseapphosting.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" "apphosting" { provider = google-beta project = google_project.apphosting.project_id depends_on = [google_project_service.services] } # Creates a Firebase Web App in the new project created earlier. resource "google_firebase_web_app" "apphosting" { provider = google-beta project = google_firebase_project.apphosting.project display_name = "My web app" } # Creates a Firebase App Hosting Backend resource "google_firebase_app_hosting_backend" "example" { provider = google-beta project = google_firebase_project.apphosting.project # Choose the region closest to your users location = "name-of-region-for-service" backend_id = "name-of-backend-for-service" app_id = google_firebase_web_app.apphosting.app_id display_name = "My Backend" serving_locality = "GLOBAL_ACCESS" # or "REGIONAL_STRICT" service_account = google_service_account.service_account.email } # Creates the service account for Firebase App Hosting resource "google_service_account" "service_account" { provider = google-beta project = google_firebase_project.apphosting.project # Must be firebase-app-hosting-compute account_id = "firebase-app-hosting-compute" display_name = "Firebase App Hosting compute service account" # Do not throw if already exists create_ignore_already_exists = true } # Adds permission to the App Hosting service account resource "google_project_iam_member" "app_hosting_sa" { provider = google-beta project = google_firebase_project.apphosting.project for_each = toset([ "roles/firebase.sdkAdminServiceAgent", "roles/firebaseapphosting.computeRunner" ]) role = each.key member = google_service_account.service_account.member } # Creates a Build resource "google_firebase_app_hosting_build" "example" { provider = google-beta project = google_firebase_app_hosting_backend.example.project location = google_firebase_app_hosting_backend.example.location backend = google_firebase_app_hosting_backend.example.backend_id build_id = "my-build" source { container { # TODO: use your own image image = "us-docker.pkg.dev/cloudrun/container/hello" } } } # Rolls out the Build resource "google_firebase_app_hosting_traffic" "example" { provider = google-beta project = google_firebase_app_hosting_backend.example.project location = google_firebase_app_hosting_backend.example.location backend = google_firebase_app_hosting_backend.example.backend_id target { splits { build = google_firebase_app_hosting_build.example.name percent = 100 } } }
Provisionner un backend App Hosting à l'aide de GitHub
Cette configuration montre comment provisionner un backend App Hosting à l'aide du code d'application stocké dans un dépôt GitHub. Cette approche vous permet de gérer et de mettre à jour votre infrastructure à l'aide de demandes d'extraction GitHub et de pipelines CI/CD, selon le modèle typique des déploiements App Hosting.
# Creates a new Google Cloud project. resource "google_project" "apphosting" { 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 App Hosting). billing_account = "000000-000000-000000" } # Enables required APIs. resource "google_project_service" "services" { provider = google-beta.no_user_project_override project = google_project.apphosting.project_id for_each = toset([ "cloudresourcemanager.googleapis.com", "firebase.googleapis.com", "firebaseapphosting.googleapis.com", "serviceusage.googleapis.com", "developerconnect.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" "apphosting" { provider = google-beta project = google_project.apphosting.project_id depends_on = [google_project_service.services] } # Creates a Firebase Web App in the new project created earlier. resource "google_firebase_web_app" "apphosting" { provider = google-beta project = google_firebase_project.apphosting.project display_name = "My web app" } ### Setting up Firebase App Hosting ### # Creates a Firebase App Hosting Backend resource "google_firebase_app_hosting_backend" "example" { provider = google-beta project = google_firebase_project.apphosting.project # Choose the region closest to your users location = "name-of-region-for-service" backend_id = "name-of-backend-for-service" app_id = google_firebase_web_app.apphosting.app_id display_name = "My Backend" serving_locality = "GLOBAL_ACCESS" # or "REGIONAL_STRICT" service_account = google_service_account.service_account.email codebase { repository = google_developer_connect_git_repository_link.my-repository.name root_directory = "/" } } # Creates the service account for Firebase App Hosting resource "google_service_account" "service_account" { provider = google-beta project = google_firebase_project.apphosting.project # Must be firebase-app-hosting-compute account_id = "firebase-app-hosting-compute" display_name = "Firebase App Hosting compute service account" # Do not throw if already exists create_ignore_already_exists = true } # Adds permission to the App Hosting service account resource "google_project_iam_member" "app_hosting_sa" { provider = google-beta project = google_firebase_project.apphosting.project for_each = toset([ "roles/developerconnect.readTokenAccessor", "roles/firebase.sdkAdminServiceAgent", "roles/firebaseapphosting.computeRunner" ]) role = each.key member = google_service_account.service_account.member } # Configures auto rollout from GitHub resource "google_firebase_app_hosting_traffic" "example" { provider = google-beta project = google_firebase_app_hosting_backend.example.project location = google_firebase_app_hosting_backend.example.location backend = google_firebase_app_hosting_backend.example.backend_id rollout_policy { codebase_branch = "main" # Or another branch } } ### ### Setting up a connection to GitHub ### # Provisions Service Agent for Developer Connect resource "google_project_service_identity" "devconnect-p4sa" { provider = google-beta project = google_firebase_project.apphosting.project service = "developerconnect.googleapis.com" } # Adds permission to Developer Connect Service Agent to manager GitHub tokens resource "google_project_iam_member" "devconnect-secret" { provider = google-beta project = google_firebase_project.apphosting.project role = "roles/secretmanager.admin" member = google_project_service_identity.devconnect-p4sa.member } # Connects to a GitHub account resource "google_developer_connect_connection" "my-connection" { provider = google-beta project = google_firebase_project.apphosting.project # Must match the google_firebase_app_hosting_backend's location location = "name-of-region-for-service" # Must be `firebase-app-hosting-github-oauth` connection_id = "firebase-app-hosting-github-oauth" github_config { github_app = "FIREBASE" } depends_on = [google_project_iam_member.devconnect-secret] } # Follow the next steps to set up the GitHub connection # Tip: Run terraform refresh to obtain the output output "next_steps" { description = "Follow the action_uri if present to continue setup" value = google_developer_connect_connection.my-connection.installation_state } # Links a GitHub repo to the project resource "google_developer_connect_git_repository_link" "my-repository" { provider = google-beta project = google_firebase_project.apphosting.project location = google_developer_connect_connection.my-connection.location git_repository_link_id = "my-repo-id" parent_connection = google_developer_connect_connection.my-connection.connection_id clone_uri = "https://github.com/myuser/myrepo.git" } ###
Dépannage et questions fréquentes
Vous souhaitez en savoir plus sur les différents attributs liés aux projets (comme project
et user_project_override
).
Ce guide utilise les attributs Terraform suivants lorsque vous travaillez avec des "projets".
project
dans un blocresource
Recommandation : 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 Terraform officielle 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. Toutefois, pour configurer votre nouveau projet afin qu'il puisse accepter les vérifications de quota, vous devez d'abord utiliseruser_project_override = false
.Consultez la documentation Terraform officielle sur
user_project_override
.
L'erreur suivante s'affiche :
generic::permission_denied: Firebase Tos Not Accepted
.
Assurez-vous que le compte utilisateur que vous utilisez pour exécuter les commandes gcloud CLI a accepté les conditions d'utilisation de Firebase.
Pour effectuer cette vérification, utilisez un navigateur connecté au compte utilisateur et essayez 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 conditions d'utilisation de Firebase.
Si vous ne pouvez pas afficher de projet Firebase existant, il est probable que le compte utilisateur n'ait pas accepté les conditions d'utilisation de Firebase. Pour résoudre ce problème, créez un projet Firebase dans la console Firebase et acceptez les conditions d'utilisation de Firebase lors de la création du projet. Vous pouvez supprimer immédiatement ce projet via Paramètres du projet dans la console.
Après avoir exécuté terraform apply
, vous obtenez l'erreur suivante : generic::permission_denied: IAM authority does not have the
permission
.
Patientez quelques minutes, puis réessayez d'exécuter terraform apply
.
La création d'une ressource a échoué, mais lorsque vous exécutez terraform apply
de nouveau, le message ALREADY_EXISTS
s'affiche.
Cela peut être dû à un délai de propagation dans différents systèmes. Essayez de résoudre ce problème en important la ressource dans l'état Terraform en exécutant terraform import
. Ensuite, réessayez d'exécuter terraform apply
.
Pour savoir comment importer chaque ressource, consultez la section "Import" de sa documentation Terraform (par exemple, la documentation "Import" pour Cloud Firestore).
Lorsque vous utilisez Cloud Firestore, l'erreur suivante s'affiche : Error creating Index: googleapi:
Error 409;...Concurrent access -- try again
Comme le suggère l'erreur, Terraform tente peut-être de provisionner plusieurs index et/ou de créer un document en même temps, ce qui a entraîné une erreur de concurrence.
Essayez d'exécuter terraform apply
à nouveau.
L'erreur suivante s'affiche :
"you may need to specify 'X-Goog-User-Project' HTTP header for quota and
billing purposes"
.
Cette erreur signifie que Terraform ne sait pas quel projet utiliser pour vérifier le quota. Pour résoudre le problème, vérifiez les points suivants dans le bloc resource
:
- Assurez-vous d'avoir spécifié une valeur pour l'attribut
project
. - Assurez-vous d'utiliser le fournisseur avec
user_project_override = true
(sans alias), qui estgoogle-beta
dans les exemples Firebase.
Lorsque vous créez un projet Google Cloud, le message d'erreur suivant s'affiche : "L'ID de projet spécifié pour le nouveau projet existe déjà".
Voici les raisons possibles pour lesquelles l'ID de projet peut déjà exister :
Le projet associé à cet ID appartient à quelqu'un d'autre.
- Solution : choisissez un autre ID de projet.
Le projet associé à cet ID a été supprimé récemment (état de suppression logicielle).
- Pour résoudre le problème : si vous pensez que le projet associé à l'ID vous appartient, vérifiez son état à l'aide de l'API REST
projects.get
.
- Pour résoudre le problème : si vous pensez que le projet associé à l'ID vous appartient, vérifiez son état à l'aide de l'API REST
Le projet associé à cet ID existe correctement pour l'utilisateur actuel. Une cause possible de l'erreur pourrait être qu'une
terraform apply
précédente a été interrompue.- Pour résoudre le problème, exécutez les commandes suivantes :
terraform import google_project.default PROJECT_ID
puis
terraform import google_firebase_project.default PROJECT_ID
.
- Pour résoudre le problème, exécutez les commandes suivantes :
Pourquoi devez-vous provisionner l'instance Cloud Firestore par défaut avant le bucket Cloud Storage par défaut ?
Si vous avez provisionné votre bucket Cloud Storage par défaut (via google_app_engine_application
) avant d'essayer de provisionner votre instance Cloud Firestore par défaut, vous constaterez que votre instance Cloud Firestore par défaut a déjà été provisionnée. Notez que l'instance de base de données provisionnée est en mode Datastore, ce qui signifie qu'elle n'est pas accessible aux SDK Firebase, à l'authentification ni à Firebase Security Rules. Si vous souhaitez utiliser Cloud Firestore avec ces services Firebase, vous devrez vider la base de données, puis modifier son type dans la console Google Cloud.
Lorsque vous essayez de provisionner Cloud Storage (via google_app_engine_application
), puis votre instance Cloud Firestore par défaut, vous obtenez l'erreur suivante : Error: Error creating Database: googleapi: Error 409: Database already
exists. Please use another database_id
.
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 de son instance Cloud Firestore par défaut, google_app_engine_application
provisionne automatiquement l'instance Cloud Firestore par défaut du projet.
Étant donné que l'instance Cloud Firestore par défaut de votre projet est déjà provisionnée, google_firestore_database
générera une erreur si vous essayez de provisionner à nouveau cette instance par défaut de manière explicite.
Une fois l'instance Cloud Firestore par défaut du projet provisionnée, vous ne pouvez plus la reprovisionner ni modifier son emplacement. Notez que l'instance de base de données provisionnée est en mode Datastore, ce qui signifie qu'elle n'est pas accessible aux SDK Firebase, à l'authentification ni à Firebase Security Rules. Si vous souhaitez utiliser Cloud Firestore avec ces services Firebase, vous devrez vider la base de données, puis modifier son type dans la console Google Cloud.