Terraform ve Firebase'i kullanmaya başlayın

Firebase, Terraform'u desteklemeye başlıyor. Belirli kaynaklar sağlanmış ve hizmetler etkinleştirilmiş Firebase projeleri oluşturmayı otomatikleştirmek ve standartlaştırmak isteyen bir ekipteyseniz Firebase ile Terraform'u kullanmak sizin için iyi bir seçenek olabilir.

Terraform'u Firebase ile kullanmayla ilgili temel iş akışı aşağıdakileri içerir:

  • Hazırlamak istediğiniz altyapıyı (yani, sağlamak istediğiniz kaynakları ve etkinleştirmek istediğiniz hizmetleri) belirten bir Terraform yapılandırma dosyası (.tf dosyası) oluşturup özelleştirme

  • .tf dosyasında belirtilen altyapıyı sağlamak için Terraform ile arayüz oluşturan gcloud CLI komutlarını kullanma

Terraform ve Firebase ile neler yapabilirsiniz?

Bu kılavuzda verilen örnek genel iş akışı, Android uygulaması içeren yeni bir Firebase projesi oluşturmaktır. Ancak Terraform ile çok daha fazlasını yapabilirsiniz. Örneğin:

  • Terraform'u kullanarak mevcut altyapıyı silebilir ve değiştirebilirsiniz.

  • Terraform'u kullanarak ürüne özel yapılandırmaları ve görevleri yönetin. Örneğin:

    • Firebase Authentication oturum açma sağlayıcılarını etkinleştirme
    • Cloud Storage paketleri veya veritabanı örnekleri oluşturma ve bunlar için Firebase Security Rules dağıtma.

Tüm bu görevleri tamamlamak için standart Terraform yapılandırma dosyalarını ve komutlarını kullanabilirsiniz. Bu konuda size yardımcı olmak için yaygın olarak kullanılan birkaç kullanım alanı için örnek Terraform yapılandırma dosyaları sağladık.



Terraform'u Firebase ile birlikte kullanmaya yönelik genel iş akışı

Ön koşullar

Bu kılavuz, Terraform'u Firebase ile kullanmaya yönelik bir giriş niteliğinde olduğundan Terraform hakkında temel düzeyde bilgi sahibi olduğunuzu varsaymaktadır. Bu iş akışını başlatmadan önce aşağıdaki ön koşulları tamamladığınızdan emin olun.

  • Terraform'u yükleyin ve resmi eğitimlerini kullanarak Terraform hakkında bilgi edinin.

  • Google Cloud CLI'ı (gcloud CLI) yükleyin. Kullanıcı hesabı veya hizmet hesabı kullanarak giriş yapın.

    • Kullanıcı hesabı kullanıyorsanız Firebase Hizmet Şartları'nı (Firebase HŞ) kabul etmiş olmanız gerekir. Firebase konsolunda bir Firebase projesini görüntüleyebiliyorsanız Firebase Hizmet Şartları'nı kabul etmişsinizdir.
    • Terraform'un belirli işlemleri (ör. proje oluşturma) gerçekleştirmesi için aşağıdakiler doğru olmalıdır:
      • Kullanıcı veya hizmet hesabının bu işlemler için geçerli IAM erişimine sahip olması gerekir.
      • Kullanıcı veya hizmet hesabı bir Google Cloud kuruluşunun parçasıysa kuruluş politikaları hesabın bu işlemleri yapmasına izin vermelidir.


1. Adım: Terraform yapılandırma dosyası oluşturun ve özelleştirin

Terraform yapılandırma dosyalarında iki ana bölüm bulunur (aşağıda ayrıntılı olarak açıklanmıştır):

provider cihazınızı ayarlama

