Pierwsze kroki z Terraform i Firebase

Firebase zaczyna obsługiwać 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żywanie Terraform z Firebase może być dla Ciebie dobrym rozwiązaniem.

Podstawowy proces korzystania z Terraform w Firebase obejmuje te czynności:

  • Utwórz i dostosuj plik konfiguracji Terraform (plik .tf), który określa infrastrukturę, którą chcesz udostępnić (czyli zasoby, które chcesz udostępnić, i usługi, które chcesz włączyć).

  • Używanie poleceń gcloud CLI, które współpracują z Terraform, do aprowizacji infrastruktury określonej w pliku .tf.

Co można robić za pomocą Terraform i Firebase?

Przykładowy ogólny proces w tym przewodniku polega na utworzeniu nowego projektu Firebase z aplikacją na Androida. Jednak za pomocą Terraform możesz zrobić znacznie więcej, np.:

  • Usuwanie i modyfikowanie istniejącej infrastruktury za pomocą Terraform.

  • zarządzać konfiguracją i zadaniami związanymi z konkretnymi usługami za pomocą Terraform, np.:

    • Włączanie dostawców logowania Firebase Authentication.
    • Tworzenie zasobników Cloud Storage lub instancji bazy danych i wdrażanie dla nich Firebase Security Rules.
    • Tworzenie Firebase App Hosting backendów, kompilacji i innych powiązanych zasobów.

Do wykonania wszystkich tych zadań możesz 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 przypadków użycia.



Ogólny przepływ pracy związany z używaniem Terraform w Firebase

Wymagania wstępne

Ten przewodnik to wprowadzenie do korzystania z Terraform w Firebase, dlatego zakłada podstawową znajomość Terraform. Zanim rozpoczniesz ten proces, upewnij się, że spełniasz te wymagania.


Krok 1. Utwórz i dostosuj plik konfiguracji Terraform

Plik konfiguracji Terraform musi zawierać 2 główne sekcje (opisane szczegółowo poniżej):

Konfigurowanie provider

Konfiguracja provider jest wymagana niezależnie od tego, z których usług Firebase korzystasz.

  1. Utwórz w katalogu lokalnym plik konfiguracji Terraform (np. main.tf).

    W tym przewodniku użyjesz tego pliku konfiguracji, aby określić zarówno provider konfigurację, jak i całą infrastrukturę, którą ma utworzyć Terraform. Pamiętaj jednak, że masz kilka opcji włączenia konfiguracji dostawcy.

    Masz do wyboru te opcje włączenia konfiguracji provider do pozostałej części konfiguracji Terraform:

    • Opcja 1. Umieść go u góry pojedynczego pliku konfiguracyjnego Terraform .tf (jak pokazano w tym przewodniku).

      • Wybierz tę opcję, jeśli dopiero zaczynasz korzystać z Terraform lub chcesz wypróbować Terraform w Firebase.
    • Opcja 2: umieść go w osobnym pliku .tf (np. w pliku provider.tf), niezależnie od pliku .tf, w którym określasz infrastrukturę do utworzenia (np. w pliku main.tf).

      • Użyj tej opcji, jeśli należysz do większego zespołu, który musi ujednolicić konfigurację.
      • Podczas uruchamiania poleceń Terraform zarówno plik provider.tf, jak i plik main.tf muszą znajdować się w tym samym katalogu.

  2. U góry pliku main.tf umieść tę konfigurację provider.

    Musisz użyć dostawcy google-beta, ponieważ jest to wersja beta korzystania z Firebase w Terraform. Zachowaj ostrożność podczas używania w środowisku produkcyjnym.

    # Terraform configuration to set up providers by version.
    terraform {
      required_providers {
        google-beta = {
          source  = "hashicorp/google-beta"
          version = "~> 6.0"
        }
      }
    }
    
    # Configures the provider to use the resource block's specified project for quota checks.
    provider "google-beta" {
      user_project_override = true
    }
    
    # Configures the provider to not use the resource block's specified project for quota checks.
    # This provider should only be used during project creation and initializing services.
    provider "google-beta" {
      alias = "no_user_project_override"
      user_project_override = false
    }

    Dowiedz się więcej o różnych typach atrybutów związanych z projektami (w tym o tym, co w tym przewodniku nazywamy „projektem sprawdzania limitu”) podczas korzystania z Terraform w Firebase.

  3. Aby dokończyć plik konfiguracyjny i określić, jaką infrastrukturę chcesz utworzyć, przejdź do następnej sekcji.

Określ, jaką infrastrukturę chcesz utworzyć, za pomocą bloków resource

