با Terraform و Firebase شروع کنید

Firebase شروع به پشتیبانی از Terraform کرده است. اگر در تیمی هستید که می‌خواهد ایجاد پروژه‌های Firebase را با منابع خاص و فعال‌سازی خدمات به‌طور خودکار و استاندارد کند، استفاده از Terraform با Firebase می‌تواند برای شما مناسب باشد.

گردش کار اصلی برای استفاده از Terraform با Firebase شامل موارد زیر است:

  • ایجاد و سفارشی کردن یک فایل پیکربندی Terraform (یک فایل .tf ) که زیرساختی را که می خواهید تهیه کنید (یعنی منابعی که می خواهید تهیه کنید و خدماتی که می خواهید فعال کنید) را مشخص می کند.

  • با استفاده از دستورات gcloud CLI که با Terraform ارتباط برقرار می کند تا زیرساخت مشخص شده در فایل .tf را فراهم کند.

با Terraform و Firebase چه کاری می توانید انجام دهید؟

نمونه گردش کار تعمیم یافته در این راهنما ایجاد یک پروژه Firebase جدید با یک برنامه Android است. اما شما می توانید کارهای بیشتری را با Terraform انجام دهید، مانند:

  • زیرساخت های موجود را با استفاده از Terraform حذف و اصلاح کنید.

  • پیکربندی و وظایف خاص محصول را با استفاده از Terraform مدیریت کنید، مانند:

    • فعال کردن ارائه دهندگان ورود به Firebase Authentication .
    • ایجاد سطل های Cloud Storage یا نمونه های پایگاه داده و استقرار Firebase Security Rules برای آنها.

می‌توانید از فایل‌ها و دستورات پیکربندی استاندارد Terraform برای انجام تمام این وظایف استفاده کنید. و برای کمک به شما در این زمینه، نمونه فایل‌های پیکربندی Terraform را برای چندین مورد معمول ارائه کرده‌ایم.



گردش کار تعمیم یافته برای استفاده از Terraform با Firebase

پیش نیازها

این راهنما مقدمه ای برای استفاده از Terraform با Firebase است، بنابراین مهارت اولیه با Terraform را فرض می کند. مطمئن شوید که پیش نیازهای زیر را قبل از شروع این گردش کار تکمیل کرده اید.

  • Terraform را نصب کنید و با استفاده از آموزش های رسمی Terraform با Terraform آشنا شوید.

  • Google Cloud CLI ( gcloud CLI ) را نصب کنید. با استفاده از یک حساب کاربری یا یک حساب سرویس وارد شوید.

    • اگر از حساب کاربری استفاده می کنید، باید شرایط خدمات Firebase (ToS Firebase) را پذیرفته باشید. اگر می‌توانید پروژه Firebase را در کنسول Firebase مشاهده کنید، شرایط Firebase را پذیرفته‌اید
    • برای اینکه Terraform اقدامات خاصی انجام دهد (مثلاً ایجاد پروژه ها)، موارد زیر باید درست باشد:
      • حساب کاربری یا سرویس باید دسترسی IAM قابل اجرا برای آن اقدامات را داشته باشد.
      • اگر حساب کاربری یا سرویس بخشی از یک سازمان Google Cloud است، خط‌مشی‌های سازمان باید به حساب اجازه دهد تا این اقدامات را انجام دهد.


مرحله 1: یک فایل پیکربندی Terraform را ایجاد و سفارشی کنید

یک فایل پیکربندی Terraform به دو بخش اصلی نیاز دارد (که در زیر به تفصیل توضیح داده شده است):

provider خود را تنظیم کنید

