Firebase sta iniziando a supportare Terraform . Se fai parte di un team che desidera automatizzare e standardizzare la creazione di progetti Firebase con risorse specifiche fornite e servizi abilitati, 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 desideri fornire (ovvero, le risorse di cui desideri fornire e i servizi che desideri abilitare).Utilizzo dei comandi CLI di gCloud che si interfacciano con Terraform per effettuare il provisioning dell'infrastruttura specificata nel file
.tf
.
Cosa puoi fare con Terraform e Firebase?
Il flusso di lavoro generalizzato di esempio in questa guida prevede la creazione di un nuovo progetto Firebase con un'app Android. Ma puoi fare molto di più con Terraform, ad esempio:
Elimina e modifica l'infrastruttura esistente utilizzando Terraform.
Gestisci la configurazione e le attività specifiche del prodotto utilizzando Terraform, come:
- Abilitazione dei provider di accesso per l'autenticazione Firebase.
- Creazione di bucket Cloud Storage o istanze di database e distribuzione delle regole di sicurezza Firebase per essi.
Puoi utilizzare file di configurazione e comandi Terraform standard per eseguire tutte queste attività. E per aiutarti in questo, 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. Assicurati di aver completato i seguenti prerequisiti prima di iniziare questo flusso di lavoro.
Installa Terraform e acquisisci familiarità con Terraform utilizzando i tutorial ufficiali.
Installa la CLI di Google Cloud (CLI di gCloud). Accedi utilizzando un account utente o un account di servizio .
- Se utilizzi un account utente, devi aver accettato i Termini di servizio Firebase (Firebase ToS). Hai accettato i ToS di Firebase se puoi visualizzare un progetto Firebase nella console Firebase
- Affinché Terraform possa intraprendere determinate azioni (ad esempio creare progetti), deve essere vero quanto segue:
- L'utente o l'account di servizio deve disporre dell'accesso IAM applicabile per tali azioni.
- Se l'account utente o di servizio fa parte di un'organizzazione Google Cloud, i criteri dell'organizzazione devono consentire all'account di eseguire tali azioni.
Passaggio 1: crea e personalizza un file di configurazione Terraform
Un file di configurazione Terraform necessita di due sezioni principali (descritte in dettaglio di seguito):
- Una sezione di configurazione
provider
che determina a quali risorse Terraform è possibile accedere - Una sezione di singoli blocchi
resource
che specificano quale infrastruttura creare
Configura il tuo provider
È necessaria la configurazione di un provider
, indipendentemente dai prodotti o servizi Firebase coinvolti.
Crea un file di configurazione Terraform (come il file
main.tf
) nella directory locale.In questa guida utilizzerai questo file di configurazione per specificare sia la configurazione
provider
sia tutta l'infrastruttura che desideri che Terraform crei. Tieni presente, tuttavia, che hai opzioni su come includere la configurazione del provider.Hai le seguenti opzioni su come includere la configurazione di un
provider
nel resto della configurazione Terraform:Opzione 1: includilo nella parte superiore di un singolo file di configurazione Terraform
.tf
(come mostrato in questa guida).- Utilizza questa opzione se hai appena iniziato con Terraform o se stai semplicemente provando Terraform con Firebase.
Opzione 2: includilo in un file
.tf
separato (come un fileprovider.tf
), oltre al file.tf
in cui specifichi l'infrastruttura da creare (come un filemain.tf
).- Utilizza questa opzione se fai parte di un team più ampio che necessita di standardizzare la configurazione.
- Quando si eseguono i comandi Terraform, sia il file
provider.tf
che il filemain.tf
devono trovarsi nella stessa directory.
Includere la seguente configurazione
provider
nella parte superiore del filemain.tf
Devi utilizzare il provider
google-beta
perché si tratta di una versione beta dell'utilizzo di Firebase con Terraform. Prestare attenzione durante l'utilizzo in produzione.# Terraform configuration to set up providers by version. terraform { required_providers { google-beta = { source = "hashicorp/google-beta" version = "~> 4.0" } } } # Configures the provider to use the resource block's specified project for quota checks. provider "google-beta" { user_project_override = true } # Configures the provider to not use the resource block's specified project for quota checks. # This provider should only be used during project creation and initializing services. provider "google-beta" { alias = "no_user_project_override" user_project_override = false }
Scopri di più sui diversi tipi di attributi relativi al progetto (incluso quello che questa guida chiama il "progetto di controllo delle quote") quando utilizzi Terraform con Firebase.
Passa alla sezione successiva per completare il file di configurazione e specificare quale infrastruttura creare.
Specifica quale infrastruttura creare utilizzando i blocchi resource
Nel file di configurazione Terraform (per questa guida, il file main.tf
), devi specificare tutta l'infrastruttura che desideri che Terraform crei (ovvero tutte le risorse di cui desideri fornire e tutti i servizi che desideri abilitare). In questa guida trovi un elenco completo di tutte le risorse Firebase che supportano Terraform .
Apri il file
main.tf
Nella configurazione
provider
, includi la seguente configurazione di blocchiresource
.Questo esempio di base crea un nuovo progetto Firebase e quindi crea un'app Android Firebase all'interno di quel 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_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, ] }
Se non hai familiarità con l'infrastruttura di progetti e app come risorse, consulta la seguente documentazione:
- Comprendere i progetti Firebase
- Documentazione di riferimento per la gestione dei progetti 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, ] }
Passaggio 2: esegui i comandi Terraform per creare l'infrastruttura specificata
Per effettuare il provisioning delle risorse e abilitare 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 comandi Terraform nella directory, devi inizializzare la directory di configurazione e installare il provider Google Terraform. Fallo eseguendo il seguente comando:
terraform init
Crea l'infrastruttura specificata nel file
main.tf
eseguendo il comando seguente:terraform apply
Conferma che tutto sia stato sottoposto a provisioning o abilitato come previsto:
Opzione 1: visualizza la configurazione stampata nel tuo terminale eseguendo il seguente comando:
terraform show
Opzione 2: visualizza il tuo progetto Firebase nella console Firebase .
Risorse Firebase con supporto Terraform
Le seguenti risorse Firebase e Google supportano Terraform. E aggiungiamo sempre più risorse! Pertanto, se non vedi la risorsa che desideri gestire con Terraform, controlla presto per vedere se è disponibile o richiedila segnalando un problema nel repository GitHub .
Gestione di progetti e app Firebase
google_firebase_project
: abilita i servizi Firebase su un progetto Google Cloud esistentegoogle_firebase_project_location
: imposta la posizione per le risorse Google Cloud predefinite del progettoApp Firebase
-
google_firebase_apple_app
: crea o gestisci un'app per piattaforme Apple Firebase -
google_firebase_android_app
: crea o gestisci un'app Android Firebase -
google_firebase_web_app
: crea o gestisci un'app Web Firebase
-
Autenticazione Firebase
google_identity_platform_config
: abilita Google Cloud Identity Platform (GCIP) (che è il backend per Firebase Authentication) e fornisci impostazioni di autenticazione a livello di progettoLa configurazione dell'autenticazione Firebase tramite Terraform richiede l'abilitazione di GCIP. Assicurati di rivedere il file
.tf
di esempio per sapere come configurare l'autenticazione Firebase .Il progetto in cui Terraform abiliterà GCIP e/o l'autenticazione Firebase deve rientrare nel piano tariffario Blaze (ovvero, il progetto deve avere un account di fatturazione Cloud associato). Puoi farlo a livello di codice impostando l'attributo
billing_account
nella risorsagoogle_project
.Questa risorsa consente inoltre più configurazioni, come metodi di accesso locale, come l'autenticazione anonima, tramite posta elettronica/password e telefonica, nonché funzioni di blocco e domini autorizzati.
google_identity_platform_default_supported_idp_config
: configura provider di identità federati comuni, come Google, Facebook o Appleidentity_platform_oauth_idp_config
: configura origini arbitrarie del provider di identità (IdP) OAuthgoogle_identity_platform_inbound_saml_config
: configura le integrazioni SAML
Non ancora supportato:
- Configurazione dell'autenticazione a più fattori (MFA) tramite Terraform
Database in tempo reale Firebase
-
google_firebase_database_instance
: crea un'istanza di Realtime Database
Non ancora supportato:
- Distribuzione delle regole di sicurezza del database Firebase Realtime tramite Terraform (scopri come distribuire queste regole utilizzando altri strumenti, incluse le opzioni programmatiche)
Cloud Fire Store
google_firestore_database
: crea un'istanza Cloud Firestoregoogle_firestore_index
: abilita query efficienti per Cloud Firestoregoogle_firestore_document
: invia un seed a un'istanza Cloud Firestore con un documento specifico in una raccoltaImportante: non utilizzare dati reali relativi all'utente finale o alla produzione in questo documento seed.
Archiviazione nel cloud per Firebase
google_firebase_storage_bucket
: rende accessibile un bucket Cloud Storage esistente per gli SDK Firebase, l'autenticazione e le regole di sicurezza Firebase- La configurazione di un bucket Cloud Storage predefinito per un progetto Firebase richiede il primo provisioning
google_app_engine_application
. Assicurati di esaminare il file.tf
di esempio per sapere come eseguire il provisioning dei bucket Cloud Storage .
- La configurazione di un bucket Cloud Storage predefinito per un progetto Firebase richiede il primo provisioning
google_storage_bucket_object
: aggiungi un oggetto a un bucket Cloud StorageImportante: non utilizzare dati reali dell'utente finale o di produzione in questo file.
Regole di sicurezza Firebase (per Cloud Firestore e Cloud Storage)
Tieni presente che Firebase Realtime Database utilizza un sistema di provisioning diverso per le sue regole di sicurezza Firebase.
google_firebaserules_ruleset
: definisce le regole di sicurezza Firebase che si applicano all'istanza Cloud Firestore o a un bucket Cloud Storagegoogle_firebaserules_release
: distribuisci set di regole specifici sull'istanza Cloud Firestore o su un bucket Cloud Storage
Controllo dell'app Firebase
-
google_firebase_app_check_service_config
: abilita l'applicazione di App Check per un servizio -
google_firebase_app_check_app_attest_config
: registra un'app per piattaforme Apple con il provider App Attest -
google_firebase_app_check_device_check_config
: registra un'app per piattaforme Apple con il provider DeviceCheck -
google_firebase_app_check_play_integrity_config
: registra un'app Android presso il provider Play Integrity -
google_firebase_app_check_recaptcha_enterprise_config
: registra un'app Web con il provider reCAPTCHA Enterprise -
google_firebase_app_check_recaptcha_v3_config
: registra un'app Web con il provider reCAPTCHA v3 -
google_firebase_app_check_debug_token
: utilizza i token di debug per i test
Estensioni Firebase
-
google_firebase_extensions_instance
: installa o aggiorna un'istanza di un'estensione Firebase
File di configurazione Terraform di esempio per casi d'uso comuni
Questa configurazione crea un nuovo progetto Google Cloud, associa il progetto a un account di fatturazione Cloud (il piano tariffario Blaze è richiesto per l'autenticazione Firebase con GCIP), abilita i servizi Firebase per il progetto, configura l'autenticazione Firebase con GCIP e registra tre diverse app tipi con il progetto.
Tieni presente che è necessario abilitare GCIP per configurare l'autenticazione Firebase tramite Terraform.
# Creates a new Google Cloud project. resource "google_project" "auth" { provider = google-beta.no_user_project_override folder_id = "folder-id-for-new-project" name = "Project Display Name" project_id = "project-id-for-new-project" # Associates the project with a Cloud Billing account # (required for Firebase Authentication with GCIP). billing_account = "000000-000000-000000" # Required for the project to display in a list of Firebase projects. labels = { "firebase" = "enabled" } } # Enables required APIs. resource "google_project_service" "auth" { provider = google-beta.no_user_project_override project = google_project.auth.project_id for_each = toset([ "cloudbilling.googleapis.com", "cloudresourcemanager.googleapis.com", "serviceusage.googleapis.com", "identitytoolkit.googleapis.com", ]) service = each.key # Don't disable the service if the resource block is removed by accident. disable_on_destroy = false } # Enables Firebase services for the new project created above. resource "google_firebase_project" "auth" { provider = google-beta project = google_project.auth.project_id depends_on = [ google_project_service.auth, ] } # Creates an Identity Platform config. # Also enables Firebase Authentication with Identity Platform in the project if not. resource "google_identity_platform_config" "auth" { provider = google-beta project = google_project.auth.project_id # Auto-deletes anonymous users autodelete_anonymous_users = true # Configures local sign-in methods, like anonymous, email/password, and phone authentication. sign_in { allow_duplicate_emails = true anonymous { enabled = true } email { enabled = true password_required = false } phone_number { enabled = true test_phone_numbers = { "+11231231234" = "000000" } } } # Sets an SMS region policy. sms_region_config { allowlist_only { allowed_regions = [ "US", "CA", ] } } # Configures blocking functions. blocking_functions { triggers { event_type = "beforeSignIn" function_uri = "https://us-east1-${google_project.auth.project_id}.cloudfunctions.net/before-sign-in" } forward_inbound_credentials { refresh_token = true access_token = true id_token = true } } # Configures a temporary quota for new signups for anonymous, email/password, and phone number. quota { sign_up_quota_config { quota = 1000 start_time = "" quota_duration = "7200s" } } # Configures authorized domains. authorized_domains = [ "localhost", "${google_project.auth.project_id}.firebaseapp.com", "${google_project.auth.project_id}.web.app", ] # Wait for identitytoolkit.googleapis.com to be enabled before initializing Authentication. depends_on = [ google_project_service.auth, ] } # Creates a Firebase Android App in the new project created above. resource "google_firebase_android_app" "auth" { provider = google-beta project = google_project.auth.project_id display_name = "My Android app" package_name = "android.package.name" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.auth, ] } # Creates a Firebase Apple-platforms App in the new project created above. resource "google_firebase_apple_app" "auth" { provider = google-beta project = google_project.auth.project_id display_name = "My Apple app" bundle_id = "apple.app.12345" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.auth, ] } # Creates a Firebase Web App in the new project created above. resource "google_firebase_web_app" "auth" { provider = google-beta project = google_project.auth.project_id display_name = "My Web app" # The other App types (Android and Apple) use "DELETE" by default. # Web apps don't use "DELETE" by default due to backward-compatibility. deletion_policy = "DELETE" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.auth, ] }
Questa configurazione crea un nuovo progetto Google Cloud, abilita i servizi Firebase per il progetto, effettua 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_override folder_id = "folder-id-for-new-project" name = "Project Display Name" project_id = "project-id-for-new-project" # Required for the project to display in a list of Firebase projects. labels = { "firebase" = "enabled" } } # Enables required APIs. resource "google_project_service" "rtdb" { provider = google-beta.no_user_project_override project = google_project.rtdb.project_id for_each = toset([ "serviceusage.googleapis.com", "cloudresourcemanager.googleapis.com", "firebasedatabase.googleapis.com", ]) service = each.key # Don't disable the service if the resource block is removed by accident. disable_on_destroy = false } # Enables Firebase services for the new project created above. resource "google_firebase_project" "rtdb" { provider = google-beta project = google_project.rtdb.project_id } # Provisions the default Realtime Database default instance. resource "google_firebase_database_instance" "database" { provider = google-beta project = google_project.rtdb.project_id # See available locations: https://firebase.google.com/docs/projects/locations#rtdb-locations region = "name-of-region" # This value will become the first segment of the database's URL. instance_id = "${google_project.rtdb.project_id}-default-rtdb" type = "DEFAULT_DATABASE" # Wait for Firebase to be enabled in the Google Cloud project before initializing Realtime Database. depends_on = [ google_firebase_project.rtdb, ] } # Creates a Firebase Android App in the new project created above. resource "google_firebase_android_app" "rtdb" { provider = google-beta project = google_project.rtdb.project_id display_name = "My Android app" package_name = "android.package.name" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.rtdb, ] } # Creates a Firebase Apple-platforms App in the new project created above. resource "google_firebase_apple_app" "rtdb" { provider = google-beta project = google_project.rtdb.project_id display_name = "My Apple app" bundle_id = "apple.app.12345" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.rtdb, ] } # Creates a Firebase Web App in the new project created above. resource "google_firebase_web_app" "rtdb" { provider = google-beta project = google_project.rtdb.project_id display_name = "My Web app" # The other App types (Android and Apple) use "DELETE" by default. # Web apps don't use "DELETE" by default due to backward-compatibility. deletion_policy = "DELETE" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.rtdb, ] }
Questa configurazione crea un nuovo progetto Google Cloud, associa il progetto a un account di fatturazione Cloud (il piano tariffario Blaze è richiesto per più istanze di Realtime Database), abilita i servizi Firebase per il progetto, effettua il provisioning di più istanze di Realtime Database (incluso il Realtime Database predefinito del progetto istanza) 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_override folder_id = "folder-id-for-new-project" name = "Project Display Name" project_id = "project-id-for-new-project" # Associate the project with a Cloud Billing account # (required for multiple Realtime Database instances). billing_account = "000000-000000-000000" # Required for the project to display in a list of Firebase projects. labels = { "firebase" = "enabled" } } # Enables required APIs. resource "google_project_service" "rtdb-multi" { provider = google-beta.no_user_project_override project = google_project.rtdb-multi.project_id for_each = toset([ "cloudbilling.googleapis.com", "serviceusage.googleapis.com", "cloudresourcemanager.googleapis.com", "firebasedatabase.googleapis.com", ]) service = each.key # Don't disable the service if the resource block is removed by accident. disable_on_destroy = false } # Enables Firebase services for the new project created above. resource "google_firebase_project" "rtdb-multi" { provider = google-beta project = google_project.rtdb-multi.project_id } # Provisions the default Realtime Database default instance. resource "google_firebase_database_instance" "database-default" { provider = google-beta project = google_project.rtdb-multi.project_id # See available locations: https://firebase.google.com/docs/projects/locations#rtdb-locations region = "name-of-region" # This value will become the first segment of the database's URL. instance_id = "${google_project.rtdb-multi.project_id}-default-rtdb" type = "DEFAULT_DATABASE" # Wait for Firebase to be enabled in the Google Cloud project before initializing Realtime Database. depends_on = [ google_firebase_project.rtdb-multi, ] } # Provisions an additional Realtime Database instance. resource "google_firebase_database_instance" "database-additional" { provider = google-beta project = google_project.rtdb-multi.project_id # See available locations: https://firebase.google.com/docs/projects/locations#rtdb-locations # This location doesn't need to be the same as the default database instance. region = "name-of-region" # This value will become the first segment of the database's URL. instance_id = "name-of-additional-database-instance" type = "USER_DATABASE" # Wait for Firebase to be enabled in the Google Cloud project before initializing Realtime Database. depends_on = [ google_firebase_project.rtdb-multi, ] } # Creates a Firebase Android App in the new project created above. resource "google_firebase_android_app" "rtdb-multi" { provider = google-beta project = google_project.rtdb-multi.project_id display_name = "My Android app" package_name = "android.package.name" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.rtdb-multi, ] } # Creates a Firebase Apple-platforms App in the new project created above. resource "google_firebase_apple_app" "rtdb-multi" { provider = google-beta project = google_project.rtdb-multi.project_id display_name = "My Apple app" bundle_id = "apple.app.12345" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.rtdb-multi, ] } # Creates a Firebase Web App in the new project created above. resource "google_firebase_web_app" "rtdb-multi" { provider = google-beta project = google_project.rtdb-multi.project_id display_name = "My Web app" # The other App types (Android and Apple) use "DELETE" by default. # Web apps don't use "DELETE" by default due to backward-compatibility. deletion_policy = "DELETE" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.rtdb-multi, ] }
Questa configurazione crea un nuovo progetto Google Cloud, abilita i servizi Firebase per il progetto, esegue il provisioning dell'istanza Cloud Firestore del progetto e registra tre diversi tipi di app con il progetto.
Fornisce inoltre le regole di sicurezza Firebase per l'istanza Cloud Firestore, crea un indice Cloud Firestore e aggiunge un documento Cloud Firestore con i dati seed.
# Creates a new Google Cloud project. resource "google_project" "firestore" { provider = google-beta.no_user_project_override folder_id = "folder-id-for-new-project" name = "Project Display Name" project_id = "project-id-for-new-project" # Required for the project to display in a list of Firebase projects. labels = { "firebase" = "enabled" } } # Enables required APIs. resource "google_project_service" "firestore" { provider = google-beta.no_user_project_override project = google_project.firestore.project_id for_each = toset([ "cloudresourcemanager.googleapis.com", "serviceusage.googleapis.com", "firestore.googleapis.com", "firebaserules.googleapis.com", ]) service = each.key # Don't disable the service if the resource block is removed by accident. disable_on_destroy = false } # Enables Firebase services for the new project created above. resource "google_firebase_project" "firestore" { provider = google-beta project = google_project.firestore.project_id } # Provisions the Firestore database instance. resource "google_firestore_database" "firestore" { provider = google-beta project = google_project.firestore.project_id name = "(default)" # See available locations: https://firebase.google.com/docs/projects/locations#default-cloud-location location_id = "name-of-region" # "FIRESTORE_NATIVE" is required to use Firestore with Firebase SDKs, authentication, and Firebase Security Rules. type = "FIRESTORE_NATIVE" concurrency_mode = "OPTIMISTIC" # Wait for Firebase to be enabled in the Google Cloud project before initializing Firestore. depends_on = [ google_firebase_project.firestore, ] } # Creates a ruleset of Firestore Security Rules from a local file. resource "google_firebaserules_ruleset" "firestore" { provider = google-beta project = google_project.firestore.project_id source { files { name = "firestore.rules" # Write security rules in a local file named "firestore.rules". # Learn more: https://firebase.google.com/docs/firestore/security/get-started content = file("firestore.rules") } } # Wait for Firestore to be provisioned before creating this ruleset. depends_on = [ google_firestore_database.firestore, ] } # Releases the ruleset for the Firestore instance. resource "google_firebaserules_release" "firestore" { provider = google-beta name = "cloud.firestore" # must be cloud.firestore ruleset_name = google_firebaserules_ruleset.firestore.name project = google_project.firestore.project_id # Wait for Firestore to be provisioned before releasing the ruleset. depends_on = [ google_firestore_database.firestore, ] } # Adds a new Firestore index. resource "google_firestore_index" "indexes" { provider = google-beta project = google_project.firestore.project_id collection = "quiz" query_scope = "COLLECTION" fields { field_path = "question" order = "ASCENDING" } fields { field_path = "answer" order = "ASCENDING" } # Wait for Firestore to be provisioned before adding this index. depends_on = [ google_firestore_database.firestore, ] } # Adds a new Firestore document with seed data. # Don't use real end-user or production data in this seed document. resource "google_firestore_document" "doc" { provider = google-beta project = google_project.firestore.project_id collection = "quiz" document_id = "question-1" fields = "{\"question\":{\"stringValue\":\"Favorite Database\"},\"answer\":{\"stringValue\":\"Firestore\"}}" # Wait for Firestore to be provisioned before adding this document. depends_on = [ google_firestore_database.firestore, ] } # Creates a Firebase Android App in the new project created above. resource "google_firebase_android_app" "firestore" { provider = google-beta project = google_project.firestore.project_id display_name = "My Android app" package_name = "android.package.name" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.firestore, ] } # Creates a Firebase Apple-platforms App in the new project created above. resource "google_firebase_apple_app" "firestore" { provider = google-beta project = google_project.firestore.project_id display_name = "My Apple app" bundle_id = "apple.app.12345" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.firestore, ] } # Creates a Firebase Web App in the new project created above. resource "google_firebase_web_app" "firestore" { provider = google-beta project = google_project.firestore.project_id display_name = "My Web app" # The other App types (Android and Apple) use "DELETE" by default. # Web apps don't use "DELETE" by default due to backward-compatibility. deletion_policy = "DELETE" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.firestore, ] }
Questo è il set di regole delle regole di sicurezza di Cloud Firestore che dovrebbe trovarsi in un file locale denominato firestore.rules
.
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { allow read: if request.auth != null; allow create: if request.auth != null; allow update: if request.auth != null; } }
Questa configurazione crea un nuovo progetto Google Cloud, abilita i servizi Firebase per il progetto, effettua il provisioning del bucket Cloud Storage predefinito del progetto e registra tre diversi tipi di app con il progetto.
Fornisce inoltre le regole di sicurezza Firebase per il bucket Cloud Storage e carica un file nel bucket.
# Creates a new Google Cloud project. resource "google_project" "storage" { provider = google-beta.no_user_project_override folder_id = "folder-id-for-new-project" name = "Project Display Name" project_id = "project-id-for-new-project" # Required for the project to display in a list of Firebase projects. labels = { "firebase" = "enabled" } } # Enables required APIs. resource "google_project_service" "storage" { provider = google-beta.no_user_project_override project = google_project.storage.project_id for_each = toset([ "serviceusage.googleapis.com", "cloudresourcemanager.googleapis.com", "firebaserules.googleapis.com", "firebasestorage.googleapis.com", "storage.googleapis.com", ]) service = each.key # Don't disable the service if the resource block is removed by accident. disable_on_destroy = false } # Enables Firebase services for the new project created above. resource "google_firebase_project" "storage" { provider = google-beta project = google_project.storage.project_id } # Provisions the default Cloud Storage bucket for the project via Google App Engine. resource "google_app_engine_application" "default" { provider = google-beta project = google_project.storage.project_id # See available locations: https://firebase.google.com/docs/projects/locations#default-cloud-location # This will set the location for the default Storage bucket and the App Engine App. location_id = "name-of-region-for-default-bucket" # If you use Firestore, uncomment this to make sure Firestore is provisioned first. # depends_on = [ # google_firestore_database.firestore # ] } # Makes the default Storage bucket accessible for Firebase SDKs, authentication, and Firebase Security Rules. resource "google_firebase_storage_bucket" "default-bucket" { provider = google-beta project = google_project.storage.project_id bucket_id = google_app_engine_application.default.default_bucket } # Creates a ruleset of Cloud Storage Security Rules from a local file. resource "google_firebaserules_ruleset" "storage" { provider = google-beta project = google_project.storage.project_id source { files { # Write security rules in a local file named "storage.rules". # Learn more: https://firebase.google.com/docs/storage/security/get-started name = "storage.rules" content = file("storage.rules") } } # Wait for the default Storage bucket to be provisioned before creating this ruleset. depends_on = [ google_firebase_project.storage, ] } # Releases the ruleset to the default Storage bucket. resource "google_firebaserules_release" "default-bucket" { provider = google-beta name = "firebase.storage/${google_app_engine_application.default.default_bucket}" ruleset_name = "projects/${google_project.storage.project_id}/rulesets/${google_firebaserules_ruleset.storage.name}" project = google_project.storage.project_id } # Uploads a new file to the default Storage bucket. # Don't use real end-user or production data in this file. resource "google_storage_bucket_object" "cat-picture" { provider = google-beta name = "cat.png" source = "path/to/cat.png" bucket = google_app_engine_application.default.default_bucket } # Creates a Firebase Android App in the new project created above. resource "google_firebase_android_app" "storage" { provider = google-beta project = google_project.storage.project_id display_name = "My Android app" package_name = "android.package.name" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.storage, ] } # Creates a Firebase Apple-platforms App in the new project created above. resource "google_firebase_apple_app" "storage" { provider = google-beta project = google_project.storage.project_id display_name = "My Apple app" bundle_id = "apple.app.12345" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.storage, ] } # Creates a Firebase Web App in the new project created above. resource "google_firebase_web_app" "storage" { provider = google-beta project = google_project.storage.project_id display_name = "My Web app" # The other App types (Android and Apple) use "DELETE" by default. # Web apps don't use "DELETE" by default due to backward-compatibility. deletion_policy = "DELETE" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.storage, ] }
Questo è il set di regole di sicurezza di Cloud Storage che dovrebbe trovarsi in un file locale denominato storage.rules
.
rules_version = '2'; service firebase.storage { match /b/{bucket}/o { match /{allPaths=**} { allow read, write: if request.auth != null; } } }
Questa configurazione crea un nuovo progetto Google Cloud, associa il progetto a un account di fatturazione Cloud (il piano tariffario Blaze è richiesto per più bucket), abilita i servizi Firebase per il progetto, effettua il provisioning di più bucket Cloud Storage (incluso il bucket Cloud Storage predefinito del progetto) e registra tre diversi tipi di app con il progetto.
Fornisce inoltre le regole di sicurezza Firebase per i bucket Cloud Storage e carica un file nel bucket Cloud Storage predefinito.
# Creates a new Google Cloud project. resource "google_project" "storage-multi" { provider = google-beta.no_user_project_override folder_id = "folder-id-for-new-project" name = "Project Display Name" project_id = "project-id-for-new-project" # Associates the project with a Cloud Billing account # (required for multiple Cloud Storage buckets). billing_account = "000000-000000-000000" # Required for the project to display in a list of Firebase projects. labels = { "firebase" = "enabled" } } # Enables required APIs. resource "google_project_service" "storage-multi" { provider = google-beta.no_user_project_override project = google_project.storage-multi.project_id for_each = toset([ "cloudbilling.googleapis.com", "serviceusage.googleapis.com", "cloudresourcemanager.googleapis.com", "firebaserules.googleapis.com", "firebasestorage.googleapis.com", "storage.googleapis.com", ]) service = each.key # Don't disable the service if the resource block is removed by accident. disable_on_destroy = false } # Enables Firebase services for the new project created above. resource "google_firebase_project" "storage-multi" { provider = google-beta project = google_project.storage-multi.project_id } # Provisions the default Cloud Storage bucket for the project via Google App Engine. resource "google_app_engine_application" "default-multi" { provider = google-beta project = google_project.storage-multi.project_id # See available locations: https://firebase.google.com/docs/projects/locations#default-cloud-location # This will set the location for the default Storage bucket and the App Engine App. location_id = "name-of-region-for-default-bucket" # If you use Firestore, uncomment this to make sure Firestore is provisioned first. # depends_on = [ # google_firestore_database.firestore # ] } # Provisions an additional Cloud Storage bucket. # Additional Cloud Storage buckets are not provisioned via App Engine. resource "google_storage_bucket" "bucket-multi" { provider = google-beta project = google_project.storage-multi.project_id name = "name-of-additional-storage-bucket" # See available locations: https://cloud.google.com/storage/docs/locations#available-locations # This location does not need to be the same as the default Storage bucket. location = "name-of-region-for-additional-bucket" } # Makes the default Storage bucket accessible for Firebase SDKs, authentication, and Firebase Security Rules. resource "google_firebase_storage_bucket" "default-bucket-multi" { provider = google-beta project = google_project.storage-multi.project_id bucket_id = google_app_engine_application.default-multi.default_bucket } # Makes the additional Storage bucket accessible for Firebase SDKs, authentication, and Firebase Security Rules. resource "google_firebase_storage_bucket" "bucket-multi" { provider = google-beta project = google_project.storage-multi.project_id bucket_id = google_storage_bucket.bucket-multi.name } # Creates a ruleset of Firebase Security Rules from a local file. resource "google_firebaserules_ruleset" "storage-multi" { provider = google-beta project = google_project.storage-multi.project_id source { files { # Write security rules in a local file named "storage.rules" # Learn more: https://firebase.google.com/docs/storage/security/get-started name = "storage.rules" content = file("storage.rules") } } # Wait for the Storage buckets to be provisioned before creating this ruleset. depends_on = [ google_firebase_project.storage-multi, ] } # Releases the ruleset to the default Storage bucket. resource "google_firebaserules_release" "default-bucket-multi" { provider = google-beta name = "firebase.storage/${google_app_engine_application.default-multi.default_bucket}" ruleset_name = "projects/${google_project.storage-multi.project_id}/rulesets/${google_firebaserules_ruleset.storage-multi.name}" project = google_project.storage-multi.project_id } # Releases the ruleset to the additional Storage bucket. resource "google_firebaserules_release" "bucket-multi" { provider = google-beta name = "firebase.storage/${google_storage_bucket.bucket-multi.name}" ruleset_name = "projects/${google_project.storage-multi.project_id}/rulesets/${google_firebaserules_ruleset.storage-multi.name}" project = google_project.storage-multi.project_id } # Uploads a new file to the default Storage bucket. # Do not use real end-user or production data in this file. resource "google_storage_bucket_object" "cat-picture-multi" { provider = google-beta name = "cat.png" source = "path/to/cat.png" bucket = google_app_engine_application.default-multi.default_bucket } # Creates a Firebase Android App in the new project created above. resource "google_firebase_android_app" "storage-multi" { provider = google-beta project = google_project.storage-multi.project_id display_name = "My Android app" package_name = "android.package.name" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.storage-multi, ] } # Creates a Firebase Apple-platforms App in the new project created above. resource "google_firebase_apple_app" "storage-multi" { provider = google-beta project = google_project.storage-multi.project_id display_name = "My Apple app" bundle_id = "apple.app.12345" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.storage-multi, ] } # Creates a Firebase Web App in the new project created above. resource "google_firebase_web_app" "storage-multi" { provider = google-beta project = google_project.storage-multi.project_id display_name = "My Web app" # The other App types (Android and Apple) use "DELETE" by default. # Web apps don't use "DELETE" by default due to backward-compatibility. deletion_policy = "DELETE" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.storage-multi, ] }
Questo è il set di regole di sicurezza di Cloud Storage che dovrebbe trovarsi in un file locale denominato storage.rules
.
rules_version = '2'; service firebase.storage { match /b/{bucket}/o { match /{allPaths=**} { allow read, write: if request.auth != null; } } }
Questa configurazione crea un nuovo progetto Google Cloud, abilita i servizi Firebase per il progetto, esegue il provisioning dell'istanza Cloud Firestore e quindi effettua il provisioning del bucket Cloud Storage predefinito.
Fornisce inoltre le regole di sicurezza Firebase per l'istanza Cloud Firestore e il bucket Cloud Storage predefinito.
# Creates a new Google Cloud project. resource "google_project" "fs" { # fs = Firestore + Storage provider = google-beta.no_user_project_override folder_id = "folder-id-for-new-project" name = "Project Display Name" project_id = "project-id-for-new-project" # Required for the project to display in a list of Firebase projects. labels = { "firebase" = "enabled" } } # Enables required APIs. resource "google_project_service" "fs" { provider = google-beta.no_user_project_override project = google_project.fs.project_id for_each = toset([ "serviceusage.googleapis.com", "cloudresourcemanager.googleapis.com", "firebaserules.googleapis.com", "firebasestorage.googleapis.com", "storage.googleapis.com", "firestore.googleapis.com", ]) service = each.key # Don't disable the service if the resource block is removed by accident disable_on_destroy = false } # Enables Firebase services for the new project created above. resource "google_firebase_project" "fs" { provider = google-beta project = google_project.fs.project_id } #### Set up Firestore before default Cloud Storage bucket #### # Provisions the Firestore database instance. resource "google_firestore_database" "firestore-fs" { provider = google-beta project = google_project.fs.project_id name = "(default)" # See available locations: https://firebase.google.com/docs/projects/locations#default-cloud-location location_id = "name-of-region" # "FIRESTORE_NATIVE" is required to use Firestore with Firebase SDKs, authentication, and Firebase Security Rules. type = "FIRESTORE_NATIVE" concurrency_mode = "OPTIMISTIC" # Wait for Firebase to be enabled in the Google Cloud project before initializing Firestore. depends_on = [ google_firebase_project.fs, ] } # Creates a ruleset of Firestore Security Rules from a local file. resource "google_firebaserules_ruleset" "firestore-fs" { provider = google-beta project = google_project.fs.project_id source { files { # Write security rules in a local file named "firestore.rules". # Learn more: https://firebase.google.com/docs/firestore/security/get-started name = "firestore.rules" content = file("firestore.rules") } } # Wait for Firestore to be provisioned before creating this ruleset. depends_on = [ google_firestore_database.firestore-fs ] } # Releases the ruleset for the Firestore instance. resource "google_firebaserules_release" "firestore-fs" { provider = google-beta name = "cloud.firestore" # must be cloud.firestore ruleset_name = google_firebaserules_ruleset.firestore-fs.name project = google_project.fs.project_id # Wait for Firestore to be provisioned before releasing the ruleset. depends_on = [ google_firestore_database.firestore-fs, ] } #### Set up default Cloud Storage default bucket after Firestore #### # Provisions the default Cloud Storage bucket for the project via Google App Engine. resource "google_app_engine_application" "default-bucket-fs" { provider = google-beta project = google_project.fs.project_id # See available locations: https://firebase.google.com/docs/projects/locations#default-cloud-location # This will set the location for the default Storage bucket and the App Engine App. location_id = "name-of-region" # Must be in the same location as Firestore (above) # Wait for Firestore to be provisioned first. # Otherwise, the Firestore instance will be provisioned in Datastore mode (unusable by Firebase). depends_on = [ google_firestore_database.firestore-fs, ] } # Makes the default Storage bucket accessible for Firebase SDKs, authentication, and Firebase Security Rules. resource "google_firebase_storage_bucket" "default-bucket-fs" { provider = google-beta project = google_project.fs.project_id bucket_id = google_app_engine_application.default-bucket-fs.default_bucket } # Creates a ruleset of Cloud Storage Security Rules from a local file. resource "google_firebaserules_ruleset" "default-bucket-fs" { provider = google-beta project = google_project.fs.project_id source { files { # Write security rules in a local file named "storage.rules". # Learn more: https://firebase.google.com/docs/storage/security/get-started name = "storage.rules" content = file("storage.rules") } } # Wait for the Cloud Storage bucket to be provisioned before creating this ruleset. depends_on = [ google_firebase_project.fs, ] } # Releases the ruleset to the default Storage bucket. resource "google_firebaserules_release" "default-bucket-fs" { provider = google-beta name = "firebase.storage/${google_app_engine_application.default-bucket-fs.default_bucket}" ruleset_name = "projects/${google_project.fs.project_id}/rulesets/${google_firebaserules_ruleset.default-bucket-fs.name}" project = google_project.fs.project_id }
Questo è il set di regole delle regole di sicurezza di Cloud Firestore che dovrebbe trovarsi in un file locale denominato firestore.rules
.
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { allow read: if request.auth != null; allow create: if request.auth != null; allow update: if request.auth != null; } }
Questo è il set di regole di sicurezza di Cloud Storage che dovrebbe trovarsi in un file locale denominato storage.rules
.
rules_version = '2'; service firebase.storage { match /b/{bucket}/o { match /{allPaths=**} { allow read, write: if request.auth != null; } } }
Questa configurazione crea un nuovo progetto Google Cloud, abilita i servizi Firebase per il progetto e configura e abilita l'applicazione di Firebase App Check per Cloud Firestore in modo che sia possibile accedervi solo dalla tua app Android.
# Creates a new Google Cloud project. resource "google_project" "appcheck" { provider = google-beta.no_user_project_override folder_id = "folder-id-for-new-project" name = "Project Display Name" project_id = "project-id-for-new-project" # Required for the project to display in a list of Firebase projects. labels = { "firebase" = "enabled" } } # Enables required APIs. resource "google_project_service" "services" { provider = google-beta.no_user_project_override project = google_project.appcheck.project_id for_each = toset([ "cloudresourcemanager.googleapis.com", "firebase.googleapis.com", "firebaseappcheck.googleapis.com", "firestore.googleapis.com", "serviceusage.googleapis.com", ]) service = each.key # Don't disable the service if the resource block is removed by accident. disable_on_destroy = false } # Enables Firebase services for the new project created earlier. resource "google_firebase_project" "appcheck" { provider = google-beta project = google_project.appcheck.project_id depends_on = [google_project_service.services] } # Provisions the Firestore database instance. resource "google_firestore_database" "database" { provider = google-beta project = google_firebase_project.appcheck.project name = "(default)" # See available locations: https://firebase.google.com/docs/projects/locations#default-cloud-location location_id = "name-of-region" # "FIRESTORE_NATIVE" is required to use Firestore with Firebase SDKs, authentication, and Firebase Security Rules. type = "FIRESTORE_NATIVE" concurrency_mode = "OPTIMISTIC" # Wait for Firebase to be enabled in the Google Cloud project before initializing Firestore. depends_on = [ google_firebase_project.appcheck, ] } # Creates a Firebase Android App in the new project created earlier. resource "google_firebase_android_app" "appcheck" { provider = google-beta project = google_firebase_project.appcheck.project display_name = "Play Integrity app" package_name = "package.name.playintegrity" sha256_hashes = [ # TODO: insert your Android app's SHA256 certificate ] } # It takes a while for App Check to recognize the new app # If your app already exists, you don't have to wait 30 seconds. resource "time_sleep" "wait_30s" { depends_on = [google_firebase_android_app.appcheck] create_duration = "30s" } # Register the Android app with the Play Integrity provider resource "google_firebase_app_check_play_integrity_config" "appcheck" { provider = google-beta project = google_firebase_project.appcheck.project app_id = google_firebase_android_app.appcheck.app_id depends_on = [time_sleep.wait_30s, google_firestore_database.database] lifecycle { precondition { condition = length(google_firebase_android_app.appcheck.sha256_hashes) > 0 error_message = "Provide a SHA-256 certificate on the Android App to use App Check" } } } # Enable enforcement of App Check for Firestore resource "google_firebase_app_check_service_config" "firestore" { provider = google-beta project = google_firebase_project.appcheck.project service_id = "firestore.googleapis.com" depends_on = [google_project_service.services] }
Questa configurazione crea un nuovo progetto Google Cloud, abilita i servizi Firebase per il progetto e installa una nuova istanza di un'estensione Firebase nel progetto. Se l'istanza esiste già, i suoi parametri vengono aggiornati in base ai valori forniti nel file config.
# Creates a new Google Cloud project. resource "google_project" "extensions" { provider = google-beta.no_user_project_override folder_id = "folder-id-for-new-project" name = "Project Display Name" project_id = "project-id-for-new-project" # Associates the project with a Cloud Billing account # (required to use Firebase Extensions). billing_account = "000000-000000-000000" # Required for the project to display in a list of Firebase projects. labels = { "firebase" = "enabled" } } # Enables required APIs. resource "google_project_service" "extensions" { provider = google-beta.no_user_project_override project = google_project.extensions.project_id for_each = toset([ "cloudbilling.googleapis.com", "cloudresourcemanager.googleapis.com", "serviceusage.googleapis.com", "firebase.googleapis.com", "firebaseextensions.googleapis.com", ]) service = each.key # Don't disable the service if the resource block is removed by accident. disable_on_destroy = false } # Enables Firebase services for the new project created above. resource "google_firebase_project" "extensions" { provider = google-beta project = google_project.extensions.project_id depends_on = [ google_project_service.extensions, ] } # Installs an instance of the "Translate Text in Firestore" extension. # Or updates the extension if the specified instance already exists. resource "google_firebase_extensions_instance" "translation" { provider = google-beta project = google_project.extensions.project_id instance_id = "translate-text-in-firestore" config { extension_ref = "firebase/firestore-translate-text" params = { COLLECTION_PATH = "posts/comments/translations" DO_BACKFILL = true LANGUAGES = "ar,en,es,de,fr" INPUT_FIELD_NAME = "input" LANGUAGES_FIELD_NAME = "languages" OUTPUT_FIELD_NAME = "translated" } system_params = { "firebaseextensions.v1beta.function/location" = "us-central1" "firebaseextensions.v1beta.function/memory" = "256" "firebaseextensions.v1beta.function/minInstances" = "0" "firebaseextensions.v1beta.function/vpcConnectorEgressSettings" = "VPC_CONNECTOR_EGRESS_SETTINGS_UNSPECIFIED" } } }
Risoluzione dei problemi e domande frequenti
Questa guida utilizza i seguenti attributi Terraform quando si lavora con i "progetti".
-
project
all'interno di un bloccoresource
Consigliato: quando possibile, includere l'attributo
project
all'interno di ciascun bloccoresource
Includendo un attributo di progetto, Terraform creerà l'infrastruttura specificata nel blocco di risorse 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 sul
project
.-
user_project_override
all'interno del bloccoprovider
Per il provisioning della maggior parte delle risorse, dovresti utilizzare
user_project_override = true
, il che significa verificare la quota rispetto al tuo progetto Firebase. Tuttavia, per configurare il tuo nuovo progetto in modo che possa accettare i controlli delle quote, devi prima utilizzareuser_project_override = false
.Consulta la documentazione ufficiale di Terraform su
user_project_override
.
Assicurati che l'account utente che stai utilizzando per eseguire i comandi della CLI di gCloud abbia accettato i Termini di servizio di Firebase (Firebase ToS).
Puoi eseguire questo controllo utilizzando un browser connesso all'account utente e provando a visualizzare un progetto Firebase esistente nella console Firebase . Se riesci a visualizzare un progetto Firebase esistente, l'account utente ha accettato i ToS Firebase.
Se non riesci a visualizzare alcun progetto Firebase esistente, probabilmente l'account utente non ha accettato i ToS Firebase. Per risolvere questo problema, crea un nuovo progetto Firebase tramite la console Firebase e accetta i ToS Firebase come parte della creazione del progetto. Puoi eliminare immediatamente questo progetto tramite Impostazioni progetto nella console.
Attendi qualche minuto, quindi prova a eseguire nuovamente terraform apply
.
Ciò potrebbe essere dovuto a un ritardo di propagazione in vari sistemi. Prova a risolvere questo problema importando la risorsa nello stato Terraform eseguendo terraform import
. Quindi prova a eseguire nuovamente terraform apply
.
Puoi scoprire come importare ciascuna risorsa nella sezione "Importa" della relativa documentazione Terraform (ad esempio, la documentazione "Importa" per Cloud Firestore ).
Come suggerisce l'errore, Terraform potrebbe provare a fornire più indici e/o creare un documento contemporaneamente e si è verificato un errore di concorrenza. Prova a eseguire nuovamente terraform apply
.
Questo errore significa che Terraform non sa con quale progetto verificare 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
(nessun alias), che negli esempi Firebase ègoogle-beta
.
Ecco i possibili motivi per cui l'ID progetto potrebbe già esistere:
Il progetto associato a quell'ID appartiene a qualcun altro.
- Per risolvere: scegli un altro ID progetto.
Il progetto associato a tale ID è stato eliminato di recente (in stato di eliminazione temporanea).
- Per risolvere: se ritieni che il progetto associato all'ID appartenga a te, controlla lo stato del progetto utilizzando l' API REST
projects.get
.
- Per risolvere: se ritieni che il progetto associato all'ID appartenga a te, controlla lo stato del progetto utilizzando l' API REST
Il progetto associato a tale ID esiste correttamente sotto l'utente corrente. Una possibile causa dell'errore potrebbe essere l'interruzione di una precedente
terraform apply
.- Per risolvere: eseguire i seguenti comandi:
terraform import google_project.default PROJECT_ID
poi
terraform import google_firebase_project.default PROJECT_ID
- Per risolvere: eseguire i seguenti comandi:
Un'applicazione App Engine richiede un'istanza Cloud Firestore, ma puoi avere solo un'istanza Cloud Firestore per progetto. Pertanto, come suggerisce il messaggio di errore, se hai già eseguito il provisioning dell'istanza Cloud Firestore del progetto in una posizione, App Engine genererà un errore se provi a eseguire il provisioning di un'istanza Cloud Firestore in una posizione diversa. App Engine ritiene che tu stia tentando di "rieseguire il provisioning" dell'istanza Cloud Firestore già esistente.
Per risolvere questo errore, utilizza la stessa posizione sia per Cloud Firestore che per l'applicazione App Engine. Se hai bisogno di un bucket Cloud Storage in una posizione diversa da Cloud Firestore, puoi eseguire il provisioning di bucket aggiuntivi (vedi la configurazione di esempio per la creazione di più bucket Cloud Storage ).
Quando esegui il provisioning del bucket Cloud Storage predefinito di un progetto (tramite google_app_engine_application
) e il progetto non dispone ancora di un'istanza Cloud Firestore, google_app_engine_application
effettua automaticamente il provisioning dell'istanza Cloud Firestore del progetto.
Pertanto, se è già stato eseguito il provisioning dell'istanza Cloud Firestore del tuo progetto, google_firestore_database
genererà un errore se provi a eseguire il provisioning esplicito di un'istanza Cloud Firestore.
Una volta effettuato il provisioning dell'istanza Cloud Firestore del progetto, non è possibile "rieseguirne il provisioning" o modificarne la posizione. Per evitare che si verifichi l'errore, rimuovi il blocco di risorse google_firestore_database
dal file di configurazione. Tieni presente, tuttavia, che consigliamo di eseguire il provisioning di Cloud Firestore prima del bucket Cloud Storage predefinito del progetto (per il motivo, consulta la sezione seguente).