Mit Sammlungen den Überblick behalten
Sie können Inhalte basierend auf Ihren Einstellungen speichern und kategorisieren.
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.
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.
Anforderungen für Benutzerkonten und Dienstkonten anzeigen
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):
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.
Sehen Sie sich Optionen zum Einbinden des provider Setups an
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. eine provider.tf Datei) ein, abgesehen von der .tf Datei, in der Sie die zu erstellende Infrastruktur angeben (z. B. eine main.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 Datei main.tf im selben Verzeichnis befinden.
Fügen Sie das folgende provider Setup oben in die Datei main.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 von resource 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,
]
}
Sehen Sie sich eine stark kommentierte Version dieser Beispielkonfigurationsdatei an
Wenn Sie mit der Infrastruktur von Projekten und Apps als Ressourcen nicht vertraut sind, lesen Sie die folgende Dokumentation:
# 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 aktivieren
google_identity_platform_config – aktiviert Google Cloud Identity Platform (GCIP) (das Backend für die Firebase-Authentifizierung) und stellt Authentifizierungseinstellungen auf Projektebene bereit
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 Ressource google_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_firestore_document – Seed einer Cloud Firestore-Instanz mit einem bestimmten Dokument in einer Sammlung
Wichtig: 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
Beispiel-Terraform-Konfigurationsdateien für häufige Anwendungsfälle
Richten Sie die Firebase-Authentifizierung mit GCIP ein
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,
]
}
Stellen Sie die standardmäßige Firebase Realtime Database-Instanz bereit
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,
]
}
Stellen Sie mehrere Firebase Realtime Database-Instanzen bereit
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,
]
}
Stellen Sie die Cloud Firestore-Instanz bereit
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;
}
}
Stellen Sie den Standard-Cloud-Storage-Bucket bereit
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;
}
}
}
Stellen Sie mehrere Cloud Storage-Buckets bereit
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;
}
}
}
Stellen Sie die Cloud Firestore-Instanz und den Standard-Cloud Storage-Bucket bereit
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;
}
}
}
Schützen Sie eine API-Ressource mit Firebase App Check
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]
}
Installieren Sie eine Instanz einer Firebase-Erweiterung
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
Sie möchten mehr über die verschiedenen projektbezogenen Attribute erfahren (wie project und user_project_override ).
In dieser Anleitung werden bei der Arbeit mit „Projekten“ die folgenden Terraform-Attribute verwendet.
project innerhalb eines resource
Empfohlen: Fügen Sie nach Möglichkeit das project in jeden resource ein
Durch 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 des provider 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ächst user_project_override = false verwenden.
Weitere Informationen finden Sie in der offiziellen Terraform-Dokumentation zu user_project_override .
Sie erhalten diese Fehlermeldung: generic::permission_denied: Firebase Tos Not Accepted .
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.
Nach dem Ausführen terraform apply erhalten Sie die folgende Fehlermeldung: generic::permission_denied: IAM authority does not have the permission .
Warten Sie ein paar Minuten und versuchen Sie dann erneut terraform apply auszuführen.
Die Erstellung einer Ressource ist fehlgeschlagen, aber wenn Sie terraform apply erneut ausführen, wird ALREADY_EXISTS angezeigt.
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 ).
Wenn Sie mit Cloud Firestore arbeiten, erhalten Sie diese Fehlermeldung: Error creating Index: googleapi: Error 409;...Concurrent access -- try again
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.
Sie erhalten diese Fehlermeldung: "you may need to specify 'X-Goog-User-Project' HTTP header for quota and billing purposes"
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-Beispielen google-beta ist.
Beim Erstellen eines neuen Google Cloud-Projekts erhalten Sie die Fehlermeldung, dass die für das neue Projekt angegebene Projekt-ID bereits vorhanden 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 .
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
Wenn Sie versuchen, Cloud Firestore und dann Cloud Storage (über google_app_engine_application ) bereitzustellen, erhalten Sie diese Fehlermeldung: Error: Error creating App Engine application: googleapi: Error 409: Cannot create Firestore database resource <resource-name> since it already exists at location <location-id>, alreadyExists .
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 versuchen, Cloud Storage (über google_app_engine_application ) und dann Cloud Firestore bereitzustellen, erhalten Sie die folgende Fehlermeldung: Error: Error creating Database: googleapi: Error 409: Database already exists. Please use another database_id .
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).