بدون توجه به اینکه کدام محصولات یا خدمات Firebase درگیر هستند، راه اندازی provider مورد نیاز است.

  1. یک فایل پیکربندی Terraform (مانند فایل main.tf ) در فهرست محلی خود ایجاد کنید.

    در این راهنما، از این فایل پیکربندی برای تعیین تنظیمات provider و تمام زیرساخت هایی که می خواهید Terraform ایجاد کند، استفاده خواهید کرد. با این حال، توجه داشته باشید که گزینه هایی برای نحوه گنجاندن تنظیمات ارائه دهنده دارید.

    شما گزینه های زیر را برای نحوه اضافه کردن یک provider به بقیه پیکربندی Terraform خود دارید:

    • گزینه 1: آن را در بالای یک فایل پیکربندی Terraform .tf قرار دهید (همانطور که در این راهنما نشان داده شده است).

      • اگر تازه با Terraform شروع کرده اید یا فقط Terraform را با Firebase امتحان می کنید، از این گزینه استفاده کنید.
    • گزینه 2: آن را در یک فایل .tf جداگانه (مانند یک فایل provider.tf ) قرار دهید، به غیر از فایل .tf که در آن زیرساختی را برای ایجاد مشخص کرده اید (مانند یک فایل main.tf ).

      • اگر عضو یک تیم بزرگتر هستید که نیاز به استانداردسازی راه اندازی دارند، از این گزینه استفاده کنید.
      • هنگام اجرای دستورات Terraform، هم فایل provider.tf و هم فایل main.tf باید در یک دایرکتوری باشند.

  2. تنظیمات provider زیر را در بالای فایل main.tf قرار دهید.

    شما باید از ارائه دهنده google-beta استفاده کنید زیرا این نسخه بتا استفاده از Firebase با Terraform است. هنگام استفاده در تولید احتیاط کنید.

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

    هنگام استفاده از Terraform با Firebase، درباره انواع مختلف ویژگی‌های مرتبط با پروژه (از جمله آنچه که این راهنما «پروژه بررسی سهمیه» می‌نامد) بیشتر بیاموزید.

  3. برای تکمیل فایل کانفیگ خود به بخش بعدی بروید و مشخص کنید چه زیرساختی ایجاد شود.

مشخص کنید چه زیرساختی با استفاده از بلوک های resource ایجاد شود

در فایل پیکربندی Terraform (برای این راهنما، فایل main.tf شما)، باید تمام زیرساخت هایی را که می خواهید Terraform ایجاد کند، مشخص کنید (یعنی تمام منابعی که می خواهید ارائه کنید و همه سرویس هایی که می خواهید فعال کنید). در این راهنما، فهرست کاملی از تمام منابع Firebase را که از Terraform پشتیبانی می‌کنند ، بیابید.

  1. فایل main.tf خود را باز کنید.

  2. در تنظیمات provider ، پیکربندی زیر را از بلوک های resource وارد کنید.

    این مثال اولیه یک پروژه Firebase جدید ایجاد می کند و سپس یک برنامه Android Firebase را در آن پروژه ایجاد می کند.

    # Terraform configuration to set up providers by version.
    ...
    
    # Configures the provider to use the resource block's specified project for quota checks.
    ...
    
    # Configures the provider to not use the resource block's specified project for quota checks.
    ...
    
    # Creates a new Google Cloud project.
    resource "google_project" "default" {
      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,
      ]
    }

اگر با زیرساخت پروژه ها و برنامه ها به عنوان منابع آشنا نیستید، اسناد زیر را بررسی کنید:

# 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: دستورات Terraform را برای ایجاد زیرساخت مشخص شده اجرا کنید

برای تهیه منابع و فعال کردن خدمات مشخص شده در فایل main.tf ، دستورات زیر را از همان دایرکتوری فایل main.tf خود اجرا کنید. برای اطلاعات دقیق در مورد این دستورات، به مستندات Terraform مراجعه کنید.

  1. اگر این اولین باری است که دستورات Terraform را در دایرکتوری اجرا می کنید، باید دایرکتوری پیکربندی را مقداردهی اولیه کنید و ارائه دهنده Google Terraform را نصب کنید. این کار را با اجرای دستور زیر انجام دهید:

    terraform init
  2. زیرساخت مشخص شده در فایل main.tf خود را با اجرای دستور زیر ایجاد کنید:

    terraform apply
  3. تأیید کنید که همه چیز مطابق انتظار ارائه یا فعال شده است:

    • گزینه 1: پیکربندی چاپ شده در ترمینال خود را با اجرای دستور زیر مشاهده کنید:

      terraform show
    • گزینه 2: پروژه Firebase خود را در کنسول Firebase مشاهده کنید.



منابع Firebase با پشتیبانی Terraform