W pliku konfiguracji Terraform (w tym przewodniku jest to plik main.tf) musisz określić całą infrastrukturę, którą chcesz utworzyć za pomocą Terraform (czyli 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, które obsługują Terraform.

  1. Otwórz plik main.tf.

  2. W sekcji konfiguracji provider umieść tę konfigurację resourcebloków.

    Ten podstawowy przykład tworzy nowy projekt Firebase, a następnie w tym projekcie tworzy 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, zapoznaj się z tą dokumentacją:

# 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 te polecenia w tym samym katalogu co plik main.tf. Szczegółowe informacje o tych poleceniach znajdziesz w dokumentacji Terraform.

  1. Jeśli po raz pierwszy uruchamiasz polecenia Terraform w tym katalogu, musisz zainicjować katalog konfiguracji i zainstalować dostawcę Google Terraform. W tym celu uruchom to polecenie:

    terraform init
  2. Utwórz infrastrukturę określoną w pliku main.tf, uruchamiając to polecenie:

    terraform apply
  3. Sprawdź, czy wszystko zostało skonfigurowane lub włączone zgodnie z oczekiwaniami:

    • Opcja 1: wyświetl konfigurację w terminalu, uruchamiając to polecenie:

      terraform show
    • Opcja 2. Wyświetl projekt Firebase w Firebasekonsoli.



Zasoby Firebase z obsługą Terraform

Te zasoby Firebase i Google są obsługiwane przez Terraform. Stale dodajemy nowe materiały. Jeśli nie widzisz zasobu, którym chcesz zarządzać za pomocą Terraform, sprawdź ponownie wkrótce, czy jest on dostępny, lub poproś o jego dodanie, zgłaszając problem w repozytorium GitHub.


Zarządzanie projektami i aplikacjami Firebase

  • google_firebase_project – włączanie usług Firebase w dotychczasowym Google Cloud projekcie.

  • Aplikacje Firebase


Firebase Authentication

Funkcja jeszcze nie jest obsługiwana:

  • Konfigurowanie uwierzytelniania wielopoziomowego (MFA) za pomocą Terraform

Firebase App Hosting


Firebase Data Connect


Firebase Realtime Database

Funkcja jeszcze nie jest obsługiwana:

  • Wdrażanie Firebase Realtime Database Security Rules za pomocą Terraform (dowiedz się, jak wdrażać te Rules za pomocą innych narzędzi, w tym opcji programowych)

Cloud Firestore

  • google_firestore_database – utwórz instancję Cloud Firestore.

  • google_firestore_index – włączanie wydajnych zapytań w przypadku Cloud Firestore

  • google_firestore_document – wypełnianie instancji Cloud Firestore konkretnym dokumentem w kolekcji

    Ważne: w tym dokumencie początkowym nie używaj prawdziwych danych użytkowników ani danych produkcyjnych.


Cloud Storage for Firebase

  • google_firebase_storage_bucket – udostępnianie istniejącego kosza Cloud Storage pakietom SDK Firebase, uwierzytelnianiu i Firebase Security Rules

  • google_storage_bucket_object – dodawanie obiektu do Cloud Storage zasobnika.

    Ważne: nie używaj w tym pliku prawdziwych danych użytkowników ani danych produkcyjnych.


Firebase Security Rules (dla Cloud Firestore i Cloud Storage)

Pamiętaj, że Firebase Realtime Database używa innego systemu udostępniania dla swoich Firebase Security Rules.

  • google_firebaserules_ruleset – określ Firebase Security Rules, które mają zastosowanie do instancji Cloud Firestore lub zasobnika Cloud Storage.

  • google_firebaserules_release – wdrażanie określonych zestawów reguł w instancji Cloud Firestore lub w zasobniku Cloud Storage.


Firebase App Check


Firebase Extensions



Przykładowe pliki konfiguracji Terraform dla typowych przypadków użycia

Ta konfiguracja tworzy nowy projekt Google Cloud, wiąże go z kontem Cloud Billing (w przypadku Firebase Authentication z GCIP wymagany jest abonament Blaze), włącza usługi Firebase w projekcie, konfiguruje Firebase Authentication z GCIP i rejestruje w projekcie 3 różne typy aplikacji.

Pamiętaj, że włączenie GCIP jest wymagane do skonfigurowania Firebase Authentication za pomocą 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"
}

# 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_firebase_project.auth.project

  # 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",
  ]
}

# Creates a Firebase Android App in the new project created above.
resource "google_firebase_android_app" "auth" {
  provider     = google-beta
  project      = google_firebase_project.auth.project
  display_name = "My Android app"
  package_name = "android.package.name"
}

# Creates a Firebase Apple-platforms App in the new project created above.
resource "google_firebase_apple_app" "auth" {
  provider     = google-beta
  project      = google_firebase_project.auth.project
  display_name = "My Apple app"
  bundle_id    = "apple.app.12345"
}

# Creates a Firebase Web App in the new project created above.
resource "google_firebase_web_app" "auth" {
  provider     = google-beta
  project      = google_firebase_project.auth.project
  display_name = "My Web app"
}

Ta konfiguracja tworzy nowy Google Cloud projekt, włącza w nim usługi Firebase i udostępnia Data Connect usługę.

# Creates a new Google Cloud project.
resource "google_project" "dataconnect" {
  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 Data Connect).
  billing_account = "000000-000000-000000"

  # Required for the project to display in a list of Firebase projects.
  labels = {
    "firebase" = "enabled"
  }
}

