Inizia a utilizzare Terraform e Firebase
Mantieni tutto organizzato con le raccolte
Salva e classifica i contenuti in base alle tue preferenze.
Firebase sta iniziando a supportare Terraform.
Se fai parte di un team che vuole automatizzare e standardizzare la creazione di progetti Firebase con il provisioning di risorse specifiche e l'attivazione di servizi, l'utilizzo di Terraform con Firebase può essere una buona soluzione per te.
Il flusso di lavoro di base per l'utilizzo di Terraform con Firebase include quanto segue:
Creazione e personalizzazione di un file di configurazione Terraform (un file .tf) che specifica l'infrastruttura di cui vuoi eseguire il provisioning (ovvero le risorse di cui vuoi eseguire il provisioning e i servizi che vuoi attivare).
Utilizzo dei comandi gcloud CLI che interagiscono con Terraform per eseguire il provisioning dell'infrastruttura specificata nel file .tf.
Eliminare e modificare l'infrastruttura esistente utilizzando Terraform.
Gestire la configurazione e le attività specifiche del prodotto utilizzando Terraform, ad esempio:
Attivazione dei provider di accesso Firebase Authentication.
Creazione di bucket o istanze di database Cloud Storage e deployment di Firebase Security Rules per questi elementi.
Creazione di backend, build e altre risorse correlate di Firebase App Hosting.
Per eseguire tutte queste attività, puoi utilizzare i file di configurazione e i comandi standard di Terraform. Per aiutarti, abbiamo fornito file di configurazione Terraform di esempio per diversi casi d'uso comuni.
Flusso di lavoro generalizzato per l'utilizzo di Terraform con Firebase
Prerequisiti
Questa guida è un'introduzione all'utilizzo di Terraform con Firebase, pertanto presuppone una conoscenza di base di Terraform. Prima di iniziare questo workflow, assicurati di aver completato i seguenti prerequisiti.
Installa Terraform
e acquisisci familiarità con Terraform utilizzando i tutorial ufficiali.
Visualizza i requisiti per gli account utente e i service account
Se utilizzi un account utente, devi aver accettato i Termini di servizio di Firebase (TdS di Firebase). Hai accettato i Termini di servizio di Firebase se puoi visualizzare un progetto Firebase nella console Firebase.
Affinché Terraform possa eseguire determinate azioni (ad esempio, creare progetti), deve essere soddisfatta la seguente condizione:
L'utente o il service account deve disporre dell'accesso IAM applicabile per queste azioni.
Se l'account utente o di servizio fa parte di un'organizzazione Google Cloud,
le policy dell'organizzazione devono consentire all'account di eseguire queste azioni.
Passaggio 1: crea e personalizza un file di configurazione Terraform
Un file di configurazione Terraform richiede due sezioni principali (descritte in dettaglio di seguito):
La configurazione di provider è obbligatoria indipendentemente dai prodotti o servizi Firebase
coinvolti.
Crea un file di configurazione Terraform (ad esempio un file main.tf) nella directory locale.
In questa guida, utilizzerai questo file di configurazione per specificare sia la configurazione di provider sia tutta l'infrastruttura che vuoi che Terraform crei. Tuttavia, tieni presente che hai diverse opzioni per includere la configurazione del provider.
Visualizza le opzioni per includere la configurazione di provider
Per includere una configurazione provider nel resto della configurazione di Terraform, hai le seguenti opzioni:
Opzione 1: includilo all'inizio di un singolo file di configurazione .tf di Terraform (come mostrato in questa guida).
Utilizza questa opzione se hai appena iniziato a utilizzare Terraform o se vuoi solo provarlo con Firebase.
Opzione 2: includilo in un file .tf separato (ad esempio un file provider.tf), oltre al file .tf in cui specifichi l'infrastruttura da creare (ad esempio un file main.tf).
Utilizza questa opzione se fai parte di un team più grande che deve standardizzare la configurazione.
Quando esegui i comandi Terraform, sia il file provider.tf sia il file main.tf devono trovarsi nella stessa directory.
Includi la seguente configurazione di provider all'inizio del file main.tf.
Devi utilizzare il provider google-beta perché si tratta di una versione beta dell'utilizzo di Firebase con Terraform. Presta attenzione quando utilizzi questa funzionalità in produzione.
# 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}
Vai alla sezione successiva per completare il file di configurazione e specificare l'infrastruttura da creare.
Specifica l'infrastruttura da creare utilizzando i blocchi resource
Nel file di configurazione di Terraform (per questa guida, il file main.tf), devi specificare tutta l'infrastruttura che vuoi che Terraform crei (ovvero tutte le risorse di cui vuoi eseguire il provisioning e tutti i servizi che vuoi attivare). In questa guida troverai un elenco completo di tutte le risorse Firebase che supportano Terraform.
Apri il file main.tf.
Nella configurazione provider, includi la seguente configurazione dei blocchi resource.
Questo esempio di base crea un nuovo progetto Firebase e poi un'app Firebase per Android all'interno del progetto.
# 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_overridename="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_overrideproject=google_project.default.project_idfor_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-betaproject=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-betaproject=google_project.default.project_iddisplay_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,]}
Visualizza una versione con molte annotazioni di questo file di configurazione di esempio
Se non hai familiarità con l'infrastruttura di progetti e app come risorse, consulta la seguente documentazione:
# 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 projectprovider=google-beta.no_user_project_overridename="Project Display Name" // learn more about the project nameproject_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 APISprovider=google-beta.no_user_project_overrideproject=google_project.default.project_idfor_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 onprovider=google-betaproject=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-betaproject=google_project.default.project_iddisplay_name="My Awesome Android app" # learn more about an app's display namepackage_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,]}
Passaggio 2: esegui i comandi Terraform per creare l'infrastruttura specificata
Per eseguire il provisioning delle risorse e attivare i servizi specificati nel file main.tf, esegui i seguenti comandi dalla stessa directory del file main.tf.
Per informazioni dettagliate su questi comandi, consulta la documentazione di Terraform.
Se è la prima volta che esegui i comandi Terraform nella directory, devi inizializzare la directory di configurazione e installare il provider Google Terraform. Per farlo, esegui questo comando:
terraform init
Crea l'infrastruttura specificata nel file main.tf eseguendo il seguente comando:
terraform apply
Verifica che tutto sia stato eseguito o abilitato come previsto:
Opzione 1: visualizza la configurazione stampata nel terminale eseguendo il seguente comando:
terraform show
Opzione 2: visualizza il progetto Firebase nella console Firebase.
Risorse Firebase con supporto di Terraform
Le seguenti risorse Firebase e Google sono supportate da Terraform. E aggiungiamo sempre nuove risorse. Quindi, se non vedi la risorsa che vuoi gestire con Terraform, ricontrolla a breve per vedere se è disponibile o richiedila segnalando un problema nel repository GitHub.
google_identity_platform_config:
abilita Google Cloud Identity Platform (GCIP) (che è il backend di Firebase Authentication)
e fornisci le impostazioni di autenticazione a livello di progetto
Il progetto in cui Terraform abiliterà GCIP e/o Firebase Authentication deve essere incluso nel piano tariffario Blaze (ovvero, al progetto deve essere associato un account Cloud Billing). Puoi farlo in modo programmatico impostando l'attributo billing_account nella risorsa google_project.
Questa risorsa consente anche di utilizzare altre configurazioni, come i metodi di accesso locali, ad esempio l'autenticazione anonima, tramite email/password e tramite telefono, nonché le funzioni di blocco e i domini autorizzati.
Configurazione dell'autenticazione a più fattori (MFA) tramite Terraform
Firebase App Hosting
google_firebase_app_hosting_backend
: crea e gestisci un backend Firebase App Hosting, inclusa la connessione al repository GitHub e il branch attivo per il deployment continuo.
google_firebase_app_hosting_build
: crea una build per un backend, in un punto specifico del tag di riferimento del codebase e in un momento specifico.
Deployment di Firebase Realtime Database Security Rules tramite Terraform (scopri come eseguire il deployment di questi Security Rules utilizzando altri strumenti, tra cui le opzioni di programmazione)
Esempi di file di configurazione Terraform per casi d'uso comuni
Configura Firebase Authentication con
GCIP
Questa configurazione crea un nuovo progetto Google Cloud,
associa il progetto a un account Cloud Billing (il piano tariffario Blaze
è obbligatorio per Firebase Authentication con GCIP),
attiva i servizi Firebase per il progetto,
configura Firebase Authentication con GCIP
e registra tre diversi tipi di app con il progetto.
Tieni presente che l'attivazione di GCIP è obbligatoria per configurare Firebase Authentication tramite Terraform.
# Creates a new Google Cloud project.resource"google_project""auth"{provider=google-beta.no_user_project_overridefolder_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_overrideproject=google_project.auth.project_idfor_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-betaproject=google_project.auth.project_iddepends_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-betaproject=google_firebase_project.auth.project # Auto-deletes anonymous usersautodelete_anonymous_users=true # Configures local sign-in methods, like anonymous, email/password, and phone authentication.sign_in{allow_duplicate_emails=trueanonymous{enabled=true}email{enabled=truepassword_required=false}phone_number{enabled=truetest_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=trueaccess_token=trueid_token=true}} # Configures a temporary quota for new signups for anonymous, email/password, and phone number.quota{sign_up_quota_config{quota=1000start_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-betaproject=google_firebase_project.auth.projectdisplay_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-betaproject=google_firebase_project.auth.projectdisplay_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-betaproject=google_firebase_project.auth.projectdisplay_name="My Web app"}
Esegui il provisioning di un servizio Firebase SQL Connect
Questa configurazione crea un nuovo progetto Google Cloud, attiva i servizi Firebase per il progetto ed esegue il provisioning di un servizio SQL Connect.
# Creates a new Google Cloud project.resource"google_project""dataconnect"{provider=google-beta.no_user_project_overridefolder_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_overrideproject=google_project.dataconnect.project_idfor_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-betaproject=google_project.dataconnect.project_iddepends_on=[google_project_service.services]}# Create a Firebase Data Connect serviceresource"google_firebase_data_connect_service""dataconnect-default"{project=google_firebase_project.dataconnect.projectlocation="name-of-region-for-service"service_id="${google_firebase_project.dataconnect.project}-default-fdc"deletion_policy="DEFAULT"}
Esegui il provisioning dell'istanza Firebase Realtime Database predefinita
Questa configurazione crea un nuovo progetto Google Cloud,
attiva i servizi Firebase per il progetto,
esegue il provisioning dell'istanza Realtime Database predefinita del progetto
e registra tre diversi tipi di app con il progetto.
# Creates a new Google Cloud project.resource"google_project""rtdb"{provider=google-beta.no_user_project_overridefolder_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_overrideproject=google_project.rtdb.project_idfor_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-betaproject=google_project.rtdb.project_iddepends_on=[google_project_service.rtdb]}# Provisions the default Realtime Database default instance.resource"google_firebase_database_instance""database"{provider=google-betaproject=google_firebase_project.rtdb.project # See available locations: https://firebase.google.com/docs/database/locationsregion="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-betaproject=google_firebase_project.rtdb.projectdisplay_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-betaproject=google_firebase_project.rtdb.projectdisplay_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-betaproject=google_firebase_project.rtdb.projectdisplay_name="My Web app"}
Esegui il provisioning di più istanze Firebase Realtime Database
Questa configurazione crea un nuovo progetto Google Cloud,
associa il progetto a un account Cloud Billing (il piano tariffario Blaze
è obbligatorio per più istanze Realtime Database),
attiva i servizi Firebase per il progetto,
esegue il provisioning di più istanze Realtime Database
(inclusa l'istanza Realtime Database predefinita del progetto)
e registra tre diversi tipi di app con il progetto.
# Creates a new Google Cloud project.resource"google_project""rtdb-multi"{provider=google-beta.no_user_project_overridefolder_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_overrideproject=google_project.rtdb-multi.project_idfor_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-betaproject=google_project.rtdb-multi.project_iddepends_on=[google_project_service.rtdb-multi]}# Provisions the default Realtime Database default instance.resource"google_firebase_database_instance""database-default"{provider=google-betaproject=google_firebase_project.rtdb-multi.project # See available locations: https://firebase.google.com/docs/database/locationsregion="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-betaproject=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-betaproject=google_firebase_project.rtdb-multi.projectdisplay_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-betaproject=google_firebase_project.rtdb-multi.projectdisplay_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-betaproject=google_firebase_project.rtdb-multi.projectdisplay_name="My Web app"}
Esegui il provisioning dell'istanza Cloud Firestore predefinita
Questa configurazione crea un nuovo progetto Google Cloud,
attiva i servizi Firebase per il progetto,
esegue il provisioning dell'istanza Cloud Firestore predefinita del progetto
e registra tre diversi tipi di app con il progetto.
Inoltre, esegue il provisioning di Firebase Security Rules per l'istanza Cloud Firestore predefinita,
crea un indice Cloud Firestore
e aggiunge un documento Cloud Firestore con dati di seed.
# Creates a new Google Cloud project.resource"google_project""firestore"{provider=google-beta.no_user_project_overridefolder_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_overrideproject=google_project.firestore.project_idfor_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-betaproject=google_project.firestore.project_iddepends_on=[google_project_service.firestore]}# Provisions the Firestore database instance.resource"google_firestore_database""firestore"{provider=google-betaproject=google_firebase_project.firestore.projectname="(default)" # See available locations: https://firebase.google.com/docs/firestore/locationslocation_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-betaproject=google_firestore_database.firestore.projectsource{files{name="firestore.rules" # Write security rules in a local file named "firestore.rules". # Learn more: https://firebase.google.com/docs/firestore/security/get-startedcontent=file("firestore.rules")}}}# Releases the ruleset for the Firestore instance.resource"google_firebaserules_release""firestore"{provider=google-betaname="cloud.firestore" # must be cloud.firestoreruleset_name=google_firebaserules_ruleset.firestore.nameproject=google_firestore_database.firestore.project}# Adds a new Firestore index.resource"google_firestore_index""indexes"{provider=google-betaproject=google_firestore_database.firestore.projectcollection="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-betaproject=google_firestore_database.firestore.projectcollection="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-betaproject=google_firebase_project.firestore.projectdisplay_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-betaproject=google_firebase_project.firestore.projectdisplay_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-betaproject=google_firebase_project.firestore.projectdisplay_name="My Web app"}
Questo è il set di regole di Cloud Firestore Security Rules che deve essere presente in un file locale denominato firestore.rules.
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /some_collection/{document} {
allow read, create, update: if request.auth != null;
}
}
}
Esegui il provisioning del bucket Cloud Storage predefinito
Esegui il provisioning di bucket Cloud Storage aggiuntivi
Questa configurazione crea un nuovo progetto Google Cloud,
associa il progetto a un account Cloud Billing (il piano tariffario Blaze
è obbligatorio per i bucket aggiuntivi),
attiva i servizi Firebase per il progetto,
esegue il provisioning di bucket Cloud Storage aggiuntivi non predefiniti
e registra tre diversi tipi di app con il progetto.
Inoltre, esegue il provisioning di Firebase Security Rules per ogni bucket Cloud Storage e carica un file in uno dei bucket Cloud Storage.
# Creates a new Google Cloud project.resource"google_project""storage-multi"{provider=google-beta.no_user_project_overridefolder_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_overrideproject=google_project.storage-multi.project_idfor_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-betaproject=google_project.storage-multi.project_iddepends_on=[google_project_service.storage-multi]}# Provisions a Cloud Storage bucket.resource"google_storage_bucket""bucket-1"{provider=google-betaproject=google_firebase_project.storage-multi.projectname="name-of-storage-bucket" # See available locations: https://cloud.google.com/storage/docs/locations#available-locationslocation="name-of-region-for-bucket"}# Provisions an additional Cloud Storage bucket.resource"google_storage_bucket""bucket-2"{provider=google-betaproject=google_firebase_project.storage-multi.projectname="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-betaproject=google_firebase_project.storage-multi.projectbucket_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-betaproject=google_firebase_project.storage-multi.projectbucket_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-betaproject=google_firebase_project.storage-multi.projectsource{files{ # Write security rules in a local file named "storage.rules" # Learn more: https://firebase.google.com/docs/storage/security/get-startedname="storage.rules"content=file("storage.rules")}}}# Releases the ruleset to the first Storage bucket.resource"google_firebaserules_release""bucket-1"{provider=google-betaname="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-betaname="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-betaname="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-betaproject=google_firebase_project.storage-multi.projectdisplay_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-betaproject=google_firebase_project.storage-multi.projectdisplay_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-betaproject=google_firebase_project.storage-multi.projectdisplay_name="My Web app"}
Questo è il set di regole di Cloud Storage Security Rules che deve essere presente in un file locale denominato storage.rules.
rules_version = '2';
service firebase.storage {
match /b/{bucket}/o {
match /some_folder/{fileName} {
allow read, write: if request.auth != null;
}
}
}
Proteggi una risorsa API con Firebase App Check
Questa configurazione crea un nuovo progetto Google Cloud,
attiva i servizi Firebase per il progetto e
configura e attiva l'applicazione di Firebase App Check per Cloud Firestore
in modo che sia accessibile solo dalla tua app per Android.
# Creates a new Google Cloud project.resource"google_project""appcheck"{provider=google-beta.no_user_project_overridefolder_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_overrideproject=google_project.appcheck.project_idfor_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-betaproject=google_project.appcheck.project_iddepends_on=[google_project_service.services]}# Provisions the Firestore database instance.resource"google_firestore_database""database"{provider=google-betaproject=google_firebase_project.appcheck.projectname="(default)" # See available locations: https://firebase.google.com/docs/projects/locations#default-cloud-locationlocation_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-betaproject=google_firebase_project.appcheck.projectdisplay_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 providerresource"google_firebase_app_check_play_integrity_config""appcheck"{provider=google-betaproject=google_firebase_project.appcheck.projectapp_id=google_firebase_android_app.appcheck.app_iddepends_on=[google_firestore_database.database]lifecycle{precondition{condition=length(google_firebase_android_app.appcheck.sha256_hashes) > 0error_message="Provide a SHA-256 certificate on the Android App to use App Check"}}}# Enable enforcement of App Check for Firestoreresource"google_firebase_app_check_service_config""firestore"{provider=google-betaproject=google_firebase_project.appcheck.projectservice_id="firestore.googleapis.com"depends_on=[google_project_service.services]}
Installa un'istanza di Firebase Extension
Questa configurazione crea un nuovo progetto Google Cloud, abilita i servizi Firebase per il progetto e installa una nuova istanza di Firebase Extension nel progetto. Se l'istanza esiste già, i suoi parametri vengono aggiornati in base ai valori forniti nella configurazione.
# Creates a new Google Cloud project.resource"google_project""extensions"{provider=google-beta.no_user_project_overridefolder_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_overrideproject=google_project.extensions.project_idfor_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-betaproject=google_project.extensions.project_iddepends_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-betaproject=google_firebase_project.extensions.projectinstance_id="translate-text-in-firestore"config{extension_ref="firebase/firestore-translate-text"params={COLLECTION_PATH="posts/comments/translations"DO_BACKFILL=trueLANGUAGES="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"}}}
Attiva e proteggi Firebase AI Logic
Questa configurazione crea un nuovo progetto Google Cloud, abilita i servizi Firebase per il progetto, tra cui Firebase AI Logic, e configura e abilita l'applicazione di Firebase App Check per Firebase AI Logic in modo che sia accessibile solo dalle tue app.
# Creates a new Google Cloud project.resource"google_project""vertex"{provider=google-beta.no_user_project_overridefolder_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_overrideproject=google_project.vertex.project_idfor_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-betaproject=google_project.vertex.project_iddepends_on=[google_project_service.services]}# Creates a Firebase Web App in the new project created earlier.resource"google_firebase_web_app""app"{provider=google-betaproject=google_firebase_project.vertex.projectdisplay_name="My Web App"}# Creates a Firebase Android App in the new project created earlier.resource"google_firebase_android_app""app"{provider=google-betaproject=google_firebase_project.vertex.projectdisplay_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-betaproject=google_firebase_project.vertex.projectdisplay_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 Firebaseresource"google_firebase_app_check_service_config""vertex"{provider=google-betaproject=google_firebase_project.vertex.projectservice_id="firebaseml.googleapis.com"enforcement_mode="ENFORCED"}# Enables the reCAPTCHA Enterprise APIresource"google_project_service""recaptcha_enterprise"{provider=google-betaproject=google_firebase_project.vertex.projectservice="recaptchaenterprise.googleapis.com" # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Enables the Play Integrity APIresource"google_project_service""play_integrity"{provider=google-betaproject=google_firebase_project.vertex.projectservice="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 Checkresource"google_firebase_app_check_recaptcha_enterprise_config""appcheck"{provider=google-betaproject=google_firebase_project.vertex.projectapp_id=google_firebase_web_app.app.app_idsite_key="your site key"token_ttl="7200s" # Optionaldepends_on=[google_project_service.recaptcha_enterprise]}# Registers the Android app with the Play Integrity providerresource"google_firebase_app_check_play_integrity_config""appcheck"{provider=google-betaproject=google_firebase_project.vertex.projectapp_id=google_firebase_android_app.app.app_idtoken_ttl="7200s" # Optionallifecycle{precondition{condition=length(google_firebase_android_app.app.sha256_hashes) > 0error_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 providerresource"google_firebase_app_check_app_attest_config""appcheck"{provider=google-betaproject=google_firebase_project.vertex.projectapp_id=google_firebase_apple_app.app.app_idtoken_ttl="7200s" # Optionallifecycle{precondition{condition=google_firebase_apple_app.app.team_id!=""error_message="Provide a Team ID on the Apple App to use App Check"}}}
Esegui manualmente il provisioning di un backend App Hosting
Questa configurazione mostra come eseguire manualmente il provisioning di un backend App Hosting utilizzando Terraform. Questo approccio ti offre un controllo granulare sulle risorse create, ma richiede di definire ogni risorsa singolarmente. Questa opzione è utile quando devi personalizzare il backend oltre le opzioni predefinite.
# Creates a new Google Cloud project.resource"google_project""apphosting"{provider=google-beta.no_user_project_overridefolder_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_overrideproject=google_project.apphosting.project_idfor_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-betaproject=google_project.apphosting.project_iddepends_on=[google_project_service.services]}# Creates a Firebase Web App in the new project created earlier.resource"google_firebase_web_app""apphosting"{provider=google-betaproject=google_firebase_project.apphosting.projectdisplay_name="My web app"}# Creates a Firebase App Hosting Backendresource"google_firebase_app_hosting_backend""example"{provider=google-betaproject=google_firebase_project.apphosting.project # Choose the region closest to your userslocation="name-of-region-for-service"backend_id="name-of-backend-for-service"app_id=google_firebase_web_app.apphosting.app_iddisplay_name="My Backend"serving_locality="GLOBAL_ACCESS"service_account=google_service_account.service_account.email}# Creates the service account for Firebase App Hostingresource"google_service_account""service_account"{provider=google-betaproject=google_firebase_project.apphosting.project # Must be firebase-app-hosting-computeaccount_id="firebase-app-hosting-compute"display_name="Firebase App Hosting compute service account" # Do not throw if already existscreate_ignore_already_exists=true}# Adds permission to the App Hosting service accountresource"google_project_iam_member""app_hosting_sa"{provider=google-betaproject=google_firebase_project.apphosting.projectfor_each=toset(["roles/firebase.sdkAdminServiceAgent","roles/firebaseapphosting.computeRunner"])role=each.keymember=google_service_account.service_account.member}# Creates a Buildresource"google_firebase_app_hosting_build""example"{provider=google-betaproject=google_firebase_app_hosting_backend.example.projectlocation=google_firebase_app_hosting_backend.example.locationbackend=google_firebase_app_hosting_backend.example.backend_idbuild_id="my-build"source{container{ # TODO: use your own imageimage="us-docker.pkg.dev/cloudrun/container/hello"}}}# Rolls out the Buildresource"google_firebase_app_hosting_traffic""example"{provider=google-betaproject=google_firebase_app_hosting_backend.example.projectlocation=google_firebase_app_hosting_backend.example.locationbackend=google_firebase_app_hosting_backend.example.backend_idtarget{splits{build=google_firebase_app_hosting_build.example.namepercent=100}}}
Esegui il provisioning di un backend App Hosting utilizzando GitHub
Questa configurazione mostra come eseguire il provisioning di un backend App Hosting utilizzando il codice dell'applicazione archiviato in un repository GitHub. Questo approccio ti consente di gestire e aggiornare l'infrastruttura tramite richieste di pull GitHub e pipeline CI/CD in base al modello tipico per i deployment di App Hosting.
# Creates a new Google Cloud project.resource"google_project""apphosting"{provider=google-beta.no_user_project_overridefolder_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_overrideproject=google_project.apphosting.project_idfor_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-betaproject=google_project.apphosting.project_iddepends_on=[google_project_service.services]}# Creates a Firebase Web App in the new project created earlier.resource"google_firebase_web_app""apphosting"{provider=google-betaproject=google_firebase_project.apphosting.projectdisplay_name="My web app"}### Setting up Firebase App Hosting #### Creates a Firebase App Hosting Backendresource"google_firebase_app_hosting_backend""example"{provider=google-betaproject=google_firebase_project.apphosting.project # Choose the region closest to your userslocation="name-of-region-for-service"backend_id="name-of-backend-for-service"app_id=google_firebase_web_app.apphosting.app_iddisplay_name="My Backend"serving_locality="GLOBAL_ACCESS"service_account=google_service_account.service_account.emailcodebase{repository=google_developer_connect_git_repository_link.my-repository.nameroot_directory="/"}}# Creates the service account for Firebase App Hostingresource"google_service_account""service_account"{provider=google-betaproject=google_firebase_project.apphosting.project # Must be firebase-app-hosting-computeaccount_id="firebase-app-hosting-compute"display_name="Firebase App Hosting compute service account" # Do not throw if already existscreate_ignore_already_exists=true}# Adds permission to the App Hosting service accountresource"google_project_iam_member""app_hosting_sa"{provider=google-betaproject=google_firebase_project.apphosting.projectfor_each=toset(["roles/developerconnect.readTokenAccessor","roles/firebase.sdkAdminServiceAgent","roles/firebaseapphosting.computeRunner"])role=each.keymember=google_service_account.service_account.member}# Configures auto rollout from GitHubresource"google_firebase_app_hosting_traffic""example"{provider=google-betaproject=google_firebase_app_hosting_backend.example.projectlocation=google_firebase_app_hosting_backend.example.locationbackend=google_firebase_app_hosting_backend.example.backend_idrollout_policy{codebase_branch="main" # Or another branch}}###### Setting up a connection to GitHub #### Provisions Service Agent for Developer Connectresource"google_project_service_identity""devconnect-p4sa"{provider=google-betaproject=google_firebase_project.apphosting.projectservice="developerconnect.googleapis.com"}# Adds permission to Developer Connect Service Agent to manager GitHub tokensresource"google_project_iam_member""devconnect-secret"{provider=google-betaproject=google_firebase_project.apphosting.projectrole="roles/secretmanager.admin"member=google_project_service_identity.devconnect-p4sa.member}# Connects to a GitHub accountresource"google_developer_connect_connection""my-connection"{provider=google-betaproject=google_firebase_project.apphosting.project # Must match the google_firebase_app_hosting_backend's locationlocation="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 outputoutput"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 projectresource"google_developer_connect_git_repository_link""my-repository"{provider=google-betaproject=google_firebase_project.apphosting.projectlocation=google_developer_connect_connection.my-connection.locationgit_repository_link_id="my-repo-id"parent_connection=google_developer_connect_connection.my-connection.connection_idclone_uri="https://github.com/myuser/myrepo.git"}###
Risoluzione dei problemi e domande frequenti
Vuoi saperne di più su tutti i diversi attributi relativi ai progetti (come project e user_project_override)
Questa guida utilizza i seguenti attributi Terraform quando si lavora con i "progetti".
project all'interno di un blocco resource
Consigliato: se possibile, includi l'attributo project all'interno di ogni blocco resource
Includendo un attributo project, Terraform creerà l'infrastruttura specificata nel blocco resource all'interno del progetto specificato. Questa guida e i nostri file di configurazione di esempio utilizzano tutti questa pratica.
Consulta la documentazione ufficiale di Terraform su
project.
user_project_override all'interno del blocco provider
Per il provisioning della maggior parte delle risorse, devi utilizzare user_project_override = true, il che significa controllare la quota rispetto al tuo progetto Firebase. Tuttavia, per configurare il nuovo progetto in modo che possa accettare i controlli delle quote, devi prima utilizzare user_project_override = false.
Viene visualizzato questo errore:
generic::permission_denied: Firebase Tos Not Accepted.
Assicurati che l'account utente che utilizzi per eseguire i comandi gcloud CLI abbia accettato i Termini di servizio di Firebase.
Puoi eseguire questo controllo utilizzando un browser che ha eseguito l'accesso all'account utente e provando a visualizzare un progetto Firebase esistente nella consoleFirebase. Se puoi visualizzare un progetto Firebase esistente, significa che l'account utente ha accettato i TdS di Firebase.
Se non riesci a visualizzare alcun progetto Firebase esistente, probabilmente l'account utente non ha accettato i Termini di servizio di Firebase. Per risolvere il problema, crea un nuovo progetto Firebase tramite la console Firebase e accetta i TdS di Firebase durante la creazione del progetto. Puoi eliminare immediatamente questo progetto tramite le Impostazioni progetto nella console.
Dopo aver eseguito terraform apply, viene visualizzato questo errore: generic::permission_denied: IAM authority does not have the
permission.
Attendi qualche minuto, quindi prova a eseguire di nuovo terraform apply.
La creazione di una risorsa non è riuscita, ma quando esegui di nuovo terraform apply, viene visualizzato ALREADY_EXISTS.
Ciò potrebbe essere dovuto a un ritardo nella propagazione in vari sistemi. Prova a risolvere il problema importando la risorsa nello stato di Terraform eseguendo terraform import. Quindi prova a eseguire di nuovo terraform apply.
Puoi scoprire come importare ogni risorsa nella sezione "Importa" della relativa
documentazione di Terraform (ad esempio, la
documentazione "Importa" per Cloud Firestore).
Quando lavori con Cloud Firestore, ricevi questo errore: Error creating Index: googleapi:
Error 409;...Concurrent access -- try again
Come suggerisce l'errore, Terraform potrebbe tentare di eseguire il provisioning di più indici
e/o di creare un documento contemporaneamente e ha riscontrato un errore di concorrenza.
Prova a eseguire di nuovo terraform apply.
Viene visualizzato questo errore: "you may need to specify 'X-Goog-User-Project' HTTP header for quota and
billing purposes".
Questo errore indica che Terraform non sa per quale progetto controllare la quota. Per risolvere il problema, controlla quanto segue nel blocco resource:
Assicurati di aver specificato un valore per l'attributo project.
Assicurati di utilizzare il provider con user_project_override = true (senza alias), che negli esempi di Firebase è google-beta.
Quando crei un nuovo progetto Google Cloud, ricevi l'errore che indica che l'ID progetto specificato per il nuovo progetto esiste già.
Ecco i possibili motivi per cui l'ID progetto potrebbe già esistere:
Il progetto associato a questo ID appartiene a un altro utente.
Per risolvere il problema: scegli un altro ID progetto.
Il progetto associato a questo ID è stato eliminato di recente (stato di eliminazione temporanea).
Per risolvere il problema: se ritieni che il progetto associato all'ID appartenga a te, controlla lo stato del progetto utilizzando l'API REST projects.get.
Il progetto associato a questo ID esiste correttamente nell'ambito dell'utente corrente. Una possibile causa dell'errore potrebbe essere l'interruzione di un terraform apply precedente.
Per risolvere il problema: esegui i seguenti comandi: terraform import google_project.default PROJECT_ID
e poi terraform import google_firebase_project.default PROJECT_ID
Perché devi eseguire il provisioning dell'istanza Cloud Firestore predefinita prima del bucket Cloud Storage predefinito?
Se hai eseguito il provisioning del bucket Cloud Storage predefinito (tramite google_app_engine_application) prima di provare a eseguire il provisioning dell'istanza Cloud Firestore predefinita, scoprirai che il provisioning dell'istanza Cloud Firestore predefinita è già stato eseguito. Tieni presente che l'istanza di database di cui è stato eseguito il provisioning è in modalità Datastore, il che significa che non è accessibile agli SDK Firebase, all'autenticazione o a Firebase Security Rules. Se vuoi utilizzare Cloud Firestore con questi servizi Firebase, devi svuotare il database e poi modificarne il tipo nella console Google Cloud.
Quando provi a eseguire il provisioning di Cloud Storage (tramite google_app_engine_application) e poi della tua istanza Cloud Firestore predefinita, viene visualizzato questo errore: Error: Error creating Database: googleapi: Error 409: Database already
exists. Please use another database_id.
Quando esegui il provisioning del bucket Cloud Storage predefinito di un progetto (tramite google_app_engine_application) e il progetto non ha ancora l'istanza Cloud Firestore predefinita, google_app_engine_application esegue automaticamente il provisioning dell'istanza Cloud Firestore predefinita del progetto.
Quindi, poiché l'istanza Cloud Firestore predefinita del tuo progetto è già
eseguito il provisioning, google_firestore_database genererà un errore se provi a eseguire nuovamente il provisioning esplicito
dell'istanza predefinita.
Una volta eseguito il provisioning dell'istanza Cloud Firestore predefinita del progetto, non puoi "eseguire nuovamente il provisioning" o modificare la località. Tieni presente che l'istanza del database di cui è stato eseguito il provisioning è in modalità Datastore, il che significa che non è accessibile agli SDK Firebase, all'autenticazione o a Firebase Security Rules. Se vuoi utilizzare Cloud Firestore con questi servizi Firebase, devi svuotare il database e poi modificarne il tipo nella console Google Cloud.