منابع Firebase و Google زیر دارای پشتیبانی Terraform هستند. و ما همیشه منابع بیشتری را اضافه می کنیم! بنابراین اگر منبعی را که می‌خواهید با Terraform مدیریت کنید نمی‌بینید، به زودی دوباره بررسی کنید تا ببینید آیا در دسترس است یا با ثبت مشکل در مخزن GitHub آن را درخواست کنید.


مدیریت پروژه و برنامه Firebase

  • google_firebase_project — خدمات Firebase را در یک پروژه Google Cloud موجود فعال کنید

  • برنامه های Firebase


Firebase Authentication

  • google_identity_platform_configGoogle Cloud Identity Platform (GCIP) را فعال کنید (که پشتیبان Firebase Authentication است) و تنظیمات احراز هویت در سطح پروژه را ارائه دهید

    • پیکربندی Firebase Authentication از طریق Terraform نیاز به فعال کردن GCIP دارد. مطمئن شوید که فایل نمونه .tf را برای نحوه تنظیم Firebase Authentication مرور کنید.

    • پروژه‌ای که در آن Terraform Firebase Authentication فعال می‌کند باید در طرح قیمت‌گذاری Blaze باشد (یعنی پروژه باید یک حساب Cloud Billing مرتبط داشته باشد). می توانید این کار را به صورت برنامه نویسی با تنظیم ویژگی billing_account در منبع google_project انجام دهید.

    • این منبع همچنین پیکربندی‌های بیشتری را فعال می‌کند، مانند روش‌های ورود به سیستم محلی، مانند تأیید هویت ناشناس، ایمیل/رمز عبور، و احراز هویت تلفن، و همچنین مسدود کردن توابع و دامنه‌های مجاز.

  • google_identity_platform_default_supported_idp_config — پیکربندی ارائه دهندگان هویت مشترک فدرال، مانند Google، Facebook، یا Apple

  • identity_platform_oauth_idp_config — پیکربندی منابع اختیاری OAuth Identity Provider (IdP)

  • google_identity_platform_inbound_saml_config — پیکربندی ادغام SAML

هنوز پشتیبانی نشده است:

  • پیکربندی احراز هویت چند عاملی (MFA) از طریق Terraform

Firebase Data Connect


Firebase Realtime Database

هنوز پشتیبانی نشده است:

  • استقرار Firebase Realtime Database Security Rules از طریق Terraform (با نحوه استقرار این Rules با استفاده از ابزارهای دیگر، از جمله گزینه های برنامه نویسی آشنا شوید)

Cloud Firestore

  • google_firestore_database - یک نمونه Cloud Firestore ایجاد کنید

  • google_firestore_index - پرس و جوهای کارآمد را برای Cloud Firestore فعال کنید

  • google_firestore_document - یک نمونه Cloud Firestore با یک سند خاص در یک مجموعه نشان دهید

    مهم: از داده‌های کاربر نهایی یا تولید در این سند اولیه استفاده نکنید.


Cloud Storage for Firebase

  • google_firebase_storage_bucket — یک سطل Cloud Storage موجود را برای SDK های Firebase، احراز هویت و Firebase Security Rules قابل دسترس کنید

  • google_storage_bucket_object — یک شی را به یک سطل Cloud Storage اضافه کنید

    مهم: از داده های کاربر نهایی یا تولید در این فایل استفاده نکنید.


Firebase Security Rules (برای Cloud Firestore و Cloud Storage )

توجه داشته باشید که Firebase Realtime Database از یک سیستم تامین متفاوت برای Firebase Security Rules خود استفاده می کند.

  • google_firebaserules_rulesetFirebase Security Rules تعریف کنید که برای نمونه Cloud Firestore یا سطل Cloud Storage اعمال می شود

  • google_firebaserules_release - استقرار قوانین خاصی در یک نمونه Cloud Firestore یا یک سطل Cloud Storage


Firebase App Check


Firebase Extensions



نمونه فایل های پیکربندی Terraform برای موارد استفاده رایج

این پیکربندی یک پروژه Google Cloud جدید ایجاد می‌کند، پروژه را با یک حساب Cloud Billing مرتبط می‌کند (طرح قیمت‌گذاری Blaze برای Firebase Authentication با GCIP مورد نیاز است)، خدمات Firebase را برای پروژه فعال می‌کند، Firebase Authentication با GCIP تنظیم می‌کند و سه نوع برنامه مختلف را در پروژه ثبت می‌کند.