# Enables required APIs.
resource "google_project_service" "services" {
  provider = google-beta.no_user_project_override
  project  = google_project.dataconnect.project_id
  for_each = toset([
    "serviceusage.googleapis.com",
    "cloudresourcemanager.googleapis.com",
    "firebasedataconnect.googleapis.com",
  ])
  service = each.key

  # Don't disable the service if the resource block is removed by accident.
  disable_on_destroy = false
}

# Enables Firebase services for the new project created earlier.
resource "google_firebase_project" "dataconnect" {
  provider = google-beta
  project  = google_project.dataconnect.project_id

  depends_on = [google_project_service.services]
}

# Create a Firebase Data Connect service
resource "google_firebase_data_connect_service" "dataconnect-default" {
  project         = google_firebase_project.dataconnect.project
  location        = "name-of-region-for-service"
  service_id      = "${google_firebase_project.dataconnect.project}-default-fdc"
  deletion_policy = "DEFAULT"
}

Ta konfiguracja tworzy nowy projekt Google Cloud, włącza w nim usługi Firebase, udostępnia domyślną instancję Realtime Database projektu i rejestruje w projekcie 3 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"
}

# 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

  depends_on = [google_project_service.rtdb]
}

# Provisions the default Realtime Database default instance.
resource "google_firebase_database_instance" "database" {
  provider    = google-beta
  project     = google_firebase_project.rtdb.project
  # See available locations: https://firebase.google.com/docs/database/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"
}

# Creates a Firebase Android App in the new project created above.
resource "google_firebase_android_app" "rtdb" {
  provider     = google-beta
  project      = google_firebase_project.rtdb.project
  display_name = "My Android app"
  package_name = "android.package.name"
}

# Creates a Firebase Apple-platforms App in the new project created above.
resource "google_firebase_apple_app" "rtdb" {
  provider     = google-beta
  project      = google_firebase_project.rtdb.project
  display_name = "My Apple app"
  bundle_id    = "apple.app.12345"
}

# Creates a Firebase Web App in the new project created above.
resource "google_firebase_web_app" "rtdb" {
  provider     = google-beta
  project      = google_firebase_project.rtdb.project
  display_name = "My Web app"
}

Ta konfiguracja tworzy nowy projekt Google Cloud, łączy go z kontem Cloud Billing (w przypadku wielu instancji Realtime Database wymagany jest abonament Blaze), włącza usługi Firebase w projekcie, udostępnia wiele instancji Realtime Database (w tym domyślną instancję Realtime Database projektu) i rejestruje w projekcie 3 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"
}

# 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

  depends_on = [google_project_service.rtdb-multi]
}

# Provisions the default Realtime Database default instance.
resource "google_firebase_database_instance" "database-default" {
  provider    = google-beta
  project     = google_firebase_project.rtdb-multi.project
  # See available locations: https://firebase.google.com/docs/database/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"
}

# Provisions an additional Realtime Database instance.
resource "google_firebase_database_instance" "database-additional" {
  provider    = google-beta
  project     = google_firebase_project.rtdb-multi.project
  # See available locations: https://firebase.google.com/docs/projects/locations#rtdb-locations
  # This location doesn't need to be the same as the default database instance.
  region      = "name-of-region"
  # This value will become the first segment of the database's URL.
  instance_id = "name-of-additional-database-instance"
  type        = "USER_DATABASE"
}

# Creates a Firebase Android App in the new project created above.
resource "google_firebase_android_app" "rtdb-multi" {
  provider     = google-beta
  project      = google_firebase_project.rtdb-multi.project
  display_name = "My Android app"
  package_name = "android.package.name"
}

# Creates a Firebase Apple-platforms App in the new project created above.
resource "google_firebase_apple_app" "rtdb-multi" {
  provider     = google-beta
  project      = google_firebase_project.rtdb-multi.project
  display_name = "My Apple app"
  bundle_id    = "apple.app.12345"
}

# Creates a Firebase Web App in the new project created above.
resource "google_firebase_web_app" "rtdb-multi" {
  provider     = google-beta
  project      = google_firebase_project.rtdb-multi.project
  display_name = "My Web app"
}

Ta konfiguracja tworzy nowy projekt Google Cloud, włącza w nim usługi Firebase, udostępnia domyślną instancję Cloud Firestore projektu i rejestruje w projekcie 3 różne typy aplikacji.

Tworzy też Firebase Security Rules dla domyślnej 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"
}

# 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

  depends_on = [google_project_service.firestore]
}

# Provisions the Firestore database instance.
resource "google_firestore_database" "firestore" {
  provider                    = google-beta
  project                     = google_firebase_project.firestore.project
  name                        = "(default)"
  # See available locations: https://firebase.google.com/docs/firestore/locations
  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"
}

# Creates a ruleset of Firestore Security Rules from a local file.
resource "google_firebaserules_ruleset" "firestore" {
  provider = google-beta
  project  = google_firestore_database.firestore.project
  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")
    }
  }
}