Hangi Firebase ürün veya hizmetlerinden bahsedildiğine bakılmaksızın provider kurulumu gerekir.

  1. Yerel dizininizde bir Terraform yapılandırma dosyası (main.tf dosyası gibi) oluşturun.

    Bu kılavuzda, hem provider kurulumu hem de Terraform'un oluşturmasını istediğiniz tüm altyapıyı belirtmek için bu yapılandırma dosyasını kullanacaksınız. Ancak sağlayıcı ayarını nasıl dahil edeceğiniz konusunda seçenekleriniz olduğunu unutmayın.

    Terraform yapılandırmanızın geri kalanına provider kurulumu eklemek için aşağıdaki seçeneklere sahipsiniz:

    • 1. Seçenek: Tek bir Terraform .tf yapılandırma dosyasının en üstüne ekleyin (bu kılavuzda gösterildiği gibi).

      • Terraform'u yeni kullanmaya başladıysanız veya Terraform'u Firebase ile denemek istiyorsanız bu seçeneği kullanın.
    • 2. Seçenek: Oluşturulacak altyapıyı belirttiğiniz .tf dosyasından (main.tf dosyası gibi) ayrı bir .tf dosyasına (provider.tf dosyası gibi) ekleyin.

      • Kurulumu standartlaştırması gereken daha büyük bir ekipteyseniz bu seçeneği kullanın.
      • Terraform komutları çalıştırıldığında hem provider.tf dosyası hem de main.tf dosyası aynı dizinde olmalıdır.

  2. main.tf dosyasının en üstüne aşağıdaki provider ayarını ekleyin.

    Bu, Terraform ile Firebase'i kullanmanın beta sürümü olduğu için google-beta sağlayıcısını kullanmanız gerekir. Üretimde kullanırken dikkatli olun.

    # Terraform configuration to set up providers by version.
    terraform {
      required_providers {
        google-beta = {
          source  = "hashicorp/google-beta"
          version = "~> 5.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
    }

    Firebase ile Terraform'u kullanırken projeyle ilgili farklı özellik türleri (bu kılavuzda "kota kontrolü projesi" olarak adlandırılan özellikler dahil) hakkında daha fazla bilgi edinin.

  3. Yapılandırma dosyanızı tamamlamak ve oluşturulacak altyapıyı belirtmek için bir sonraki bölüme geçin.

resource bloklarını kullanarak hangi altyapının oluşturulacağını belirtme

Terraform yapılandırma dosyanızda (bu kılavuzda main.tf dosyanız), Terraform'un oluşturmasını istediğiniz tüm altyapıyı (yani, temel hazırlığı yapmak istediğiniz tüm kaynakları ve etkinleştirmek istediğiniz tüm hizmetleri) belirtmeniz gerekir. Bu kılavuzda, Terraform'u destekleyen tüm Firebase kaynaklarının tam listesini bulabilirsiniz.

  1. main.tf dosyanızı açın.

  2. provider kurulumunun altına aşağıdaki resource blok yapılandırmasını ekleyin.

    Bu temel örnekte, yeni bir Firebase projesi oluşturulur ve ardından bu proje içinde bir Firebase Android uygulaması oluşturulur.

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

Kaynak olarak proje ve uygulamaların altyapısına aşina değilseniz aşağıdaki dokümanları inceleyin:

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


2. adım: Belirtilen altyapıyı oluşturmak için Terraform komutlarını çalıştırın

Kaynakları sağlamak ve main.tf dosyanızda belirtilen hizmetleri etkinleştirmek için main.tf dosyanızla aynı dizinden aşağıdaki komutları çalıştırın. Bu komutlar hakkında ayrıntılı bilgi için Terraform belgelerine bakın.

  1. Dizinde Terraform komutlarını ilk kez çalıştırıyorsanız yapılandırma dizinini başlatmanız ve Google Terraform sağlayıcısını yüklemeniz gerekir. Bunun için aşağıdaki komutu çalıştırın:

    terraform init
  2. Aşağıdaki komutu çalıştırarak main.tf dosyanızda belirtilen altyapıyı oluşturun:

    terraform apply
  3. Her şeyin beklendiği gibi temel hazırlığının yapıldığını veya etkinleştirildiğini onaylayın:

    • 1. Seçenek: Aşağıdaki komutu çalıştırarak yapılandırmayı terminalinizde yazdırın:

      terraform show
    • 2. seçenek: Firebase projenizi Firebase konsolunda görüntüleyin.



Terraform desteğine sahip Firebase kaynakları

Aşağıdaki Firebase ve Google kaynakları Terraform desteğine sahiptir. Ayrıca, bu sayfaya her gün yeni kaynaklar ekliyoruz. Bu nedenle, Terraform ile yönetmek istediğiniz kaynağı görmüyorsanız kullanılabilir olup olmadığını görmek için kısa süre sonra tekrar kontrol edin veya GitHub deposunda sorun kaydı açarak kaynağı isteyin.


Firebase projesi ve uygulama yönetimi

  • google_firebase_project: Mevcut bir Google Cloud projesinde Firebase hizmetlerini etkinleştirme

  • Firebase uygulamaları


Firebase Authentication

Henüz desteklenmeyenler:

  • Terraform üzerinden çok faktörlü kimlik doğrulamayı (MFA) yapılandırma

Firebase Data Connect


Firebase Realtime Database

Henüz desteklenmeyenler:

  • Firebase Realtime Database Security Rules'ü Terraform aracılığıyla dağıtma (programlı seçenekler dahil olmak üzere diğer araçları kullanarak bu Rules'leri nasıl dağıtacağınızı öğrenin)

Cloud Firestore

  • google_firestore_database: Cloud Firestore örneği oluşturma

  • google_firestore_index: Cloud Firestore için verimli sorgular etkinleştirilir.

  • google_firestore_document: Cloud Firestore örneğini bir koleksiyondaki belirli bir dokümanla başlatın

    Önemli: Bu ilk belgede gerçek son kullanıcı veya üretim verileri kullanmayın.


Cloud Storage for Firebase

  • google_firebase_storage_bucket: Mevcut bir Cloud Storage paketini Firebase SDK'ları, kimlik doğrulama ve Firebase Security Rules için erişilebilir hale getirin.

  • google_storage_bucket_object: Cloud Storage paketine nesne ekleme

    Önemli: Bu dosyada gerçek son kullanıcı veya üretim verileri kullanmayın.


Firebase Security Rules (Cloud Firestore ve Cloud Storage için)

Firebase Realtime Database'ün Firebase Security Rules için farklı bir temel hazırlama sistemi kullandığını unutmayın.

  • google_firebaserules_ruleset: Cloud Firestore örneği veya Cloud Storage paketi için geçerli Firebase Security Rules'ı tanımlar

  • google_firebaserules_release: Belirli kural kümelerini bir Cloud Firestore örneğine veya Cloud Storage paketine dağıtma


Firebase App Check


Firebase Extensions



Yaygın kullanım alanları için örnek Terraform yapılandırma dosyaları

Bu yapılandırma yeni bir Google Cloud projesi oluşturur, projeyi bir Cloud Billing hesabıyla ilişkilendirir (GCIP ile Firebase Authentication için Blaze fiyatlandırma planı gerekir), proje için Firebase hizmetlerini etkinleştirir, GCIP ile Firebase Authentication'i kurar ve projeye üç farklı uygulama türünü kaydeder.

Firebase Authentication'ü Terraform üzerinden ayarlamak için GCIP'nin etkinleştirilmesi gerektiğini unutmayın.

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

Bu yapılandırma, yeni bir Google Cloud projesi oluşturur, proje için Firebase hizmetlerini etkinleştirir ve bir Data Connect hizmeti sağlar.

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

Bu yapılandırma, yeni bir Google Cloud projesi oluşturur, proje için Firebase hizmetlerini etkinleştirir, projenin varsayılan Realtime Database örneğini sağlar ve projeye üç farklı uygulama türünü kaydeder.

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

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

Bu yapılandırma yeni bir Google Cloud projesi oluşturur, projeyi bir Cloud Billing hesabıyla ilişkilendirir (birden fazla Realtime Database örneği için Blaze fiyatlandırma planı gerekir), proje için Firebase hizmetlerini etkinleştirir, projenin varsayılan Realtime Database örneği dahil olmak üzere birden fazla Realtime Database örneği sağlar ve projeye üç farklı uygulama türünü kaydeder.

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

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

Bu yapılandırma, yeni bir Google Cloud projesi oluşturur, proje için Firebase hizmetlerini etkinleştirir, projenin varsayılan Cloud Firestore örneğini sağlar ve projeye üç farklı uygulama türünü kaydeder.

Ayrıca varsayılan Cloud Firestore örneği için Firebase Security Rules hazırlığı yapar, Cloud Firestore dizini oluşturur ve başlangıç verileri içeren bir Cloud Firestore dokümanı ekler.

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

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

Bu, firestore.rules adlı yerel bir dosyada bulunması gereken Cloud Firestore Security Rules kural kümesidir.

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

Bu yapılandırma yeni bir Google Cloud projesi oluşturur, projeyi bir Cloud Billing hesabıyla ilişkilendirir (ek paketler için Blaze fiyatlandırma planı gerekir), proje için Firebase hizmetlerini etkinleştirir, varsayılan olmayan ek Cloud Storage paketleri sağlar ve projeye üç farklı uygulama türünü kaydeder.

Ayrıca her Cloud Storage paketi için Firebase Security Rules hazırlayarak Cloud Storage paketlerinden birine bir dosya yükler.

# 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 a Cloud Storage bucket.
resource "google_storage_bucket" "bucket-1" {
  provider = google-beta
  project  = google_project.storage-multi.project_id
  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_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 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_project.storage-multi.project_id
  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_project.storage-multi.project_id
  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_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 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_project.storage-multi.project_id
}

# 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_project.storage-multi.project_id
}

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

  # Wait for Firebase to be enabled in the Google Cloud project before creating this App.
  depends_on = [
    google_firebase_project.storage-multi,
  ]
}

