Firebase beginnt, Terraform zu unterstützen. Wenn Sie zu einem Team gehören, das die Erstellung von Firebase-Projekten mit der Bereitstellung bestimmter Ressourcen und aktivierten Diensten automatisieren und standardisieren möchte, dann kann die Verwendung von Terraform mit Firebase eine gute Lösung für Sie sein.
Der grundlegende Arbeitsablauf für die Verwendung von Terraform mit Firebase umfasst Folgendes:
Erstellen und Anpassen einer Terraform-Konfigurationsdatei (einer
.tf
Datei), die die Infrastruktur angibt, die Sie bereitstellen möchten (d. h. Ressourcen, die Sie bereitstellen möchten, und die Dienste, die Sie aktivieren möchten).Verwendung von gCloud-CLI-Befehlen, die mit Terraform verbunden sind, um die in der
.tf
Datei angegebene Infrastruktur bereitzustellen.
Was können Sie mit Terraform und Firebase machen?
Der beispielhafte allgemeine Arbeitsablauf in dieser Anleitung ist das Erstellen eines neuen Firebase-Projekts mit einer Android-App. Aber Sie können mit Terraform noch viel mehr tun, wie zum Beispiel:
Löschen und ändern Sie die vorhandene Infrastruktur mit Terraform.
Verwalten Sie produktspezifische Konfigurationen und Aufgaben mit Terraform, wie zum Beispiel:
- Anmeldeanbieter für die Firebase-Authentifizierung aktivieren.
- Erstellen Sie Cloud Storage-Buckets oder Datenbankinstanzen und stellen Sie Firebase-Sicherheitsregeln für diese bereit.
Sie können Standard-Terraform-Konfigurationsdateien und -Befehle verwenden, um alle diese Aufgaben auszuführen. Und um Ihnen dabei zu helfen, haben wir Beispiel-Terraform-Konfigurationsdateien für mehrere gängige Anwendungsfälle bereitgestellt.
Allgemeiner Workflow für die Verwendung von Terraform mit Firebase
Voraussetzungen
Dieser Leitfaden ist eine Einführung in die Verwendung von Terraform mit Firebase und setzt daher grundlegende Kenntnisse im Umgang mit Terraform voraus. Stellen Sie sicher, dass Sie die folgenden Voraussetzungen erfüllt haben, bevor Sie diesen Workflow starten.
Installieren Sie Terraform und machen Sie sich mithilfe der offiziellen Tutorials mit Terraform vertraut.
Installieren Sie die Google Cloud CLI (gCloud CLI). Melden Sie sich mit einem Benutzerkonto oder einem Dienstkonto an.
- Wenn Sie ein Benutzerkonto verwenden, müssen Sie die Firebase-Nutzungsbedingungen (Firebase ToS) akzeptiert haben. Sie haben die Firebase-Nutzungsbedingungen akzeptiert, wenn Sie ein Firebase-Projekt in der Firebase-Konsole anzeigen können
- Damit Terraform bestimmte Aktionen ausführen kann (z. B. Projekte erstellen), muss Folgendes zutreffen:
- Der Benutzer oder das Dienstkonto muss über den entsprechenden IAM-Zugriff für diese Aktionen verfügen.
- Wenn das Benutzer- oder Dienstkonto Teil einer Google Cloud-Organisation ist, müssen die Organisationsrichtlinien dem Konto erlauben, diese Aktionen auszuführen.
Schritt 1: Erstellen und passen Sie eine Terraform-Konfigurationsdatei an
Eine Terraform-Konfigurationsdatei benötigt zwei Hauptabschnitte (die im Folgenden ausführlich beschrieben werden):
- Ein
provider
-Setup-Abschnitt, der vorgibt, auf welche Terraform-Ressourcen zugegriffen werden kann - Ein Abschnitt einzelner
resource
, der angibt, welche Infrastruktur erstellt werden soll
Richten Sie Ihren provider
ein
Unabhängig davon, um welche Firebase-Produkte oder -Dienste es sich handelt, ist eine provider
erforderlich.
Erstellen Sie eine Terraform-Konfigurationsdatei (wie die Datei
main.tf
) in Ihrem lokalen Verzeichnis.In dieser Anleitung verwenden Sie diese Konfigurationsdatei, um sowohl die
provider
als auch die gesamte Infrastruktur anzugeben, die Terraform erstellen soll. Beachten Sie jedoch, dass Sie Optionen zum Einbinden des Anbieter-Setups haben.Sie haben die folgenden Optionen, um ein
provider
Setup in den Rest Ihrer Terraform-Konfiguration einzubinden:Option 1: Fügen Sie es oben in eine einzelne Terraform
.tf
Konfigurationsdatei ein (wie in dieser Anleitung gezeigt).- Verwenden Sie diese Option, wenn Sie gerade erst mit Terraform beginnen oder Terraform mit Firebase ausprobieren.
Option 2: Fügen Sie es in eine separate
.tf
Datei (z. B. eineprovider.tf
Datei) ein, abgesehen von der.tf
Datei, in der Sie die zu erstellende Infrastruktur angeben (z. B. einemain.tf
Datei).- Verwenden Sie diese Option, wenn Sie Teil eines größeren Teams sind, das die Einrichtung standardisieren muss.
- Beim Ausführen von Terraform-Befehlen müssen sich sowohl die Datei
provider.tf
als auch die Dateimain.tf
im selben Verzeichnis befinden.
Fügen Sie das folgende
provider
Setup oben in die Dateimain.tf
ein.Sie müssen den
google-beta
Anbieter verwenden, da es sich um eine Betaversion der Verwendung von Firebase mit Terraform handelt. Bei der Verwendung in der Produktion ist Vorsicht geboten.# 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 }
Erfahren Sie mehr über die verschiedenen Arten von projektbezogenen Attributen (einschließlich dessen, was in diesem Handbuch als „Kontingentprüfungsprojekt“ bezeichnet wird) bei der Verwendung von Terraform mit Firebase.
Fahren Sie mit dem nächsten Abschnitt fort, um Ihre Konfigurationsdatei zu vervollständigen und anzugeben, welche Infrastruktur erstellt werden soll.
Geben Sie an, welche Infrastruktur mithilfe von resource
erstellt werden soll
In Ihrer Terraform-Konfigurationsdatei (für dieses Handbuch Ihre main.tf
Datei) müssen Sie die gesamte Infrastruktur angeben, die Terraform erstellen soll (d. h. alle Ressourcen, die Sie bereitstellen möchten, und alle Dienste, die Sie aktivieren möchten). In diesem Leitfaden finden Sie eine vollständige Liste aller Firebase-Ressourcen, die Terraform unterstützen .
Öffnen Sie Ihre
main.tf
Datei.Fügen Sie im
provider
Setup die folgende Konfiguration vonresource
ein.In diesem einfachen Beispiel wird ein neues Firebase-Projekt erstellt und dann innerhalb dieses Projekts eine Firebase-Android-App erstellt.
# 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, ] }
Wenn Sie mit der Infrastruktur von Projekten und Apps als Ressourcen nicht vertraut sind, lesen Sie die folgende Dokumentation:
- Firebase-Projekte verstehen
- Referenzdokumentation für das Firebase-Projektmanagement
# 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, ] }
Schritt 2: Führen Sie Terraform-Befehle aus, um die angegebene Infrastruktur zu erstellen
Um die Ressourcen bereitzustellen und die in Ihrer main.tf
Datei angegebenen Dienste zu aktivieren, führen Sie die folgenden Befehle aus demselben Verzeichnis wie Ihre main.tf
Datei aus. Ausführliche Informationen zu diesen Befehlen finden Sie in der Terraform-Dokumentation .
Wenn Sie zum ersten Mal Terraform-Befehle im Verzeichnis ausführen, müssen Sie das Konfigurationsverzeichnis initialisieren und den Google Terraform-Anbieter installieren. Führen Sie dazu den folgenden Befehl aus:
terraform init
Erstellen Sie die in Ihrer
main.tf
Datei angegebene Infrastruktur, indem Sie den folgenden Befehl ausführen:terraform apply
Bestätigen Sie, dass alles wie erwartet bereitgestellt oder aktiviert wurde:
Option 1: Sehen Sie sich die in Ihrem Terminal gedruckte Konfiguration an, indem Sie den folgenden Befehl ausführen:
terraform show
Option 2: Sehen Sie sich Ihr Firebase-Projekt in der Firebase-Konsole an.
Firebase-Ressourcen mit Terraform-Unterstützung
Die folgenden Firebase- und Google-Ressourcen bieten Terraform-Unterstützung. Und wir fügen ständig weitere Ressourcen hinzu! Wenn Sie also die Ressource, die Sie mit Terraform verwalten möchten, nicht sehen, schauen Sie bald noch einmal nach, ob sie verfügbar ist, oder fordern Sie sie an, indem Sie ein Problem im GitHub-Repo einreichen .
Firebase-Projekt- und App-Management
google_firebase_project
– Firebase-Dienste für ein vorhandenes Google Cloud-Projekt aktivierengoogle_firebase_project_location
– Legen Sie den Speicherort für die standardmäßigen Google Cloud-Ressourcen des Projekts festFirebase-Apps
-
google_firebase_apple_app
– Erstellen oder verwalten Sie eine Firebase-App für Apple-Plattformen -
google_firebase_android_app
– Erstellen oder verwalten Sie eine Firebase-Android-App -
google_firebase_web_app
– eine Firebase-Web-App erstellen oder verwalten
-
Firebase-Authentifizierung
google_identity_platform_config
– aktiviert Google Cloud Identity Platform (GCIP) (das Backend für die Firebase-Authentifizierung) und stellt Authentifizierungseinstellungen auf Projektebene bereitFür die Konfiguration der Firebase-Authentifizierung über Terraform ist die Aktivierung von GCIP erforderlich. Sehen Sie sich unbedingt die
.tf
Beispieldatei an, um zu erfahren, wie Sie die Firebase-Authentifizierung einrichten .Das Projekt, in dem Terraform GCIP und/oder Firebase-Authentifizierung aktiviert, muss im Blaze-Preisplan enthalten sein (d. h. das Projekt muss über ein zugehöriges Cloud-Rechnungskonto verfügen). Sie können dies programmgesteuert tun, indem Sie das Attribut
billing_account
in der Ressourcegoogle_project
festlegen.Diese Ressource ermöglicht auch weitere Konfigurationen, wie z. B. lokale Anmeldemethoden wie anonym, E-Mail/Passwort und Telefonauthentifizierung sowie Blockierungsfunktionen und autorisierte Domänen.
google_identity_platform_default_supported_idp_config
– Konfigurieren Sie gängige föderierte Identitätsanbieter wie Google, Facebook oder Appleidentity_platform_oauth_idp_config
– Konfigurieren Sie beliebige OAuth Identity Provider (IdP)-Quellengoogle_identity_platform_inbound_saml_config
– SAML-Integrationen konfigurieren
Noch nicht unterstützt:
- Konfigurieren der Multi-Faktor-Authentifizierung (MFA) über Terraform
Firebase-Echtzeitdatenbank
-
google_firebase_database_instance
– Erstellen Sie eine Echtzeitdatenbankinstanz
Noch nicht unterstützt:
- Bereitstellen von Firebase-Echtzeitdatenbank-Sicherheitsregeln über Terraform (erfahren Sie, wie Sie diese Regeln mit anderen Tools, einschließlich Programmoptionen, bereitstellen )
Cloud Firestore
google_firestore_database
– Erstellen Sie eine Cloud Firestore-Instanzgoogle_firestore_index
– Ermöglicht effiziente Abfragen für Cloud Firestoregoogle_firestore_document
– Seed einer Cloud Firestore-Instanz mit einem bestimmten Dokument in einer SammlungWichtig: Verwenden Sie in diesem Seed-Dokument keine echten Endbenutzer- oder Produktionsdaten.
Cloud-Speicher für Firebase
google_firebase_storage_bucket
– Machen Sie einen vorhandenen Cloud Storage-Bucket für Firebase SDKs, Authentifizierung und Firebase-Sicherheitsregeln zugänglich- Um einen Standard-Cloud-Storage-Bucket für ein Firebase-Projekt einzurichten, muss zunächst
google_app_engine_application
bereitgestellt werden. Sehen Sie sich unbedingt die.tf
Beispieldatei an, um zu erfahren, wie Sie Cloud Storage-Buckets bereitstellen .
- Um einen Standard-Cloud-Storage-Bucket für ein Firebase-Projekt einzurichten, muss zunächst
google_storage_bucket_object
– Fügen Sie ein Objekt zu einem Cloud Storage-Bucket hinzuWichtig: Verwenden Sie in dieser Datei keine echten Endbenutzer- oder Produktionsdaten.
Firebase-Sicherheitsregeln (für Cloud Firestore und Cloud Storage)
Beachten Sie, dass die Firebase-Echtzeitdatenbank ein anderes Bereitstellungssystem für ihre Firebase-Sicherheitsregeln verwendet.
google_firebaserules_ruleset
– Definieren Sie Firebase-Sicherheitsregeln, die für die Cloud Firestore-Instanz oder einen Cloud Storage-Bucket geltengoogle_firebaserules_release
– Stellen Sie bestimmte Regelsätze in der Cloud Firestore-Instanz oder einem Cloud Storage-Bucket bereit
Firebase-App-Check
-
google_firebase_app_check_service_config
– App-Check-Erzwingung für einen Dienst aktivieren -
google_firebase_app_check_app_attest_config
– Registrieren Sie eine Apple-Plattform-App beim App-Attest-Anbieter -
google_firebase_app_check_device_check_config
– Registrieren Sie eine Apple-Plattform-App beim DeviceCheck-Anbieter -
google_firebase_app_check_play_integrity_config
– Registrieren Sie eine Android-App beim Play Integrity-Anbieter -
google_firebase_app_check_recaptcha_enterprise_config
– Registrieren Sie eine Web-App beim reCAPTCHA Enterprise-Anbieter -
google_firebase_app_check_recaptcha_v3_config
– Registrieren Sie eine Web-App beim reCAPTCHA v3-Anbieter -
google_firebase_app_check_debug_token
– Debug-Token zum Testen verwenden
Firebase-Erweiterungen
-
google_firebase_extensions_instance
– eine Instanz einer Firebase-Erweiterung installieren oder aktualisieren
Beispiel-Terraform-Konfigurationsdateien für häufige Anwendungsfälle
Diese Konfiguration erstellt ein neues Google Cloud-Projekt, verknüpft das Projekt mit einem Cloud-Rechnungskonto (der Blaze-Preisplan ist für Firebase Authentication mit GCIP erforderlich), aktiviert Firebase-Dienste für das Projekt, richtet Firebase Authentication mit GCIP ein und registriert drei verschiedene Apps Typen mit dem Projekt.
Beachten Sie, dass die Aktivierung von GCIP erforderlich ist, um die Firebase-Authentifizierung über Terraform einzurichten.
# 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, ] }
Diese Konfiguration erstellt ein neues Google Cloud-Projekt, aktiviert Firebase-Dienste für das Projekt, stellt die Standard-Echtzeitdatenbankinstanz des Projekts bereit und registriert drei verschiedene App-Typen beim Projekt.
# 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, ] }
Diese Konfiguration erstellt ein neues Google Cloud-Projekt, verknüpft das Projekt mit einem Cloud-Rechnungskonto (der Blaze-Preisplan ist für mehrere Echtzeitdatenbankinstanzen erforderlich), aktiviert Firebase-Dienste für das Projekt und stellt mehrere Echtzeitdatenbankinstanzen bereit (einschließlich der Standard-Echtzeitdatenbank des Projekts). Instanz) und registriert drei verschiedene App-Typen beim Projekt.
# 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, ] }
Diese Konfiguration erstellt ein neues Google Cloud-Projekt, aktiviert Firebase-Dienste für das Projekt, stellt die Cloud Firestore-Instanz des Projekts bereit und registriert drei verschiedene App-Typen beim Projekt.
Außerdem werden Firebase-Sicherheitsregeln für die Cloud Firestore-Instanz bereitgestellt, ein Cloud Firestore-Index erstellt und ein Cloud Firestore-Dokument mit Seed-Daten hinzugefügt.
# 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, ] }
Dies ist der Regelsatz der Cloud Firestore-Sicherheitsregeln, der sich in einer lokalen Datei mit dem Namen firestore.rules
befinden sollte.
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; } }
Diese Konfiguration erstellt ein neues Google Cloud-Projekt, aktiviert Firebase-Dienste für das Projekt, stellt den standardmäßigen Cloud Storage-Bucket des Projekts bereit und registriert drei verschiedene App-Typen beim Projekt.
Außerdem werden Firebase-Sicherheitsregeln für den Cloud Storage-Bucket bereitgestellt und eine Datei in den Bucket hochgeladen.
# 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, ] }
Dies ist der Regelsatz der Cloud Storage-Sicherheitsregeln, der sich in einer lokalen Datei mit dem Namen storage.rules
befinden sollte.
rules_version = '2'; service firebase.storage { match /b/{bucket}/o { match /{allPaths=**} { allow read, write: if request.auth != null; } } }
Diese Konfiguration erstellt ein neues Google Cloud-Projekt, verknüpft das Projekt mit einem Cloud-Rechnungskonto (der Blaze-Preisplan ist für mehrere Buckets erforderlich), aktiviert Firebase-Dienste für das Projekt und stellt mehrere Cloud Storage-Buckets bereit (einschließlich des Standard-Cloud Storage-Buckets des Projekts). und registriert drei verschiedene App-Typen beim Projekt.
Außerdem werden Firebase-Sicherheitsregeln für die Cloud Storage-Buckets bereitgestellt und eine Datei in den Standard-Cloud Storage-Bucket hochgeladen.
# 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, ] }
Dies ist der Regelsatz der Cloud Storage-Sicherheitsregeln, der sich in einer lokalen Datei mit dem Namen storage.rules
befinden sollte.
rules_version = '2'; service firebase.storage { match /b/{bucket}/o { match /{allPaths=**} { allow read, write: if request.auth != null; } } }
Diese Konfiguration erstellt ein neues Google Cloud-Projekt, aktiviert Firebase-Dienste für das Projekt, stellt die Cloud Firestore-Instanz bereit und stellt dann den Standard-Cloud-Storage-Bucket bereit.
Außerdem werden Firebase-Sicherheitsregeln für die Cloud Firestore-Instanz und den standardmäßigen Cloud Storage-Bucket bereitgestellt.
# 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 }
Dies ist der Regelsatz der Cloud Firestore-Sicherheitsregeln, der sich in einer lokalen Datei mit dem Namen firestore.rules
befinden sollte.
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; } }
Dies ist der Regelsatz der Cloud Storage-Sicherheitsregeln, der sich in einer lokalen Datei mit dem Namen storage.rules
befinden sollte.
rules_version = '2'; service firebase.storage { match /b/{bucket}/o { match /{allPaths=**} { allow read, write: if request.auth != null; } } }
Diese Konfiguration erstellt ein neues Google Cloud-Projekt, aktiviert Firebase-Dienste für das Projekt und richtet und aktiviert die Durchsetzung von Firebase App Check für Cloud Firestore, sodass nur über Ihre Android-App darauf zugegriffen werden kann.
# 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] }
Diese Konfiguration erstellt ein neues Google Cloud-Projekt, aktiviert Firebase-Dienste für das Projekt und installiert eine neue Instanz einer Firebase-Erweiterung im Projekt. Wenn die Instanz bereits vorhanden ist, werden ihre Parameter basierend auf den in der Konfiguration bereitgestellten Werten aktualisiert.
# 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" } } }
Fehlerbehebung und FAQ
In dieser Anleitung werden bei der Arbeit mit „Projekten“ die folgenden Terraform-Attribute verwendet.
-
project
innerhalb einesresource
Empfohlen: Fügen Sie nach Möglichkeit das
project
in jedenresource
einDurch die Einbeziehung eines Projektattributs erstellt Terraform die im Ressourcenblock angegebene Infrastruktur innerhalb des angegebenen Projekts. Dieses Handbuch und unsere Beispielkonfigurationsdateien verwenden alle diese Vorgehensweise.
Weitere Informationen finden Sie in der offiziellen Terraform-Dokumentation zum
project
.-
user_project_override
innerhalb desprovider
Blocks Für die Bereitstellung der meisten Ressourcen sollten Sie
user_project_override = true
verwenden, was bedeutet, dass Sie das Kontingent mit Ihrem eigenen Firebase-Projekt vergleichen. Um Ihr neues Projekt jedoch so einzurichten, dass es Kontingentprüfungen akzeptiert, müssen Sie zunächstuser_project_override = false
verwenden.Weitere Informationen finden Sie in der offiziellen Terraform-Dokumentation zu
user_project_override
.
Stellen Sie sicher, dass das Benutzerkonto, das Sie zum Ausführen von gCloud-CLI-Befehlen verwenden, die Firebase-Nutzungsbedingungen (Firebase ToS) akzeptiert hat.
Sie können diese Prüfung durchführen, indem Sie über einen Browser mit dem Benutzerkonto angemeldet sind und versuchen, ein vorhandenes Firebase-Projekt in der Firebase-Konsole anzuzeigen. Wenn Sie ein vorhandenes Firebase-Projekt anzeigen können, hat das Benutzerkonto die Firebase-Nutzungsbedingungen akzeptiert.
Wenn Sie kein vorhandenes Firebase-Projekt anzeigen können, hat das Benutzerkonto die Firebase-Nutzungsbedingungen wahrscheinlich nicht akzeptiert. Um dieses Problem zu beheben, erstellen Sie über die Firebase-Konsole ein neues Firebase-Projekt und akzeptieren Sie die Firebase-Nutzungsbedingungen als Teil der Projekterstellung. Sie können dieses Projekt sofort über die Projekteinstellungen in der Konsole löschen.
Warten Sie ein paar Minuten und versuchen Sie dann erneut terraform apply
auszuführen.
Dies könnte auf eine Ausbreitungsverzögerung in verschiedenen Systemen zurückzuführen sein. Versuchen Sie, dieses Problem zu beheben, indem Sie die Ressource in den Terraform-Status importieren, indem Sie terraform import
ausführen. Versuchen Sie dann erneut, terraform apply
auszuführen.
Wie Sie die einzelnen Ressourcen importieren, erfahren Sie im Abschnitt „Import“ der zugehörigen Terraform-Dokumentation (z. B. in der Dokumentation „Import“ für Cloud Firestore ).
Wie der Fehler vermuten lässt, versucht Terraform möglicherweise, mehrere Indizes bereitzustellen und/oder ein Dokument gleichzeitig zu erstellen, und ist auf einen Parallelitätsfehler gestoßen. Versuchen Sie erneut terraform apply
auszuführen.
Dieser Fehler bedeutet, dass Terraform nicht weiß, für welches Projekt das Kontingent überprüft werden soll. Überprüfen Sie zur Fehlerbehebung Folgendes im resource
:
- Stellen Sie sicher, dass Sie einen Wert für das
project
angegeben haben. - Stellen Sie sicher, dass Sie den Anbieter mit
user_project_override = true
(kein Alias) verwenden, der in den Firebase-Beispielengoogle-beta
ist.
Hier sind die möglichen Gründe, warum die Projekt-ID möglicherweise bereits vorhanden ist:
Das mit dieser ID verknüpfte Projekt gehört jemand anderem.
- Lösung: Wählen Sie eine andere Projekt-ID.
Das mit dieser ID verknüpfte Projekt wurde kürzlich gelöscht (im Status „Vorläufiges Löschen“).
- Lösung: Wenn Sie der Meinung sind, dass das mit der ID verknüpfte Projekt Ihnen gehört, überprüfen Sie den Status des Projekts mithilfe der REST-API
projects.get
.
- Lösung: Wenn Sie der Meinung sind, dass das mit der ID verknüpfte Projekt Ihnen gehört, überprüfen Sie den Status des Projekts mithilfe der REST-API
Das mit dieser ID verknüpfte Projekt ist ordnungsgemäß unter dem aktuellen Benutzer vorhanden. Eine mögliche Ursache für den Fehler könnte sein, dass eine vorherige
terraform apply
unterbrochen wurde.- Lösung: Führen Sie die folgenden Befehle aus:
terraform import google_project.default PROJECT_ID
und dann
terraform import google_firebase_project.default PROJECT_ID
- Lösung: Führen Sie die folgenden Befehle aus:
Eine App Engine-Anwendung erfordert eine Cloud Firestore-Instanz, Sie können jedoch nur eine Cloud Firestore-Instanz pro Projekt haben. Wenn Sie also, wie aus der Fehlermeldung hervorgeht, die Cloud Firestore-Instanz des Projekts bereits an einem Standort bereitgestellt haben, tritt bei App Engine ein Fehler auf, wenn Sie versuchen, eine Cloud Firestore-Instanz an einem anderen Standort bereitzustellen. App Engine geht davon aus, dass Sie versuchen, die bereits vorhandene Cloud Firestore-Instanz „neu bereitzustellen“.
Um diesen Fehler zu beheben, verwenden Sie denselben Speicherort für Cloud Firestore und die App Engine-Anwendung. Wenn Sie einen Cloud Storage-Bucket an einem anderen Ort als Cloud Firestore benötigen, können Sie zusätzliche Buckets bereitstellen (siehe Beispielkonfiguration zum Erstellen mehrerer Cloud Storage-Buckets ).
Wenn Sie den standardmäßigen Cloud Storage-Bucket eines Projekts bereitstellen (über google_app_engine_application
) und das Projekt noch keine Cloud Firestore-Instanz hat, stellt google_app_engine_application
automatisch die Cloud Firestore-Instanz des Projekts bereit.
Wenn die Cloud Firestore-Instanz Ihres Projekts also bereits bereitgestellt ist, gibt google_firestore_database
einen Fehler aus, wenn Sie versuchen, explizit eine Cloud Firestore-Instanz bereitzustellen.
Sobald die Cloud Firestore-Instanz des Projekts bereitgestellt wurde, können Sie sie nicht mehr „erneut bereitstellen“ oder ihren Standort ändern. Um das Auftreten des Fehlers zu verhindern, entfernen Sie den Ressourcenblock google_firestore_database
aus Ihrer Konfigurationsdatei. Beachten Sie jedoch, dass wir die Bereitstellung von Cloud Firestore vor dem Standard-Cloud-Storage-Bucket des Projekts empfehlen (weiter unten erfahren Sie, warum).