# 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_firestore_database.firestore.project
}

# Adds a new Firestore index.
resource "google_firestore_index" "indexes" {
  provider = google-beta
  project  = google_firestore_database.firestore.project

  collection  = "quiz"
  query_scope = "COLLECTION"

  fields {
    field_path = "question"
    order      = "ASCENDING"
  }

  fields {
    field_path = "answer"
    order      = "ASCENDING"
  }
}

# Adds a new Firestore document with seed data.
# Don't use real end-user or production data in this seed document.
resource "google_firestore_document" "doc" {
  provider    = google-beta
  project     = google_firestore_database.firestore.project
  collection  = "quiz"
  document_id = "question-1"
  fields      = "{\"question\":{\"stringValue\":\"Favorite Database\"},\"answer\":{\"stringValue\":\"Firestore\"}}"
}

# Creates a Firebase Android App in the new project created above.
resource "google_firebase_android_app" "firestore" {
  provider     = google-beta
  project      = google_firebase_project.firestore.project
  display_name = "My Android app"
  package_name = "android.package.name"
}

# Creates a Firebase Apple-platforms App in the new project created above.
resource "google_firebase_apple_app" "firestore" {
  provider     = google-beta
  project      = google_firebase_project.firestore.project
  display_name = "My Apple app"
  bundle_id    = "apple.app.12345"
}

# Creates a Firebase Web App in the new project created above.
resource "google_firebase_web_app" "firestore" {
  provider     = google-beta
  project      = google_firebase_project.firestore.project
  display_name = "My Web app"
}

Jest to zestaw reguł Cloud Firestore Security Rules, który powinien znajdować się w pliku lokalnym o nazwie firestore.rules.

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /some_collection/{document} {
      allow read, create, update: if request.auth != null;
    }
  }
}

Ta konfiguracja tworzy nowy Google Cloud projekt, przypisuje go do Cloud Billing konta (w przypadku dodatkowych zasobników wymagany jest abonament Blaze), włącza usługi Firebase w projekcie, udostępnia dodatkowe, niedomyślne Cloud Storage zasobniki i rejestruje w projekcie 3 różne typy aplikacji.

Tworzy też Firebase Security Rules dla każdego zasobnika Cloud Storage i przesyła plik do jednego z zasobników 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"
}

# 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

  depends_on = [google_project_service.storage-multi]
}

# Provisions a Cloud Storage bucket.
resource "google_storage_bucket" "bucket-1" {
  provider = google-beta
  project  = google_firebase_project.storage-multi.project
  name     = "name-of-storage-bucket"
  # See available locations: https://cloud.google.com/storage/docs/locations#available-locations
  location = "name-of-region-for-bucket"
}

# Provisions an additional Cloud Storage bucket.
resource "google_storage_bucket" "bucket-2" {
  provider = google-beta
  project  = google_firebase_project.storage-multi.project
  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 existing Storage bucket.
  location = "name-of-region-for-additional-bucket"
}

# Makes the first Storage bucket accessible for Firebase SDKs, authentication, and Firebase Security Rules.
resource "google_firebase_storage_bucket" "bucket-1" {
  provider  = google-beta
  project   = google_firebase_project.storage-multi.project
  bucket_id = google_storage_bucket.bucket-1.name
}

# Makes the additional Storage bucket accessible for Firebase SDKs, authentication, and Firebase Security Rules.
resource "google_firebase_storage_bucket" "bucket-2" {
  provider  = google-beta
  project   = google_firebase_project.storage-multi.project
  bucket_id = google_storage_bucket.bucket-2.name
}

# Creates a ruleset of Firebase Security Rules from a local file.
resource "google_firebaserules_ruleset" "storage-multi" {
  provider = google-beta
  project  = google_firebase_project.storage-multi.project
  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")
    }
  }
}

# Releases the ruleset to the first Storage bucket.
resource "google_firebaserules_release" "bucket-1" {
  provider     = google-beta
  name         = "firebase.storage/${google_storage_bucket.bucket-1.name}"
  ruleset_name = "projects/${google_project.storage-multi.project_id}/rulesets/${google_firebaserules_ruleset.storage-multi.name}"
  project      = google_firebase_project.storage-multi.project
}

# Releases the ruleset to the additional Storage bucket.
resource "google_firebaserules_release" "bucket-2" {
  provider     = google-beta
  name         = "firebase.storage/${google_storage_bucket.bucket-2.name}"
  ruleset_name = "projects/${google_project.storage-multi.project_id}/rulesets/${google_firebaserules_ruleset.storage-multi.name}"
  project      = google_firebase_project.storage-multi.project
}

# Uploads a new file to the first Storage bucket.
# Do not use real end-user or production data in this file.
resource "google_storage_bucket_object" "cat-picture-multi" {
  provider = google-beta
  name     = "cat.png"
  source   = "path/to/cat.png"
  bucket   = google_storage_bucket.bucket-1.name
}