Bu, storage.rules adlı yerel bir dosyada bulunması gereken Cloud Storage Security Rules kural kümesidir.

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

Bu yapılandırma, yeni bir Google Cloud projesi oluşturur, proje için Firebase hizmetlerini etkinleştirir ve Cloud Firestore için Firebase App Check'yi ayarlayıp etkinleştirir. Böylece, yalnızca Android uygulamanızdan erişilebilir.

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

Bu yapılandırma, yeni bir Google Cloud projesi oluşturur, proje için Firebase hizmetlerini etkinleştirir ve projeye yeni bir Firebase Extension örneği yükler. Örnek zaten mevcutsa parametreleri, yapılandırmada sağlanan değerlere göre güncellenir.

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



Sorun giderme ve SSS

Bu kılavuzda, "projects" ile çalışırken aşağıdaki Terraform özellikleri kullanılır.

resource bloğu içinde project

Önerilen: Mümkün olduğunda her resource bloğuna project özelliğini ekleyin

Terraform, bir proje özelliği ekleyerek belirtilen projedeki kaynak bloğunda belirtilen altyapıyı oluşturur. Bu kılavuzda ve örnek yapılandırma dosyalarımızda bu uygulama kullanılmaktadır.

project ile ilgili resmi Terraform belgelerini inceleyin.