توجه داشته باشید که فعال کردن GCIP برای راه‌اندازی Firebase Authentication از طریق Terraform لازم است.

# Creates a new Google Cloud project.
resource "google_project" "auth" {
  provider  = google-beta.no_user_project_override
  folder_id = "folder-id-for-new-project"
  name            = "Project Display Name"
  project_id      = "project-id-for-new-project"

  # Associates the project with a Cloud Billing account
  # (required for Firebase Authentication with GCIP).
  billing_account = "000000-000000-000000"

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

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

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

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

  depends_on = [
    google_project_service.auth,
  ]
}

# Creates an Identity Platform config.
# Also enables Firebase Authentication with Identity Platform in the project if not.
resource "google_identity_platform_config" "auth" {
  provider = google-beta
  project  = google_project.auth.project_id

  # Auto-deletes anonymous users
  autodelete_anonymous_users = true

  # Configures local sign-in methods, like anonymous, email/password, and phone authentication.
  sign_in {
    allow_duplicate_emails = true

    anonymous {
      enabled = true
    }

    email {
      enabled = true
      password_required = false
    }

    phone_number {
      enabled = true
      test_phone_numbers = {
        "+11231231234" = "000000"
      }
    }
  }

  # Sets an SMS region policy.
  sms_region_config {
    allowlist_only {
      allowed_regions = [
        "US",
        "CA",
      ]
    }
  }

  # Configures blocking functions.
  blocking_functions {
    triggers {
      event_type = "beforeSignIn"
      function_uri = "https://us-east1-${google_project.auth.project_id}.cloudfunctions.net/before-sign-in"
    }
    forward_inbound_credentials {
      refresh_token = true
      access_token = true
      id_token = true
    }
  }

  # Configures a temporary quota for new signups for anonymous, email/password, and phone number.
  quota {
    sign_up_quota_config {
      quota = 1000
      start_time = ""
      quota_duration = "7200s"
    }
  }

  # Configures authorized domains.
  authorized_domains = [
    "localhost",
    "${google_project.auth.project_id}.firebaseapp.com",
    "${google_project.auth.project_id}.web.app",
  ]

  # Wait for identitytoolkit.googleapis.com to be enabled before initializing Authentication.
  depends_on = [
    google_project_service.auth,
  ]
}

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

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

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

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

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

  # The other App types (Android and Apple) use "DELETE" by default.
  # Web apps don't use "DELETE" by default due to backward-compatibility.
  deletion_policy = "DELETE"

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

این پیکربندی یک پروژه جدید Google Cloud ایجاد می‌کند، خدمات Firebase را برای پروژه فعال می‌کند و یک سرویس Data Connect ارائه می‌کند.

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

این پیکربندی یک پروژه Google Cloud جدید ایجاد می‌کند، خدمات Firebase را برای پروژه فعال می‌کند، نمونه پیش‌فرض Realtime Database پروژه را ارائه می‌کند و سه نوع برنامه مختلف را در پروژه ثبت می‌کند.

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

این پیکربندی یک پروژه Google Cloud جدید ایجاد می‌کند، پروژه را با یک حساب Cloud Billing مرتبط می‌کند (طرح قیمت‌گذاری Blaze برای چندین نمونه Realtime Database مورد نیاز است)، خدمات Firebase را برای پروژه فعال می‌کند، چندین نمونه Realtime Database (شامل نمونه Realtime Database پروژه پیش‌فرض) را ارائه می‌کند و سه نوع پروژه مختلف برنامه را با پروژه ثبت می‌کند.

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

این پیکربندی یک پروژه Google Cloud جدید ایجاد می‌کند، خدمات Firebase را برای پروژه فعال می‌کند، نمونه پیش‌فرض Cloud Firestore پروژه را ارائه می‌کند و سه نوع برنامه مختلف را در پروژه ثبت می‌کند.

همچنین Firebase Security Rules برای نمونه پیش‌فرض Cloud Firestore ارائه می‌کند، یک فهرست Cloud Firestore ایجاد می‌کند و یک سند Cloud Firestore با داده‌های اولیه اضافه می‌کند.

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