# Creates a Firebase Android App in the new project created above.
resource "google_firebase_android_app" "storage-multi" {
  provider     = google-beta
  project      = google_firebase_project.storage-multi.project
  display_name = "My Android app"
  package_name = "android.package.name"
}

# Creates a Firebase Apple-platforms App in the new project created above.
resource "google_firebase_apple_app" "storage-multi" {
  provider     = google-beta
  project      = google_firebase_project.storage-multi.project
  display_name = "My Apple app"
  bundle_id    = "apple.app.12345"
}

# Creates a Firebase Web App in the new project created above.
resource "google_firebase_web_app" "storage-multi" {
  provider     = google-beta
  project      = google_firebase_project.storage-multi.project
  display_name = "My Web app"
}

Jest to zestaw reguł Cloud Storage Security Rules, który powinien znajdować się w pliku lokalnym o nazwie storage.rules.

rules_version = '2';
service firebase.storage {
  match /b/{bucket}/o {
    match /some_folder/{fileName} {
      allow read, write: if request.auth != null;
    }
  }
}

Ta konfiguracja tworzy nowy projekt Google Cloud, włącza w nim usługi Firebase oraz konfiguruje i włącza egzekwowanie Firebase App Check w przypadku Cloud Firestore, aby można było uzyskać do niego 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"
}

# 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"
}

# 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
  ]
}

# 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 = [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 w nim usługi Firebase i instaluje w nim nową instancję Firebase Extension. Jeśli instancja już istnieje, jej parametry zostaną zaktualizowane na podstawie wartości podanych w konfiguracji.

# 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"
}

# 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_firebase_project.extensions.project

  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"
    }
  }
}

Ta konfiguracja tworzy nowy Google CloudprojektFirebase AI Logic, włącza w nim usługi Firebase, w tym Firebase AI Logic, i konfiguruje oraz włącza egzekwowanie Firebase App Check w przypadku Firebase AI Logic, aby można było uzyskać do niego dostęp tylko z Twoich aplikacji.

# Creates a new Google Cloud project.
resource "google_project" "vertex" {
  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 Vertex AI in Firebase).
  billing_account = "000000-000000-000000"
}

# Enables required APIs.
resource "google_project_service" "services" {
  provider   = google-beta.no_user_project_override

  project  = google_project.vertex.project_id
  for_each = toset([
    "cloudresourcemanager.googleapis.com",
    "firebase.googleapis.com",
    "serviceusage.googleapis.com",
    # Required APIs for Vertex AI in Firebase
    "aiplatform.googleapis.com",
    "firebasevertexai.googleapis.com",
    # App Check is recommended to protect Vertex AI in Firebase from abuse
    "firebaseappcheck.googleapis.com",
  ])
  service = each.key

  # Don't disable the service if the resource block is removed by accident.
  disable_on_destroy = false
}

# Enables Firebase services for the new project created earlier.
resource "google_firebase_project" "vertex" {
  provider = google-beta
  project  = google_project.vertex.project_id

  depends_on = [google_project_service.services]
}

# Creates a Firebase Web App in the new project created earlier.
resource "google_firebase_web_app" "app" {
  provider = google-beta
  project  = google_firebase_project.vertex.project

  display_name = "My Web App"
}

# Creates a Firebase Android App in the new project created earlier.
resource "google_firebase_android_app" "app" {
  provider     = google-beta
  project      = google_firebase_project.vertex.project
  display_name = "My Android App"
  package_name = "package.name.playintegrity"
  sha256_hashes = [
    # TODO: insert your Android app's SHA256 certificate
  ]
}

# Creates a Firebase Apple App in the new project created earlier.
resource "google_firebase_apple_app" "app" {
  provider     = google-beta
  project      = google_firebase_project.vertex.project
  display_name = "My Apple App"
  bundle_id    = "bundle.id"
  team_id      = "1234567890"
}

### Protects Vertex AI in Firebase with App Check.

# Turns on enforcement for Vertex AI in Firebase
resource "google_firebase_app_check_service_config" "vertex" {
  provider = google-beta

  project          = google_firebase_project.vertex.project
  service_id       = "firebaseml.googleapis.com"
  enforcement_mode = "ENFORCED"
}

# Enables the reCAPTCHA Enterprise API
resource "google_project_service" "recaptcha_enterprise" {
  provider = google-beta

  project = google_firebase_project.vertex.project
  service = "recaptchaenterprise.googleapis.com"

  # Don't disable the service if the resource block is removed by accident.
  disable_on_destroy = false
}

# Enables the Play Integrity API
resource "google_project_service" "play_integrity" {
  provider = google-beta

  project = google_firebase_project.vertex.project
  service = "playintegrity.googleapis.com"

  # Don't disable the service if the resource block is removed by accident.
  disable_on_destroy = false
}

# Allows the web app to use reCAPTCHA Enterprise with App Check
resource "google_firebase_app_check_recaptcha_enterprise_config" "appcheck" {
  provider = google-beta

  project   = google_firebase_project.vertex.project
  app_id    = google_firebase_web_app.app.app_id
  site_key  = "your site key"
  token_ttl = "7200s" # Optional

  depends_on = [google_project_service.recaptcha_enterprise]
}