provider bloğu içindeki user_project_override

Çoğu kaynağın temel hazırlığını yapmak için user_project_override = true değerini kullanmanız gerekir. Bu, kotayı kendi Firebase projenize göre kontrol etmeniz anlamına gelir. Ancak yeni projenizi kota kontrollerini kabul edecek şekilde ayarlamak için önce user_project_override = false kullanmanız gerekir.

user_project_override ile ilgili resmi Terraform belgelerini inceleyin.

gcloud CLIKomutları yürütmek için kullandığınız kullanıcı hesabının Firebase Hizmet Şartları'nı (Firebase Hizmet Şartları) kabul ettiğinden emin olun.

  • Bu kontrolü, kullanıcı hesabında oturum açmış bir tarayıcı kullanarak ve Firebase konsolunda mevcut bir Firebase projesini görüntülemeye çalışarak yapabilirsiniz. Mevcut bir Firebase projesini görüntüleyebiliyorsanız kullanıcı hesabı Firebase Hizmet Şartları'nı kabul etmiş demektir.

  • Mevcut Firebase projelerini görüntüleyemiyorsanız kullanıcı hesabı muhtemelen Firebase Hizmet Şartları'nı kabul etmemiştir. Bu sorunu düzeltmek için Firebase konsolu üzerinden yeni bir Firebase projesi oluşturun ve proje oluşturma işleminin bir parçası olarak Firebase Hizmet Şartları'nı kabul edin. Bu projeyi konsoldaki Proje Ayarları'ndan hemen silebilirsiniz.

Birkaç dakika bekleyip terraform apply uygulamasını tekrar çalıştırmayı deneyin.