این مجموعه قوانین Cloud Firestore Security Rules است که باید در یک فایل محلی به نام firestore.rules باشد.

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

این پیکربندی یک پروژه Google Cloud جدید ایجاد می‌کند، پروژه را با یک حساب Cloud Billing مرتبط می‌کند (طرح قیمت‌گذاری Blaze برای سطل‌های اضافی مورد نیاز است)، خدمات Firebase را برای پروژه فعال می‌کند، سطل‌های اضافی و غیر پیش‌فرض Cloud Storage ارائه می‌کند و سه نوع برنامه مختلف را در پروژه ثبت می‌کند.

همچنین Firebase Security Rules برای هر سطل Cloud Storage ارائه می‌کند و یک فایل را در یکی از سطل‌های Cloud Storage آپلود می‌کند.

# Creates a new Google Cloud project.
resource "google_project" "storage-multi" {
  provider  = google-beta.no_user_project_override
  folder_id = "folder-id-for-new-project"
  name            = "Project Display Name"
  project_id      = "project-id-for-new-project"

  # Associates the project with a Cloud Billing account
  # (required for multiple Cloud Storage buckets).
  billing_account = "000000-000000-000000"

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

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

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

# Enables Firebase services for the new project created above.
resource "google_firebase_project" "storage-multi" {
  provider = google-beta
  project  = google_project.storage-multi.project_id
}

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

این مجموعه Cloud Storage Security Rules است که باید در یک فایل محلی به نام storage.rules باشد.

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

این پیکربندی یک پروژه Google Cloud جدید ایجاد می‌کند، خدمات Firebase را برای پروژه فعال می‌کند، و Firebase App Check را برای Cloud Firestore تنظیم و فعال می‌کند تا فقط از برنامه Android شما قابل دسترسی باشد.

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

این پیکربندی یک پروژه Google Cloud جدید ایجاد می‌کند، خدمات Firebase را برای پروژه فعال می‌کند و نمونه جدیدی از یک Firebase Extension را در پروژه نصب می‌کند. اگر نمونه از قبل وجود داشته باشد، پارامترهای آن بر اساس مقادیر ارائه شده در پیکربندی به روز می شوند.

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



عیب یابی و سوالات متداول

این راهنما هنگام کار با "پروژه ها" از ویژگی های Terraform زیر استفاده می کند.

project در یک بلوک resource

توصیه می شود: در صورت امکان، ویژگی project را در هر بلوک resource قرار دهید

Terraform با گنجاندن ویژگی پروژه، زیرساخت مشخص شده در بلوک منبع را در پروژه مشخص شده ایجاد می کند. این راهنما و فایل‌های پیکربندی نمونه ما همگی از این روش استفاده می‌کنند.

مستندات رسمی Terraform در مورد project را ببینید.

user_project_override در بلوک provider

برای تهیه بیشتر منابع، باید از user_project_override = true استفاده کنید، که به معنای بررسی سهمیه در برابر پروژه Firebase خودتان است. با این حال، برای تنظیم پروژه جدید خود به گونه‌ای که بتواند بررسی سهمیه را بپذیرد، ابتدا باید از user_project_override = false استفاده کنید.

به مستندات رسمی Terraform درباره user_project_override مراجعه کنید.

اطمینان حاصل کنید که حساب کاربری که برای اجرای دستورات gcloud CLI استفاده می‌کنید، شرایط سرویس Firebase (Firebase ToS) را پذیرفته است.

  • می‌توانید این بررسی را با استفاده از مرورگری که به حساب کاربری وارد شده‌اید و تلاش برای مشاهده پروژه Firebase موجود در کنسول Firebase انجام دهید. اگر می توانید یک پروژه Firebase موجود را مشاهده کنید، پس حساب کاربری شرایط Firebase را پذیرفته است.

  • اگر نمی‌توانید پروژه Firebase موجود را مشاهده کنید، احتمالاً حساب کاربری Firebase ToS را نپذیرفته است. برای رفع این مشکل، یک پروژه Firebase جدید از طریق کنسول Firebase ایجاد کنید و Firebase ToS را به عنوان بخشی از ایجاد پروژه بپذیرید. شما می توانید بلافاصله این پروژه را از طریق تنظیمات پروژه در کنسول حذف کنید.

چند دقیقه صبر کنید، و سپس اجرای terraform apply دوباره امتحان کنید.

این می تواند به دلیل تاخیر در انتشار در سیستم های مختلف باشد. سعی کنید این مشکل را با وارد کردن منبع به حالت Terraform با اجرای terraform import حل کنید. سپس دوباره اجرای terraform apply امتحان کنید.

می‌توانید نحوه وارد کردن هر منبع را در بخش «واردات» مستندات Terraform آن (مثلاً اسناد «وارد کردن» برای Cloud Firestore ) بیاموزید.

همانطور که خطا نشان می دهد، Terraform ممکن است در تلاش برای ارائه چندین شاخص و/یا ایجاد یک سند به طور همزمان باشد و با یک خطای همزمانی مواجه شود. دوباره اجرای terraform apply امتحان کنید.

این خطا به این معنی است که Terraform نمی‌داند کدام پروژه باید سهمیه را بررسی کند. برای عیب یابی، موارد زیر را در بلوک resource بررسی کنید:

  • مطمئن شوید که مقداری برای ویژگی project مشخص کرده اید.
  • مطمئن شوید که از ارائه دهنده با user_project_override = true (بدون نام مستعار) استفاده می کنید که در نمونه های Firebase google-beta است.

در اینجا دلایل احتمالی ممکن است ID پروژه وجود داشته باشد:

  • پروژه مرتبط با آن شناسه متعلق به شخص دیگری است.

    • برای حل: شناسه پروژه دیگری را انتخاب کنید.
  • پروژه مرتبط با آن شناسه اخیراً حذف شده است (در حالت حذف نرم).

    • برای حل: اگر فکر می کنید که پروژه مرتبط با ID متعلق به شماست، با استفاده از projects.get REST API وضعیت پروژه را بررسی کنید.
  • پروژه مرتبط با آن شناسه به درستی تحت کاربر فعلی وجود دارد. یک دلیل احتمالی برای خطا می‌تواند این باشد که یک terraform apply قطع شده است.

    • برای حل: دستورات زیر را اجرا کنید:
      terraform import google_project.default PROJECT_ID و سپس
      terraform import google_firebase_project.default PROJECT_ID

اگر قبل از اینکه بخواهید نمونه پیش‌فرض Cloud Cloud Firestore خود را تهیه کنید، سطل Cloud Storage ابری پیش‌فرض خود را (از طریق google_app_engine_application ) تهیه کرده‌اید، خواهید دید که نمونه پیش‌فرض Cloud Firestore شما قبلاً ارائه شده است. توجه داشته باشید که نمونه پایگاه داده ارائه شده در حالت Datastore است، به این معنی که برای Firebase SDK، احراز هویت یا Firebase Security Rules قابل دسترسی نیست . اگر می‌خواهید از Cloud Firestore با این سرویس‌های Firebase استفاده کنید، باید پایگاه داده را خالی کنید و سپس نوع پایگاه داده آن را در کنسول Google Cloud تغییر دهید.

وقتی سطل Cloud Storage پیش‌فرض پروژه (از طریق google_app_engine_application ) را ارائه می‌کنید و پروژه هنوز نمونه پیش‌فرض Cloud Firestore خود را ندارد، google_app_engine_application به‌طور خودکار نمونه پیش‌فرض Cloud Firestore پروژه را ارائه می‌کند.

بنابراین، از آنجایی که نمونه پیش‌فرض Cloud Firestore پروژه شما قبلاً ارائه شده است، اگر بخواهید دوباره آن نمونه پیش‌فرض را به صراحت ارائه کنید، google_firestore_database با خطا مواجه می‌شود.

هنگامی که نمونه پیش‌فرض Cloud Firestore پروژه فراهم شد، نمی‌توانید آن را مجدداً تهیه کنید یا مکان آن را تغییر دهید. توجه داشته باشید که نمونه پایگاه داده ارائه شده در حالت Datastore است، به این معنی که برای Firebase SDK، احراز هویت یا Firebase Security Rules قابل دسترسی نیست . اگر می‌خواهید از Cloud Firestore با این سرویس‌های Firebase استفاده کنید، باید پایگاه داده را خالی کنید و سپس نوع پایگاه داده آن را در کنسول Google Cloud تغییر دهید.