# Registers the Android app with the Play Integrity provider
resource "google_firebase_app_check_play_integrity_config" "appcheck" {
  provider  = google-beta
  project   = google_firebase_project.vertex.project
  app_id    = google_firebase_android_app.app.app_id
  token_ttl = "7200s" # Optional

  lifecycle {
    precondition {
      condition     = length(google_firebase_android_app.app.sha256_hashes) > 0
      error_message = "Provide a SHA-256 certificate on the Android App to use App Check"
    }
  }

  depends_on = [google_project_service.play_integrity]
}

# Registers the Apple app with the AppAttest provider
resource "google_firebase_app_check_app_attest_config" "appcheck" {
  provider  = google-beta
  project   = google_firebase_project.vertex.project
  app_id    = google_firebase_apple_app.app.app_id
  token_ttl = "7200s" # Optional

  lifecycle {
    precondition {
      condition     = google_firebase_apple_app.app.team_id != ""
      error_message = "Provide a Team ID on the Apple App to use App Check"
    }
  }
}

Ta konfiguracja pokazuje, jak ręcznie udostępnić App Hostingbackend za pomocą Terraform. Takie podejście zapewnia szczegółową kontrolę nad tworzonymi zasobami, ale wymaga zdefiniowania każdego zasobu z osobna. Jest to przydatne, gdy chcesz dostosować backend poza opcjami domyślnymi.

# Creates a new Google Cloud project.
resource "google_project" "apphosting" {
  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 App Hosting).
  billing_account = "000000-000000-000000"
}

# Enables required APIs.
resource "google_project_service" "services" {
  provider = google-beta.no_user_project_override
  project  = google_project.apphosting.project_id
  for_each = toset([
    "cloudresourcemanager.googleapis.com",
    "firebase.googleapis.com",
    "firebaseapphosting.googleapis.com",
    "serviceusage.googleapis.com",
  ])
  service = each.key

  # Don't disable the service if the resource block is removed by accident.
  disable_on_destroy = false
}

# Enables Firebase services for the new project created earlier.
resource "google_firebase_project" "apphosting" {
  provider = google-beta
  project  = google_project.apphosting.project_id

  depends_on = [google_project_service.services]
}

# Creates a Firebase Web App in the new project created earlier.
resource "google_firebase_web_app" "apphosting" {
  provider     = google-beta
  project      = google_firebase_project.apphosting.project
  display_name = "My web app"
}

# Creates a Firebase App Hosting Backend
resource "google_firebase_app_hosting_backend" "example" {
  provider = google-beta
  project  = google_firebase_project.apphosting.project

  # Choose the region closest to your users
  location         = "name-of-region-for-service"
  backend_id       = "name-of-backend-for-service"
  app_id           = google_firebase_web_app.apphosting.app_id
  display_name     = "My Backend"
  serving_locality = "GLOBAL_ACCESS" # or "REGIONAL_STRICT"
  service_account  = google_service_account.service_account.email
}

# Creates the service account for Firebase App Hosting
resource "google_service_account" "service_account" {
  provider = google-beta
  project  = google_firebase_project.apphosting.project

  # Must be firebase-app-hosting-compute
  account_id                   = "firebase-app-hosting-compute"
  display_name                 = "Firebase App Hosting compute service account"

  # Do not throw if already exists
  create_ignore_already_exists = true
}

# Adds permission to the App Hosting service account
resource "google_project_iam_member" "app_hosting_sa" {
  provider = google-beta
  project  = google_firebase_project.apphosting.project

  for_each = toset([
    "roles/firebase.sdkAdminServiceAgent",
    "roles/firebaseapphosting.computeRunner"
  ])

  role   = each.key
  member = google_service_account.service_account.member
}

# Creates a Build
resource "google_firebase_app_hosting_build" "example" {
  provider = google-beta

  project          = google_firebase_app_hosting_backend.example.project
  location         = google_firebase_app_hosting_backend.example.location
  backend          = google_firebase_app_hosting_backend.example.backend_id
  build_id         = "my-build"

  source {
    container {
      # TODO: use your own image
      image = "us-docker.pkg.dev/cloudrun/container/hello"
    }
  }
}

# Rolls out the Build
resource "google_firebase_app_hosting_traffic" "example" {
  provider = google-beta

  project          = google_firebase_app_hosting_backend.example.project
  location         = google_firebase_app_hosting_backend.example.location
  backend          = google_firebase_app_hosting_backend.example.backend_id

  target {
    splits {
      build = google_firebase_app_hosting_build.example.name
      percent = 100
    }
  }
}

Ta konfiguracja pokazuje, jak udostępnić backend App Hosting za pomocą kodu aplikacji przechowywanego w repozytorium GitHub. To podejście umożliwia zarządzanie infrastrukturą i jej aktualizowanie za pomocą żądań pull na GitHubie oraz potoków CI/CD zgodnie z typowym modelem wdrożeń App Hosting.