Bu durum, çeşitli sistemlerdeki dağıtım gecikmesinden kaynaklanabilir. terraform import komutunu çalıştırarak kaynağı Terraform durumuna aktararak bu sorunu çözmeyi deneyin. Ardından terraform apply'ü tekrar çalıştırmayı deneyin.

Her kaynağı nasıl içe aktaracağınızı, ilgili Terraform dokümanının "İçe aktarma" bölümünde (örneğin, Cloud Firestore için"İçe aktarma" dokümanı) öğrenebilirsiniz.

Hata mesajında belirtildiği gibi, Terraform birden fazla dizin sağlamaya ve/veya aynı anda bir doküman oluşturmaya çalışıyor olabilir ve eşzamanlılık hatasıyla karşılaşmış olabilir. terraform apply'ü tekrar çalıştırmayı deneyin.

Bu hata, Terraform'un kotayı hangi projeye göre kontrol edeceğini bilmediği anlamına gelir. Sorun gidermek için resource bloğunda şunları kontrol edin:

  • project özelliği için bir değer belirttiğinizden emin olun.
  • Sağlayıcıyı user_project_override = true ile kullandığınızdan emin olun (takma ad yok). Firebase örneklerinde bu değer google-beta'tır.

Proje kimliğinin zaten mevcut olmasının olası nedenleri şunlardır:

  • İlgili kimlikle ilişkili proje başkasına ait.

    • Sorunu çözmek için: Başka bir proje kimliği seçin.
  • İlgili kimlikle ilişkili proje yakın zamanda silinmiş (yumuşak silme durumunda).

    • Sorunu çözmek için: Kimlikle ilişkili projenin size ait olduğunu düşünüyorsanız projects.get REST API'yi kullanarak projenin durumunu kontrol edin.
  • İlgili kimlikle ilişkilendirilmiş proje, mevcut kullanıcı altında doğru şekilde mevcuttur. Hatanın olası bir nedeni, önceki bir terraform apply işleminin kesintiye uğramasıdır.

    • Sorunu çözmek için: Aşağıdaki komutları çalıştırın:
      terraform import google_project.default PROJECT_ID ve ardından
      terraform import google_firebase_project.default PROJECT_ID

Varsayılan Cloud Firestore örneğinizi temel hazırlığa almaya önce varsayılan Cloud Storage paketinizi (google_app_engine_application aracılığıyla) temel hazırlığa aldıysanız varsayılan Cloud Firestore örneğinizin zaten temel hazırlığa alınmış olduğunu görürsünüz. Yapılandırılmış veritabanı örneğinin Datastore modunda olduğunu unutmayın. Bu, Firebase SDK'ları, kimlik doğrulama veya Firebase Security Rules tarafından erişilebilir olmadığı anlamına gelir. Cloud Firestore'ü bu Firebase hizmetleriyle kullanmak istiyorsanız veritabanını boşaltmanız ve ardından Google Cloud konsolunda veritabanı türünü değiştirmeniz gerekir.

Bir projenin varsayılan Cloud Storage paketini (google_app_engine_application aracılığıyla) hazırladığınızda ve projenin henüz varsayılan Cloud Firestore örneği yoksa google_app_engine_application, projenin varsayılan Cloud Firestore örneğini otomatik olarak hazırlar.

Bu nedenle, projenizin varsayılan Cloud Firestore örneği zaten hazırlanmış olduğundan, bu varsayılan örneği açıkça tekrar hazırlamaya çalışırsanız google_firestore_database hatası alırsınız.

Projenin varsayılan Cloud Firestore örneği için temel hazırlama işlemi yapıldıktan sonra bu örneği "yeniden hazırlayamaz" veya konumunu değiştiremezsiniz. Yapılandırılmış veritabanı örneğinin Datastore modunda olduğunu unutmayın. Bu, Firebase SDK'ları, kimlik doğrulama veya Firebase Security Rules tarafından erişilebilir olmadığı anlamına gelir. Cloud Firestore'yi bu Firebase hizmetleriyle kullanmak istiyorsanız veritabanını boşaltmanız ve ardından Google Cloud konsolunda veritabanı türünü değiştirmeniz gerekir.