Firebase zaczyna wspierać Terraform . Jeśli należysz do zespołu, który chce zautomatyzować i ujednolicić tworzenie projektów Firebase z określonymi zasobami i włączonymi usługami, użycie Terraform z Firebase może być dla Ciebie dobrym rozwiązaniem.
Podstawowy przepływ pracy przy korzystaniu z Terraform z Firebase obejmuje:
Tworzenie i dostosowywanie pliku konfiguracyjnego Terraform (pliku
.tf
), który określa infrastrukturę, którą chcesz udostępnić (tj. zasoby, które chcesz udostępnić i usługi, które chcesz włączyć).Używanie poleceń interfejsu CLI gCloud współpracujących z Terraform w celu zapewnienia infrastruktury określonej w pliku
.tf
.
Co można zrobić z Terraformem i Firebase?
Przykładowy uogólniony przepływ pracy w tym przewodniku polega na utworzeniu nowego projektu Firebase za pomocą aplikacji na Androida. Ale dzięki Terraform możesz zrobić o wiele więcej, na przykład:
Usuń i zmodyfikuj istniejącą infrastrukturę za pomocą Terraform.
Zarządzaj konfiguracją i zadaniami specyficznymi dla produktu za pomocą Terraform, takimi jak:
- Włączanie dostawców logowania Firebase Authentication.
- Tworzenie zasobników Cloud Storage lub instancji baz danych i wdrażanie dla nich reguł bezpieczeństwa Firebase.
Do wykonania wszystkich tych zadań można użyć standardowych plików konfiguracyjnych i poleceń Terraform. Aby Ci w tym pomóc, udostępniliśmy przykładowe pliki konfiguracyjne Terraform dla kilku typowych zastosowań.
Uogólniony przepływ pracy dotyczący korzystania z Terraform z Firebase
Warunki wstępne
Ten przewodnik stanowi wprowadzenie do korzystania z Terraform z Firebase, więc zakłada podstawową biegłość w Terraform. Przed rozpoczęciem tego przepływu pracy upewnij się, że spełniono następujące wymagania wstępne.
Zainstaluj Terraform i zapoznaj się z Terraform, korzystając z oficjalnych tutoriali.
Zainstaluj interfejs CLI Google Cloud (gCloud CLI). Zaloguj się za pomocą konta użytkownika lub konta serwisowego .
- Jeśli korzystasz z konta użytkownika, musisz zaakceptować Warunki korzystania z usługi Firebase (Warunki korzystania z Firebase). Zaakceptowałeś Warunki korzystania z Firebase, jeśli możesz przeglądać projekt Firebase w konsoli Firebase
- Aby Terraform mógł podjąć określone działania (na przykład tworzyć projekty), muszą być spełnione następujące warunki:
- Konto użytkownika lub usługi musi mieć odpowiedni dostęp IAM do wykonywania tych działań.
- Jeśli konto użytkownika lub usługi należy do organizacji Google Cloud, zasady organizacji muszą zezwalać kontu na wykonywanie tych działań.
Krok 1: Utwórz i dostosuj plik konfiguracyjny Terraform
Plik konfiguracyjny Terraform wymaga dwóch głównych sekcji (opisanych szczegółowo poniżej):
- Sekcja konfiguracji
provider
, która określa, do jakich zasobów Terraform można uzyskać dostęp - Sekcja poszczególnych bloków
resource
określająca, jaką infrastrukturę należy utworzyć
Skonfiguruj swojego provider
Bez względu na produkty i usługi Firebase wymagana jest konfiguracja provider
.
Utwórz plik konfiguracyjny Terraform (np. plik
main.tf
) w swoim katalogu lokalnym.W tym przewodniku użyjesz tego pliku konfiguracyjnego do określenia zarówno konfiguracji
provider
, jak i całej infrastruktury, którą chcesz utworzyć Terraform. Pamiętaj jednak, że masz opcje uwzględniania konfiguracji dostawcy.Masz następujące możliwości dołączenia konfiguracji
provider
do pozostałej części konfiguracji Terraform:Opcja 1: Dołącz go na górze pojedynczego pliku konfiguracyjnego Terraform
.tf
(jak pokazano w tym przewodniku).- Użyj tej opcji, jeśli dopiero zaczynasz korzystać z Terraform lub po prostu wypróbowujesz Terraform z Firebase.
Opcja 2: Umieść go w osobnym pliku
.tf
(np. plikuprovider.tf
), poza plikiem.tf
, w którym określasz infrastrukturę do utworzenia (np. plikiemmain.tf
).- Użyj tej opcji, jeśli jesteś częścią większego zespołu, który musi ujednolicić konfigurację.
- Podczas uruchamiania poleceń Terraform zarówno plik
provider.tf
, jak imain.tf
muszą znajdować się w tym samym katalogu.
Dołącz następującą konfigurację
provider
na górze plikumain.tf
Musisz skorzystać z dostawcy
google-beta
, ponieważ jest to wersja beta umożliwiająca korzystanie z Firebase z Terraform. Zachowaj ostrożność podczas stosowania w produkcji.# 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 }
Dowiedz się więcej o różnych typach atrybutów związanych z projektem (w tym o tym, co w tym przewodniku nazywa się „projektem sprawdzania przydziałów”) podczas korzystania z Terraform z Firebase.
Przejdź do następnej sekcji, aby uzupełnić plik konfiguracyjny i określić, jaką infrastrukturę chcesz utworzyć.
Określ, jaką infrastrukturę utworzyć przy użyciu bloków resource
W pliku konfiguracyjnym Terraform (w tym przewodniku jest to plik main.tf
) musisz określić całą infrastrukturę, którą Terraform ma utworzyć (co oznacza wszystkie zasoby, które chcesz udostępnić, i wszystkie usługi, które chcesz włączyć). W tym przewodniku znajdziesz pełną listę wszystkich zasobów Firebase obsługujących Terraform .
Otwórz plik
main.tf
W konfiguracji
provider
uwzględnij następującą konfigurację blokówresource
.Ten podstawowy przykład tworzy nowy projekt Firebase, a następnie tworzy w tym projekcie aplikację Firebase na Androida.
# 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, ] }
Jeśli nie znasz infrastruktury projektów i aplikacji jako zasobów, przejrzyj poniższą dokumentację:
- Poznaj projekty Firebase
- Dokumentacja referencyjna dotycząca zarządzania projektami Firebase
# Terraform configuration to set up providers by version. ... # Configures the provider to use the resource block's specified project for quota checks. ... # Configures the provider to not use the resource block's specified project for quota checks. ... # Creates a new Google Cloud project. resource "google_project" "default" { # Use the provider that enables the setup of quota checks for a new project provider = google-beta.no_user_project_override name = "Project Display Name" // learn more about the project name project_id = "project-id-for-new-project" // learn more about the project ID # Required for any service that requires the Blaze pricing plan # (like Firebase Authentication with GCIP) billing_account = "000000-000000-000000" # Required for the project to display in any list of Firebase projects. labels = { "firebase" = "enabled" // learn more about the Firebase-enabled label } } # Enables required APIs. resource "google_project_service" "default" { # Use the provider without quota checks for enabling APIS provider = google-beta.no_user_project_override project = google_project.default.project_id for_each = toset([ "cloudbilling.googleapis.com", "cloudresourcemanager.googleapis.com", "firebase.googleapis.com", # Enabling the ServiceUsage API allows the new project to be quota checked from now on. "serviceusage.googleapis.com", ]) service = each.key # Don't disable the service if the resource block is removed by accident. disable_on_destroy = false } # Enables Firebase services for the new project created above. # This action essentially "creates a Firebase project" and allows the project to use # Firebase services (like Firebase Authentication) and # Firebase tooling (like the Firebase console). # Learn more about the relationship between Firebase projects and Google Cloud. resource "google_firebase_project" "default" { # Use the provider that performs quota checks from now on provider = google-beta project = google_project.default.project_id # Waits for the required APIs to be enabled. depends_on = [ google_project_service.default ] } # Creates a Firebase Android App in the new project created above. # Learn more about the relationship between Firebase Apps and Firebase projects. resource "google_firebase_android_app" "default" { provider = google-beta project = google_project.default.project_id display_name = "My Awesome Android app" # learn more about an app's display name package_name = "awesome.package.name" # learn more about an app's package name # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.default, ] }
Krok 2: Uruchom polecenia Terraform, aby utworzyć określoną infrastrukturę
Aby udostępnić zasoby i włączyć usługi określone w pliku main.tf
, uruchom następujące polecenia z tego samego katalogu, w którym znajduje się plik main.tf
Szczegółowe informacje na temat tych poleceń można znaleźć w dokumentacji Terraform .
Jeśli po raz pierwszy uruchamiasz polecenia Terraform w tym katalogu, musisz zainicjować katalog konfiguracyjny i zainstalować dostawcę Google Terraform. Zrób to, uruchamiając następujące polecenie:
terraform init
Utwórz infrastrukturę określoną w pliku
main.tf
, uruchamiając następującą komendę:terraform apply
Upewnij się, że wszystko zostało udostępnione lub włączone zgodnie z oczekiwaniami:
Opcja 1: Zobacz konfigurację wydrukowaną w terminalu, uruchamiając następujące polecenie:
terraform show
Opcja 2: Wyświetl swój projekt Firebase w konsoli Firebase .
Zasoby Firebase z obsługą Terraform
Następujące zasoby Firebase i Google obsługują Terraform. Cały czas dodajemy więcej zasobów! Jeśli więc nie widzisz zasobu, którym chcesz zarządzać za pomocą Terraform, sprawdź wkrótce, czy jest on dostępny, lub poproś o niego, zgłaszając problem w repozytorium GitHub .
Zarządzanie projektami i aplikacjami Firebase
google_firebase_project
— włącz usługi Firebase w istniejącym projekcie Google Cloudgoogle_firebase_project_location
— ustaw lokalizację domyślnych zasobów Google Cloud projektuAplikacje Firebase
-
google_firebase_apple_app
— utwórz aplikację Firebase na platformy Apple lub zarządzaj nią -
google_firebase_android_app
— utwórz aplikację Firebase na Androida lub zarządzaj nią -
google_firebase_web_app
— utwórz aplikację internetową Firebase lub zarządzaj nią
-
Uwierzytelnianie Firebase
google_identity_platform_config
— włącz Google Cloud Identity Platform (GCIP) (będącą backendem dla uwierzytelniania Firebase) i podaj ustawienia uwierzytelniania na poziomie projektuKonfiguracja uwierzytelniania Firebase za pośrednictwem Terraform wymaga włączenia GCIP. Zapoznaj się z przykładowym plikiem
.tf
, aby dowiedzieć się, jak skonfigurować uwierzytelnianie Firebase .Projekt, w którym Terraform umożliwi uwierzytelnianie GCIP i/lub Firebase, musi znajdować się w planie cenowym Blaze (tzn. projekt musi mieć powiązane konto rozliczeniowe Cloud). Można to zrobić programowo, ustawiając atrybut
billing_account
w zasobiegoogle_project
.Ten zasób umożliwia także większą liczbę konfiguracji, np. lokalne metody logowania, takie jak uwierzytelnianie anonimowe, uwierzytelnianie za pomocą poczty e-mail/hasła i telefonu, a także funkcje blokowania i autoryzowane domeny.
google_identity_platform_default_supported_idp_config
— skonfiguruj typowych federacyjnych dostawców tożsamości, takich jak Google, Facebook lub Appleidentity_platform_oauth_idp_config
— skonfiguruj dowolne źródła dostawcy tożsamości OAuth (IdP)google_identity_platform_inbound_saml_config
— skonfiguruj integracje SAML
Jeszcze nieobsługiwane:
- Konfigurowanie uwierzytelniania wieloskładnikowego (MFA) za pośrednictwem Terraform
Baza danych czasu rzeczywistego Firebase
-
google_firebase_database_instance
— utwórz instancję bazy danych czasu rzeczywistego
Jeszcze nieobsługiwane:
- Wdrażanie reguł bezpieczeństwa bazy danych Firebase Realtime za pośrednictwem Terraform (dowiedz się, jak wdrożyć te reguły przy użyciu innych narzędzi, w tym opcji programistycznych)
Chmura Firestore
google_firestore_database
— utwórz instancję Cloud Firestoregoogle_firestore_index
— włącz wydajne zapytania do Cloud Firestoregoogle_firestore_document
— zapełnij instancję Cloud Firestore określonym dokumentem w kolekcjiWażne: w tym dokumencie źródłowym nie należy wykorzystywać rzeczywistych danych użytkownika końcowego ani danych produkcyjnych.
Magazyn w chmurze dla Firebase
google_firebase_storage_bucket
— udostępnij istniejący zasobnik Cloud Storage dla pakietów SDK Firebase, uwierzytelniania i reguł bezpieczeństwa Firebase- Skonfigurowanie domyślnego zasobnika Cloud Storage dla projektu Firebase wymaga najpierw udostępnienia
google_app_engine_application
. Zapoznaj się z przykładowym plikiem.tf
, aby dowiedzieć się, jak udostępniać zasobniki Cloud Storage .
- Skonfigurowanie domyślnego zasobnika Cloud Storage dla projektu Firebase wymaga najpierw udostępnienia
google_storage_bucket_object
— dodaj obiekt do zasobnika Cloud StorageWażne: w tym pliku nie należy używać prawdziwych danych użytkownika końcowego ani danych produkcyjnych.
Reguły bezpieczeństwa Firebase (dla Cloud Firestore i Cloud Storage)
Należy pamiętać, że baza danych Firebase Realtime Database korzysta z innego systemu udostępniania dla swoich reguł bezpieczeństwa Firebase.
google_firebaserules_ruleset
— zdefiniuj reguły bezpieczeństwa Firebase, które mają zastosowanie do instancji Cloud Firestore lub segmentu Cloud Storagegoogle_firebaserules_release
— wdrażaj określone zestawy reguł w instancji Cloud Firestore lub w zasobniku Cloud Storage
Kontrola aplikacji Firebase
-
google_firebase_app_check_service_config
— włącz wymuszanie sprawdzania aplikacji dla usługi -
google_firebase_app_check_app_attest_config
— zarejestruj aplikację na platformy Apple u dostawcy App Attest -
google_firebase_app_check_device_check_config
— zarejestruj aplikację na platformy Apple u dostawcy DeviceCheck -
google_firebase_app_check_play_integrity_config
— zarejestruj aplikację na Androida u dostawcy Play Integrity -
google_firebase_app_check_recaptcha_enterprise_config
— zarejestruj aplikację internetową u dostawcy reCAPTCHA Enterprise -
google_firebase_app_check_recaptcha_v3_config
— zarejestruj aplikację internetową u dostawcy reCAPTCHA v3 -
google_firebase_app_check_debug_token
— użyj tokenów debugowania do testowania
Rozszerzenia Firebase
-
google_firebase_extensions_instance
— zainstaluj lub zaktualizuj instancję rozszerzenia Firebase
Przykładowe pliki konfiguracyjne Terraform dla typowych przypadków użycia
Ta konfiguracja tworzy nowy projekt Google Cloud, kojarzy projekt z kontem rozliczeniowym Cloud (plan cenowy Blaze jest wymagany do uwierzytelniania Firebase za pomocą GCIP), włącza usługi Firebase dla projektu, konfiguruje uwierzytelnianie Firebase za pomocą GCIP i rejestruje trzy różne aplikacje typy z projektem.
Pamiętaj, że włączenie GCIP jest wymagane do skonfigurowania uwierzytelniania Firebase za pośrednictwem Terraform.
# Creates a new Google Cloud project. resource "google_project" "auth" { provider = google-beta.no_user_project_override folder_id = "folder-id-for-new-project" name = "Project Display Name" project_id = "project-id-for-new-project" # Associates the project with a Cloud Billing account # (required for Firebase Authentication with GCIP). billing_account = "000000-000000-000000" # Required for the project to display in a list of Firebase projects. labels = { "firebase" = "enabled" } } # Enables required APIs. resource "google_project_service" "auth" { provider = google-beta.no_user_project_override project = google_project.auth.project_id for_each = toset([ "cloudbilling.googleapis.com", "cloudresourcemanager.googleapis.com", "serviceusage.googleapis.com", "identitytoolkit.googleapis.com", ]) service = each.key # Don't disable the service if the resource block is removed by accident. disable_on_destroy = false } # Enables Firebase services for the new project created above. resource "google_firebase_project" "auth" { provider = google-beta project = google_project.auth.project_id depends_on = [ google_project_service.auth, ] } # Creates an Identity Platform config. # Also enables Firebase Authentication with Identity Platform in the project if not. resource "google_identity_platform_config" "auth" { provider = google-beta project = google_project.auth.project_id # Auto-deletes anonymous users autodelete_anonymous_users = true # Configures local sign-in methods, like anonymous, email/password, and phone authentication. sign_in { allow_duplicate_emails = true anonymous { enabled = true } email { enabled = true password_required = false } phone_number { enabled = true test_phone_numbers = { "+11231231234" = "000000" } } } # Sets an SMS region policy. sms_region_config { allowlist_only { allowed_regions = [ "US", "CA", ] } } # Configures blocking functions. blocking_functions { triggers { event_type = "beforeSignIn" function_uri = "https://us-east1-${google_project.auth.project_id}.cloudfunctions.net/before-sign-in" } forward_inbound_credentials { refresh_token = true access_token = true id_token = true } } # Configures a temporary quota for new signups for anonymous, email/password, and phone number. quota { sign_up_quota_config { quota = 1000 start_time = "" quota_duration = "7200s" } } # Configures authorized domains. authorized_domains = [ "localhost", "${google_project.auth.project_id}.firebaseapp.com", "${google_project.auth.project_id}.web.app", ] # Wait for identitytoolkit.googleapis.com to be enabled before initializing Authentication. depends_on = [ google_project_service.auth, ] } # Creates a Firebase Android App in the new project created above. resource "google_firebase_android_app" "auth" { provider = google-beta project = google_project.auth.project_id display_name = "My Android app" package_name = "android.package.name" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.auth, ] } # Creates a Firebase Apple-platforms App in the new project created above. resource "google_firebase_apple_app" "auth" { provider = google-beta project = google_project.auth.project_id display_name = "My Apple app" bundle_id = "apple.app.12345" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.auth, ] } # Creates a Firebase Web App in the new project created above. resource "google_firebase_web_app" "auth" { provider = google-beta project = google_project.auth.project_id display_name = "My Web app" # The other App types (Android and Apple) use "DELETE" by default. # Web apps don't use "DELETE" by default due to backward-compatibility. deletion_policy = "DELETE" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.auth, ] }
Ta konfiguracja tworzy nowy projekt Google Cloud, włącza usługi Firebase dla projektu, udostępnia domyślną instancję bazy danych czasu rzeczywistego projektu i rejestruje w projekcie trzy różne typy aplikacji.
# 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, ] }
Ta konfiguracja tworzy nowy projekt Google Cloud, kojarzy projekt z kontem rozliczeniowym Cloud (plan cenowy Blaze jest wymagany w przypadku wielu instancji bazy danych czasu rzeczywistego), włącza usługi Firebase dla projektu, udostępnia wiele instancji bazy danych czasu rzeczywistego (w tym domyślną bazę danych czasu rzeczywistego projektu) instancja) i rejestruje w projekcie trzy różne typy aplikacji.
# 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, ] }
Ta konfiguracja tworzy nowy projekt Google Cloud, włącza usługi Firebase dla projektu, udostępnia instancję Cloud Firestore projektu i rejestruje w projekcie trzy różne typy aplikacji.
Zapewnia także reguły bezpieczeństwa Firebase dla instancji Cloud Firestore, tworzy indeks Cloud Firestore i dodaje dokument Cloud Firestore z danymi początkowymi.
# 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, ] }
To jest zestaw reguł reguł bezpieczeństwa Cloud Firestore, który powinien znajdować się w lokalnym pliku o nazwie firestore.rules
.
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { allow read: if request.auth != null; allow create: if request.auth != null; allow update: if request.auth != null; } }
Ta konfiguracja tworzy nowy projekt Google Cloud, włącza usługi Firebase dla projektu, udostępnia domyślny zasobnik Cloud Storage projektu i rejestruje w projekcie trzy różne typy aplikacji.
Zapewnia także reguły zabezpieczeń Firebase dla zasobnika Cloud Storage i przesyła plik do zasobnika.
# 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, ] }
To jest zestaw reguł reguł bezpieczeństwa Cloud Storage, który powinien znajdować się w lokalnym pliku o nazwie storage.rules
.
rules_version = '2'; service firebase.storage { match /b/{bucket}/o { match /{allPaths=**} { allow read, write: if request.auth != null; } } }
Ta konfiguracja tworzy nowy projekt Google Cloud, kojarzy projekt z kontem rozliczeniowym Cloud (w przypadku wielu segmentów wymagany jest plan cenowy Blaze), włącza usługi Firebase dla projektu, udostępnia wiele segmentów Cloud Storage (w tym domyślny segment Cloud Storage projektu) i rejestruje w projekcie trzy różne typy aplikacji.
Zapewnia także reguły bezpieczeństwa Firebase dla zasobników Cloud Storage i przesyła plik do domyślnego zasobnika Cloud Storage.
# Creates a new Google Cloud project. resource "google_project" "storage-multi" { provider = google-beta.no_user_project_override folder_id = "folder-id-for-new-project" name = "Project Display Name" project_id = "project-id-for-new-project" # Associates the project with a Cloud Billing account # (required for multiple Cloud Storage buckets). billing_account = "000000-000000-000000" # 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, ] }
To jest zestaw reguł reguł bezpieczeństwa Cloud Storage, który powinien znajdować się w lokalnym pliku o nazwie storage.rules
.
rules_version = '2'; service firebase.storage { match /b/{bucket}/o { match /{allPaths=**} { allow read, write: if request.auth != null; } } }
Ta konfiguracja tworzy nowy projekt Google Cloud, włącza usługi Firebase dla projektu, udostępnia instancję Cloud Firestore, a następnie udostępnia domyślny zasobnik Cloud Storage.
Zawiera także reguły bezpieczeństwa Firebase dla instancji Cloud Firestore i domyślnego zasobnika Cloud Storage.
# 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 }
To jest zestaw reguł reguł bezpieczeństwa Cloud Firestore, który powinien znajdować się w lokalnym pliku o nazwie firestore.rules
.
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { allow read: if request.auth != null; allow create: if request.auth != null; allow update: if request.auth != null; } }
To jest zestaw reguł reguł bezpieczeństwa Cloud Storage, który powinien znajdować się w lokalnym pliku o nazwie storage.rules
.
rules_version = '2'; service firebase.storage { match /b/{bucket}/o { match /{allPaths=**} { allow read, write: if request.auth != null; } } }
Ta konfiguracja tworzy nowy projekt Google Cloud, włącza usługi Firebase dla projektu oraz konfiguruje i włącza egzekwowanie funkcji Firebase App Check dla Cloud Firestore, aby można było uzyskać do niej dostęp tylko z aplikacji na Androida.
# 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] }
Ta konfiguracja tworzy nowy projekt Google Cloud, włącza usługi Firebase dla projektu i instaluje w projekcie nową instancję rozszerzenia Firebase. Jeśli instancja już istnieje, jej parametry są aktualizowane na podstawie wartości podanych w pliku config.
# Creates a new Google Cloud project. resource "google_project" "extensions" { provider = google-beta.no_user_project_override folder_id = "folder-id-for-new-project" name = "Project Display Name" project_id = "project-id-for-new-project" # Associates the project with a Cloud Billing account # (required to use Firebase Extensions). billing_account = "000000-000000-000000" # Required for the project to display in a list of Firebase projects. labels = { "firebase" = "enabled" } } # Enables required APIs. resource "google_project_service" "extensions" { provider = google-beta.no_user_project_override project = google_project.extensions.project_id for_each = toset([ "cloudbilling.googleapis.com", "cloudresourcemanager.googleapis.com", "serviceusage.googleapis.com", "firebase.googleapis.com", "firebaseextensions.googleapis.com", ]) service = each.key # Don't disable the service if the resource block is removed by accident. disable_on_destroy = false } # Enables Firebase services for the new project created above. resource "google_firebase_project" "extensions" { provider = google-beta project = google_project.extensions.project_id depends_on = [ google_project_service.extensions, ] } # Installs an instance of the "Translate Text in Firestore" extension. # Or updates the extension if the specified instance already exists. resource "google_firebase_extensions_instance" "translation" { provider = google-beta project = google_project.extensions.project_id instance_id = "translate-text-in-firestore" config { extension_ref = "firebase/firestore-translate-text" params = { COLLECTION_PATH = "posts/comments/translations" DO_BACKFILL = true LANGUAGES = "ar,en,es,de,fr" INPUT_FIELD_NAME = "input" LANGUAGES_FIELD_NAME = "languages" OUTPUT_FIELD_NAME = "translated" } system_params = { "firebaseextensions.v1beta.function/location" = "us-central1" "firebaseextensions.v1beta.function/memory" = "256" "firebaseextensions.v1beta.function/minInstances" = "0" "firebaseextensions.v1beta.function/vpcConnectorEgressSettings" = "VPC_CONNECTOR_EGRESS_SETTINGS_UNSPECIFIED" } } }
Rozwiązywanie problemów i często zadawane pytania
W tym przewodniku podczas pracy z „projektami” używane są następujące atrybuty Terraform.
-
project
w blokuresource
Zalecane: jeśli to możliwe, uwzględnij atrybut
project
w każdym blokuresource
Uwzględniając atrybut projektu, Terraform utworzy infrastrukturę określoną w bloku zasobów w ramach określonego projektu. W tym przewodniku i naszych przykładowych plikach konfiguracyjnych zastosowano tę praktykę.
Zobacz oficjalną dokumentację Terraform dotyczącą
project
.-
user_project_override
w blokuprovider
Do udostępniania większości zasobów powinieneś użyć
user_project_override = true
, co oznacza sprawdzenie limitu w stosunku do własnego projektu Firebase. Aby jednak skonfigurować nowy projekt tak, aby akceptował sprawdzanie przydziału, musisz najpierw użyćuser_project_override = false
.Zobacz oficjalną dokumentację Terraform dotyczącą
user_project_override
.
Upewnij się, że konto użytkownika, którego używasz do uruchamiania poleceń interfejsu CLI gCloud, zaakceptowało Warunki korzystania z usługi Firebase (ToS Firebase).
Możesz to sprawdzić, korzystając z przeglądarki zalogowanej na konto użytkownika i próbując wyświetlić istniejący projekt Firebase w konsoli Firebase . Jeśli możesz wyświetlić istniejący projekt Firebase, oznacza to, że konto użytkownika zaakceptowało Warunki korzystania z usługi Firebase.
Jeśli nie możesz wyświetlić żadnego istniejącego projektu Firebase, oznacza to, że konto użytkownika prawdopodobnie nie zaakceptowało Warunków korzystania z Firebase. Aby to naprawić, utwórz nowy projekt Firebase za pomocą konsoli Firebase i zaakceptuj Warunki korzystania z usługi Firebase w ramach tworzenia projektu. Możesz natychmiast usunąć ten projekt poprzez Ustawienia projektu w konsoli.
Poczekaj kilka minut, a następnie spróbuj ponownie uruchomić terraform apply
.
Może to być spowodowane opóźnieniem propagacji w różnych systemach. Spróbuj rozwiązać ten problem, importując zasób do stanu Terraform, uruchamiając terraform import
. Następnie spróbuj ponownie uruchomić terraform apply
.
Możesz dowiedzieć się, jak zaimportować każdy zasób w sekcji „Import” jego dokumentacji Terraform (na przykład dokumentacja „Import” dla Cloud Firestore ).
Jak sugeruje błąd, Terraform mógł próbować udostępnić wiele indeksów i/lub utworzyć dokument w tym samym czasie i napotkał błąd współbieżności. Spróbuj ponownie uruchomić terraform apply
.
Ten błąd oznacza, że Terraform nie wie, dla którego projektu sprawdzić limit. Aby rozwiązać problem, sprawdź następujące elementy w bloku resource
:
- Upewnij się, że określono wartość atrybutu
project
. - Upewnij się, że używasz dostawcy z
user_project_override = true
(bez aliasu), który w przykładach Firebase togoogle-beta
.
Oto możliwe przyczyny, dla których identyfikator projektu może już istnieć:
Projekt powiązany z tym identyfikatorem należy do kogoś innego.
- Aby rozwiązać problem: wybierz inny identyfikator projektu.
Projekt powiązany z tym identyfikatorem został niedawno usunięty (w stanie nietrwałego usuwania).
- Rozwiązanie: Jeśli uważasz, że projekt powiązany z identyfikatorem należy do Ciebie, sprawdź stan projektu za pomocą API REST
projects.get
.
- Rozwiązanie: Jeśli uważasz, że projekt powiązany z identyfikatorem należy do Ciebie, sprawdź stan projektu za pomocą API REST
Projekt powiązany z tym identyfikatorem istnieje poprawnie w ramach bieżącego użytkownika. Możliwą przyczyną błędu może być przerwanie poprzedniego
terraform apply
.- Aby rozwiązać: Uruchom następujące polecenia:
terraform import google_project.default PROJECT_ID
i wtedy
terraform import google_firebase_project.default PROJECT_ID
- Aby rozwiązać: Uruchom następujące polecenia:
Aplikacja App Engine wymaga instancji Cloud Firestore, ale w każdym projekcie można mieć tylko jedną instancję Cloud Firestore. Tak więc, jak sugeruje komunikat o błędzie, jeśli instancja Cloud Firestore projektu została już udostępniona w jednej lokalizacji, w App Engine wystąpi błąd, jeśli spróbujesz udostępnić instancję Cloud Firestore w innej lokalizacji. App Engine uważa, że próbujesz „ponownie udostępnić” już istniejącą instancję Cloud Firestore.
Aby rozwiązać ten błąd, użyj tej samej lokalizacji zarówno dla Cloud Firestore, jak i aplikacji App Engine. Jeśli potrzebujesz zasobnika Cloud Storage w innej lokalizacji niż Cloud Firestore, możesz udostępnić dodatkowe zasobniki (zobacz przykładową konfigurację dotyczącą tworzenia wielu zasobników Cloud Storage ).
Jeśli udostępnisz domyślny zasobnik Cloud Storage projektu (za pośrednictwem google_app_engine_application
), a projekt nie ma jeszcze instancji Cloud Firestore, google_app_engine_application
automatycznie udostępni instancję Cloud Firestore projektu.
Jeśli więc instancja Cloud Firestore w Twoim projekcie jest już obsługiwana, google_firestore_database
wyświetli błąd, jeśli spróbujesz jawnie udostępnić instancję Cloud Firestore.
Po udostępnieniu instancji Cloud Firestore projektu nie można jej „ponownie udostępnić” ani zmienić jej lokalizacji. Aby zapobiec występowaniu błędu, usuń blok zasobów google_firestore_database
z pliku konfiguracyjnego. Pamiętaj jednak, że zalecamy udostępnienie Cloud Firestore przed domyślnym zasobnikiem Cloud Storage projektu (dlaczego znajdziesz wyjaśnienie poniżej).