# Creates a new Google Cloud project.
resource "google_project" "apphosting" {
  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 App Hosting).
  billing_account = "000000-000000-000000"
}

# Enables required APIs.
resource "google_project_service" "services" {
  provider = google-beta.no_user_project_override
  project  = google_project.apphosting.project_id
  for_each = toset([
    "cloudresourcemanager.googleapis.com",
    "firebase.googleapis.com",
    "firebaseapphosting.googleapis.com",
    "serviceusage.googleapis.com",
    "developerconnect.googleapis.com",
  ])
  service = each.key

  # Don't disable the service if the resource block is removed by accident.
  disable_on_destroy = false
}

# Enables Firebase services for the new project created earlier.
resource "google_firebase_project" "apphosting" {
  provider = google-beta
  project  = google_project.apphosting.project_id

  depends_on = [google_project_service.services]
}

# Creates a Firebase Web App in the new project created earlier.
resource "google_firebase_web_app" "apphosting" {
  provider     = google-beta
  project      = google_firebase_project.apphosting.project
  display_name = "My web app"
}

### Setting up Firebase App Hosting ###

# Creates a Firebase App Hosting Backend
resource "google_firebase_app_hosting_backend" "example" {
  provider = google-beta
  project  = google_firebase_project.apphosting.project

  # Choose the region closest to your users
  location         = "name-of-region-for-service"
  backend_id       = "name-of-backend-for-service"
  app_id           = google_firebase_web_app.apphosting.app_id
  display_name     = "My Backend"
  serving_locality = "GLOBAL_ACCESS" # or "REGIONAL_STRICT"
  service_account  = google_service_account.service_account.email

  codebase {
    repository = google_developer_connect_git_repository_link.my-repository.name
    root_directory = "/"
  }
}

# Creates the service account for Firebase App Hosting
resource "google_service_account" "service_account" {
  provider = google-beta
  project  = google_firebase_project.apphosting.project

  # Must be firebase-app-hosting-compute
  account_id                   = "firebase-app-hosting-compute"
  display_name                 = "Firebase App Hosting compute service account"

  # Do not throw if already exists
  create_ignore_already_exists = true
}

# Adds permission to the App Hosting service account
resource "google_project_iam_member" "app_hosting_sa" {
  provider = google-beta
  project  = google_firebase_project.apphosting.project

  for_each = toset([
    "roles/developerconnect.readTokenAccessor",
    "roles/firebase.sdkAdminServiceAgent",
    "roles/firebaseapphosting.computeRunner"
  ])

  role   = each.key
  member = google_service_account.service_account.member
}

# Configures auto rollout from GitHub
resource "google_firebase_app_hosting_traffic" "example" {
  provider = google-beta

  project  = google_firebase_app_hosting_backend.example.project
  location = google_firebase_app_hosting_backend.example.location
  backend  = google_firebase_app_hosting_backend.example.backend_id

  rollout_policy {
    codebase_branch = "main" # Or another branch
  }
}

###

### Setting up a connection to GitHub ###

# Provisions Service Agent for Developer Connect
resource "google_project_service_identity" "devconnect-p4sa" {
  provider = google-beta
  project  = google_firebase_project.apphosting.project

  service  = "developerconnect.googleapis.com"
}

# Adds permission to Developer Connect Service Agent to manager GitHub tokens
resource "google_project_iam_member" "devconnect-secret" {
  provider = google-beta
  project  = google_firebase_project.apphosting.project

  role     = "roles/secretmanager.admin"
  member   = google_project_service_identity.devconnect-p4sa.member
}

# Connects to a GitHub account
resource "google_developer_connect_connection" "my-connection" {
  provider = google-beta
  project  = google_firebase_project.apphosting.project

  # Must match the google_firebase_app_hosting_backend's location
  location = "name-of-region-for-service"

  # Must be `firebase-app-hosting-github-oauth`
  connection_id = "firebase-app-hosting-github-oauth"
  github_config {
    github_app = "FIREBASE"
  }
  depends_on = [google_project_iam_member.devconnect-secret]
}

# Follow the next steps to set up the GitHub connection
# Tip: Run terraform refresh to obtain the output
output "next_steps" {
  description = "Follow the action_uri if present to continue setup"
  value = google_developer_connect_connection.my-connection.installation_state
}

# Links a GitHub repo to the project
resource "google_developer_connect_git_repository_link" "my-repository" {
  provider = google-beta
  project  = google_firebase_project.apphosting.project
  location = google_developer_connect_connection.my-connection.location

  git_repository_link_id = "my-repo-id"
  parent_connection = google_developer_connect_connection.my-connection.connection_id
  clone_uri = "https://github.com/myuser/myrepo.git"
}

###



Rozwiązywanie problemów i najczęstsze pytania

W tym przewodniku podczas pracy z „projektami” używamy tych atrybutów Terraform:

project w bloku resource

Zalecane: jeśli to możliwe, umieść atrybut project w każdym bloku resource.

Dzięki uwzględnieniu atrybutu projektu Terraform utworzy infrastrukturę określoną w bloku zasobów w wybranym projekcie. W tym przewodniku i w naszych przykładowych plikach konfiguracyjnych stosujemy tę praktykę.

Zapoznaj się z oficjalną dokumentacją Terraform na temat project.

user_project_override w bloku provider

W przypadku udostępniania większości zasobów należy używać parametru user_project_override = true, co oznacza sprawdzanie limitu w odniesieniu do własnego projektu Firebase. Aby jednak skonfigurować nowy projekt tak, aby mógł akceptować sprawdzanie limitów, musisz najpierw użyć user_project_override = false.

Zapoznaj się z oficjalną dokumentacją Terraform na temat user_project_override.

Upewnij się, że konto użytkownika, którego używasz do uruchamiania gcloud CLIpoleceń, zaakceptowało Warunki korzystania z usług Firebase.

  • Aby to sprawdzić, zaloguj się w przeglądarce na konto użytkownika i spróbuj wyświetlić istniejący projekt Firebase w Firebasekonsoli. Jeśli możesz wyświetlić istniejący projekt Firebase, oznacza to, że konto użytkownika zaakceptowało Warunki korzystania z Firebase.

  • Jeśli nie widzisz żadnego projektu Firebase, oznacza to, że konto użytkownika prawdopodobnie nie zaakceptowało Warunków korzystania z usługi Firebase. Aby rozwiązać ten problem, utwórz nowy projekt Firebase w Firebasekonsoli i zaakceptuj Warunki korzystania z usługi Firebase w ramach procesu tworzenia projektu. Możesz od razu usunąć ten projekt w Ustawieniach projektu w konsoli.

Poczekaj kilka minut, a potem 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 polecenie terraform import. Następnie spróbuj ponownie uruchomić terraform apply.

Informacje o tym, jak importować poszczególne zasoby, znajdziesz w sekcji „Import” w dokumentacji Terraform (np. w dokumentacji „Import” dotyczącej Cloud Firestore).

Jak sugeruje błąd, Terraform może próbować jednocześnie udostępnić wiele indeksów lub utworzyć dokument, co spowodowało błąd współbieżności. Spróbuj jeszcze raz uruchomić terraform apply.

Ten błąd oznacza, że Terraform nie wie, w którym projekcie sprawdzić limit. Aby rozwiązać ten problem, sprawdź w bloku resource te elementy:

  • Upewnij się, że podano wartość atrybutu project.
  • Upewnij się, że używasz dostawcy z wartością user_project_override = true(brak aliasu), która w przykładach Firebase to google-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ć ten problem: wybierz inny identyfikator projektu.
  • Projekt powiązany z tym identyfikatorem został niedawno usunięty (jest w stanie miękkiego usunięcia).

    • Aby rozwiązać ten problem: jeśli uważasz, że projekt powiązany z tym identyfikatorem należy do Ciebie, sprawdź stan projektu za pomocą projects.get interfejsu API REST.
  • Projekt powiązany z tym identyfikatorem istnieje prawidłowo w bieżącym użytkowniku. Możliwą przyczyną błędu może być przerwanie poprzedniego terraform apply.

    • Aby rozwiązać ten problem: uruchom te polecenia:
      terraform import google_project.default PROJECT_ID a następnie
      terraform import google_firebase_project.default PROJECT_ID

Jeśli przed próbą udostępnienia domyślnej instancji Cloud Firestore udostępnisz domyślny kosz Cloud Storage (za pomocą google_app_engine_application), okaże się, że domyślna instancja Cloud Firestore została już udostępniona. Pamiętaj, że udostępniona instancja bazy danych jest w trybie Datastore, co oznacza, że nie jest dostępna dla pakietów SDK Firebase, uwierzytelniania ani Firebase Security Rules. Jeśli chcesz używać Cloud Firestore z tymi usługami Firebase, musisz opróżnić bazę danych, a potem zmienić jej typ w Google Cloud konsoli.

Gdy udostępnisz domyślny zasobnik Cloud Storage projektu (za pomocą google_app_engine_application), a projekt nie ma jeszcze domyślnej instancji Cloud Firestore, google_app_engine_application automatycznie udostępni domyślną instancję Cloud Firestore projektu.

Domyślna instancja Cloud Firestore w Twoim projekcie jest już udostępniona, więc jeśli spróbujesz ponownie udostępnić tę domyślną instancję, google_firestore_database zgłosi błąd.

Po udostępnieniu domyślnej instancji Cloud Firestore projektu nie można jej ponownie udostępnić ani zmienić jej lokalizacji. Pamiętaj, że utworzona instancja bazy danych jest w trybie Datastore, co oznacza, że nie jest dostępna dla pakietów SDK Firebase, uwierzytelniania ani Firebase Security Rules. Jeśli chcesz używać Cloud Firestore z tymi usługami Firebase, musisz opróżnić bazę danych, a potem zmienić jej typ w Google Cloud konsoli.