Teraform और Firebase का इस्तेमाल शुरू करना

Firebase, Terraform के साथ काम करना शुरू कर रहा है. अगर आप किसी ऐसी टीम में हैं जो खास संसाधनों और चालू सेवाओं के साथ Firebase प्रोजेक्ट बनाने की प्रोसेस को ऑटोमेट और स्टैंडर्ड करना चाहती है, तो Firebase के साथ Terraform का इस्तेमाल करना आपके लिए सही हो सकता है.

Firebase के साथ Terraform का इस्तेमाल करने के बुनियादी वर्कफ़्लो में ये शामिल हैं:

  • Terraform कॉन्फ़िगरेशन फ़ाइल (.tf फ़ाइल) बनाना और उसे पसंद के मुताबिक बनाना. इस फ़ाइल में, उस इन्फ़्रास्ट्रक्चर के बारे में बताया जाता है जिसे आपको उपलब्ध कराना है. जैसे, आपको कौनसे संसाधन उपलब्ध कराने हैं और कौनसी सेवाएं चालू करनी हैं.

  • gcloud CLI फ़ाइल में बताए गए इन्फ़्रास्ट्रक्चर को उपलब्ध कराने के लिए, Terraform के साथ इंटरफ़ेस करने वाले .tf कमांड का इस्तेमाल करना.

Terraform और Firebase की मदद से क्या-क्या किया जा सकता है?

इस गाइड में दिए गए सामान्य वर्कफ़्लो के उदाहरण में, Android ऐप्लिकेशन के साथ नया Firebase प्रोजेक्ट बनाना बताया गया है. हालांकि, Terraform की मदद से और भी बहुत कुछ किया जा सकता है. जैसे:

  • Terraform का इस्तेमाल करके, मौजूदा इन्फ़्रास्ट्रक्चर को मिटाना और उसमें बदलाव करना.

  • Terraform का इस्तेमाल करके, प्रॉडक्ट के हिसाब से कॉन्फ़िगरेशन और टास्क मैनेज करें. जैसे:

    • Firebase Authentication साइन-इन करने की सुविधा देने वाली सेवाओं को चालू करना.
    • Cloud Storage बकेट या डेटाबेस इंस्टेंस बनाना और उनके लिए Firebase Security Rules डिप्लॉय करना.

इन सभी टास्क को पूरा करने के लिए, Terraform की स्टैंडर्ड कॉन्फ़िगरेशन फ़ाइलों और निर्देशों का इस्तेमाल किया जा सकता है. इस काम में आपकी मदद करने के लिए, हमने कई सामान्य इस्तेमाल के उदाहरणों के लिए, Terraform कॉन्फ़िगरेशन फ़ाइलों के सैंपल उपलब्ध कराए हैं.



Firebase के साथ Terraform का इस्तेमाल करने के लिए सामान्य वर्कफ़्लो

ज़रूरी शर्तें

इस गाइड में, Firebase के साथ Terraform का इस्तेमाल करने के बारे में बताया गया है. इसलिए, इसमें यह माना गया है कि आप Terraform के बारे में बुनियादी जानकारी रखते हैं. यह वर्कफ़्लो शुरू करने से पहले, पक्का करें कि आपने ये ज़रूरी शर्तें पूरी कर ली हों.

  • Terraform इंस्टॉल करें और Terraform के आधिकारिक ट्यूटोरियल का इस्तेमाल करके, इसके बारे में जानें.

  • Google Cloud CLI (gcloud CLI) इंस्टॉल करें. इसके बाद, उपयोगकर्ता खाते या सेवा खाते का इस्तेमाल करके लॉगिन करें.

    • अगर उपयोगकर्ता खाते का इस्तेमाल किया जा रहा है, तो आपने Firebase की सेवा की शर्तें (Firebase की सेवा की शर्तें) स्वीकार कर ली होंगी. अगर आपको Firebase कंसोल में कोई Firebase प्रोजेक्ट दिखता है, तो इसका मतलब है कि आपने Firebase के सेवा की शर्तें स्वीकार कर ली हैं
    • Terraform को कुछ कार्रवाइयां करने के लिए, ये शर्तें पूरी होनी चाहिए. जैसे, प्रोजेक्ट बनाना:
      • उपयोगकर्ता या सेवा खाते के पास, उन कार्रवाइयों के लिए लागू आईएएम ऐक्सेस होना चाहिए.
      • अगर उपयोगकर्ता या सेवा खाता किसी Google Cloud संगठन का हिस्सा है, तो संगठन की नीतियों के मुताबिक, खाते को ये कार्रवाइयां करने की अनुमति होनी चाहिए.


पहला चरण: Terraform कॉन्फ़िगरेशन फ़ाइल बनाना और उसे पसंद के मुताबिक बनाना

Terraform कॉन्फ़िगरेशन फ़ाइल में दो मुख्य सेक्शन होने चाहिए. इनके बारे में यहां पूरी जानकारी दी गई है:

अपना provider सेट अप करना

provider सेटअप करना ज़रूरी है, भले ही इसमें Firebase के कौनसे प्रॉडक्ट या सेवाएं शामिल हों.

  1. अपनी लोकल डायरेक्ट्री में Terraform कॉन्फ़िगरेशन फ़ाइल (जैसे कि main.tf फ़ाइल) बनाएं.

    इस गाइड में, इस कॉन्फ़िगरेशन फ़ाइल का इस्तेमाल करके, provider सेटअप और उस पूरे इन्फ़्रास्ट्रक्चर के बारे में बताया जाएगा जिसे आपको Terraform से बनाना है. हालांकि, ध्यान दें कि आपके पास सेवा देने वाली कंपनी का सेटअप शामिल करने के तरीके के विकल्प होते हैं.

    Terraform कॉन्फ़िगरेशन के बाकी हिस्सों में provider सेटअप को शामिल करने के लिए, आपके पास ये विकल्प हैं:

    • पहला विकल्प: इसे किसी एक Terraform .tf कॉन्फ़िगरेशन फ़ाइल में सबसे ऊपर शामिल करें (जैसा कि इस गाइड में दिखाया गया है).

      • अगर आपने अभी तक Terraform का इस्तेमाल नहीं किया है या Firebase के साथ Terraform को आज़माना है, तो इस विकल्प का इस्तेमाल करें.
    • दूसरा विकल्प: इसे उस .tf फ़ाइल (जैसे, provider.tf फ़ाइल) के अलावा किसी अलग .tf फ़ाइल में शामिल करें जिसमें आपने बनाने के लिए इन्फ़्रास्ट्रक्चर (जैसे, main.tf फ़ाइल) के बारे में बताया है.

      • अगर आप किसी बड़ी टीम का हिस्सा हैं और आपको सेटअप को स्टैंडर्ड बनाना है, तो इस विकल्प का इस्तेमाल करें.
      • Terraform निर्देशों को चलाते समय, provider.tf फ़ाइल और main.tf फ़ाइल, दोनों एक ही डायरेक्ट्री में होनी चाहिए.

  2. main.tf फ़ाइल में सबसे ऊपर, provider सेटअप शामिल करें.

    आपको google-beta प्रोवाइडर का इस्तेमाल करना होगा, क्योंकि यह Terraform के साथ Firebase का इस्तेमाल करने का बीटा वर्शन है. प्रोडक्शन में इस्तेमाल करते समय सावधानी बरतें.

    # 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 के साथ Terraform का इस्तेमाल करते समय, प्रोजेक्ट से जुड़े अलग-अलग तरह के एट्रिब्यूट के बारे में ज़्यादा जानें. इनमें, इस गाइड में "कोटा की जांच करने वाला प्रोजेक्ट" कहा गया है.

  3. अपनी कॉन्फ़िगरेशन फ़ाइल को पूरा करने के लिए अगले सेक्शन पर जाएं और बताएं कि आपको कौनसा इन्फ़्रास्ट्रक्चर बनाना है.

resource ब्लॉक का इस्तेमाल करके, यह तय करना कि कौनसा इन्फ़्रास्ट्रक्चर बनाना है

आपको अपनी Terraform कॉन्फ़िगरेशन फ़ाइल (इस गाइड के लिए, आपकी main.tf फ़ाइल) में, वह पूरा इन्फ़्रास्ट्रक्चर बताना होगा जिसे आपको Terraform से बनाना है. इसका मतलब है कि आपको उन सभी संसाधनों के बारे में बताना होगा जिन्हें आपको उपलब्ध कराना है और उन सभी सेवाओं के बारे में बताना होगा जिन्हें आपको चालू करना है. इस गाइड में, Terraform के साथ काम करने वाले सभी Firebase रिसॉर्स की पूरी सूची देखें.

  1. अपनी main.tf फ़ाइल खोलें.

  2. provider सेटअप में, resource ब्लॉक का यह कॉन्फ़िगरेशन शामिल करें.

    इस बुनियादी उदाहरण में, नया Firebase प्रोजेक्ट बनाया जाता है. इसके बाद, उस प्रोजेक्ट में Firebase Android ऐप्लिकेशन बनाया जाता है.

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


दूसरा चरण: तय किए गए इन्फ़्रास्ट्रक्चर को बनाने के लिए, Terraform कमांड चलाना

main.tf फ़ाइल में बताए गए रिसॉर्स उपलब्ध कराने और सेवाओं को चालू करने के लिए, main.tf फ़ाइल की डायरेक्ट्री में जाकर ये कमांड चलाएं. इन निर्देशों के बारे में ज़्यादा जानकारी के लिए, Terraform दस्तावेज़ देखें.

  1. अगर डायरेक्ट्री में पहली बार Terraform निर्देश चलाए जा रहे हैं, तो आपको कॉन्फ़िगरेशन डायरेक्ट्री को शुरू करना होगा और Google Terraform प्रोवाइडर को इंस्टॉल करना होगा. इसके लिए, यह कमांड चलाएं:

    terraform init
  2. अपनी main.tf फ़ाइल में बताए गए इन्फ़्रास्ट्रक्चर को बनाने के लिए, यह कमांड चलाएं:

    terraform apply
  3. पुष्टि करें कि सब कुछ उम्मीद के मुताबिक प्रोवाइड या चालू किया गया है:

    • पहला विकल्प: यह कमांड चलाकर, अपने टर्मिनल में कॉन्फ़िगरेशन देखें:

      terraform show
    • दूसरा विकल्प: Firebase कंसोल में अपना Firebase प्रोजेक्ट देखें.



Terraform के साथ काम करने वाले Firebase संसाधन

Firebase और Google के इन संसाधनों में Terraform की सुविधा काम करती है. साथ ही, हम लगातार और संसाधन जोड़ रहे हैं! इसलिए, अगर आपको वह संसाधन नहीं दिखता है जिसे आपको Terraform की मदद से मैनेज करना है, तो जल्द ही देखें कि वह उपलब्ध है या नहीं. इसके अलावा, GitHub repo में समस्या दर्ज करके भी इसका अनुरोध किया जा सकता है.


Firebase प्रोजेक्ट और ऐप्लिकेशन मैनेजमेंट

  • google_firebase_project — किसी मौजूदा Google Cloud प्रोजेक्ट पर Firebase की सेवाएं चालू करना

  • Firebase ऐप्लिकेशन

    • google_firebase_apple_app — Firebase के ज़रिए, Apple के प्लैटफ़ॉर्म के लिए ऐप्लिकेशन बनाना या मैनेज करना
    • google_firebase_android_app — Firebase का इस्तेमाल करके Android ऐप्लिकेशन बनाना या मैनेज करना
    • google_firebase_web_app — Firebase वेब ऐप्लिकेशन बनाना या मैनेज करना

Firebase Authentication

  • google_identity_platform_configGoogle Cloud Identity Platform (GCIP) को चालू करें. यह Firebase Authentication का बैकएंड है और प्रोजेक्ट-लेवल पर ऑथेंटिकेशन सेटिंग उपलब्ध कराता है

    • Terraform की मदद से Firebase Authentication को कॉन्फ़िगर करने के लिए, GCIP चालू करना ज़रूरी है. Firebase Authentication को सेट अप करने का तरीका जानने के लिए, .tf सैंपल फ़ाइल देखना न भूलें.

    • जिस प्रोजेक्ट में Terraform, GCIP और/या Firebase Authentication को चालू करेगा वह Blaze की कीमत वाले प्लान पर होना चाहिए. इसका मतलब है कि प्रोजेक्ट में Cloud Billing खाता होना चाहिए. प्रोग्राम के हिसाब से ऐसा करने के लिए, google_project संसाधन में billing_account एट्रिब्यूट को सेट करें.

    • इस संसाधन की मदद से, स्थानीय साइन इन के तरीके जैसे कि गुमनाम, ईमेल/पासवर्ड, और फ़ोन से पुष्टि करने के साथ-साथ, ब्लॉक करने के फ़ंक्शन और अनुमति वाले डोमेन जैसे ज़्यादा कॉन्फ़िगरेशन भी चालू किए जा सकते हैं.

  • google_identity_platform_default_supported_idp_config — Google, Facebook या Apple जैसे सामान्य फ़ेडरेटेड आइडेंटिटी प्रोवाइडर कॉन्फ़िगर करना

  • identity_platform_oauth_idp_config — किसी भी OAuth आइडेंटिटी प्रोवाइडर (आईडीपी) सोर्स को कॉन्फ़िगर करना

  • google_identity_platform_inbound_saml_config — एसएएमएल इंटिग्रेशन कॉन्फ़िगर करना

फ़िलहाल, यह सुविधा इन डिवाइसों पर काम नहीं करती:

  • Terraform की मदद से, कई चरणों में पुष्टि करने की सुविधा (MFA) कॉन्फ़िगर करना

Firebase Data Connect


Firebase Realtime Database

फ़िलहाल, यह सुविधा इन डिवाइसों पर काम नहीं करती:

  • Terraform की मदद से Firebase Realtime Database Security Rules को डिप्लॉय करना (प्रोग्राम के विकल्पों के साथ-साथ, अन्य टूल का इस्तेमाल करके इन Rules को डिप्लॉय करने का तरीका जानें)

Cloud Firestore

  • google_firestore_databaseCloud Firestore इंस्टेंस बनाना

  • google_firestore_indexCloud Firestore के लिए असरदार क्वेरी चालू करना

  • google_firestore_document — किसी कलेक्शन में मौजूद किसी दस्तावेज़ के साथ Cloud Firestore इंस्टेंस को सीड करना

    अहम जानकारी: इस सीड दस्तावेज़ में, असली उपयोगकर्ता या प्रोडक्शन डेटा का इस्तेमाल न करें.


Cloud Storage for Firebase

  • google_firebase_storage_bucket — किसी मौजूदा Cloud Storage बकेट को Firebase SDK टूल, पुष्टि करने की सुविधा, और Firebase Security Rules के लिए ऐक्सेस किया जा सकता है

  • google_storage_bucket_objectCloud Storage बकेट में कोई ऑब्जेक्ट जोड़ना

    अहम जानकारी: इस फ़ाइल में असली असली उपयोगकर्ता या प्रोडक्शन डेटा का इस्तेमाल न करें.


Firebase Security Rules (Cloud Firestore और Cloud Storage के लिए)

ध्यान दें कि Firebase Realtime Database, अपने Firebase Security Rules के लिए, डिवाइस उपलब्ध कराने के लिए किसी दूसरे सिस्टम का इस्तेमाल करता है.

  • google_firebaserules_rulesetCloud Firestore इंस्टेंस या Cloud Storage बकेट पर लागू होने वाले Firebase Security Rules तय करें

  • google_firebaserules_releaseCloud Firestore इंस्टेंस या Cloud Storage बकेट में खास नियमों को डिप्लॉय करना


Firebase App Check

  • google_firebase_app_check_service_config — किसी सेवा के लिए App Check नीति उल्लंघन ठीक करने की सुविधा चालू करना
  • google_firebase_app_check_app_attest_config — ऐप्लिकेशन की पुष्टि करने वाली सेवा देने वाली कंपनी के साथ, Apple के प्लैटफ़ॉर्म के लिए ऐप्लिकेशन रजिस्टर करना
  • google_firebase_app_check_device_check_config — DeviceCheck की सेवा देने वाली कंपनी के साथ, Apple के प्लैटफ़ॉर्म के लिए बनाए गए ऐप्लिकेशन को रजिस्टर करना
  • google_firebase_app_check_play_integrity_config — Play Integrity की सेवा देने वाली कंपनी के साथ Android ऐप्लिकेशन रजिस्टर करना
  • google_firebase_app_check_recaptcha_enterprise_config — reCAPTCHA Enterprise की सेवा देने वाली कंपनी के साथ वेब ऐप्लिकेशन रजिस्टर करना
  • google_firebase_app_check_recaptcha_v3_config — reCAPTCHA वर्शन 3 की सेवा देने वाली कंपनी के साथ वेब ऐप्लिकेशन रजिस्टर करना
  • google_firebase_app_check_debug_token — जांच के लिए डीबग टोकन का इस्तेमाल करना

Firebase Extensions



इस्तेमाल के सामान्य उदाहरणों के लिए, Terraform कॉन्फ़िगरेशन फ़ाइलों के सैंपल

यह कॉन्फ़िगरेशन, एक नया Google Cloud प्रोजेक्ट बनाता है और प्रोजेक्ट को Cloud Billing खाते से जोड़ता है. GCIP के साथ Firebase Authentication का इस्तेमाल करने के लिए, Blaze की कीमत का प्लान ज़रूरी है. यह प्रोजेक्ट के लिए Firebase की सेवाएं चालू करता है, GCIP के साथ Firebase Authentication को सेट अप करता है, और प्रोजेक्ट के साथ तीन अलग-अलग तरह के ऐप्लिकेशन रजिस्टर करता है.

ध्यान दें कि Terraform की मदद से Firebase Authentication सेट अप करने के लिए, GCIP चालू करना ज़रूरी है.

# 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 खाते से जोड़ता है (कई Realtime Database इंस्टेंस के लिए, Blaze की कीमत का प्लान ज़रूरी है), प्रोजेक्ट के लिए 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 इंस्टेंस उपलब्ध कराता है, और प्रोजेक्ट के साथ तीन अलग-अलग तरह के ऐप्लिकेशन रजिस्टर करता है.

यह डिफ़ॉल्ट Cloud Firestore इंस्टेंस के लिए Firebase Security Rules भी उपलब्ध कराता है, 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 बकेट उपलब्ध कराता है, और प्रोजेक्ट के साथ तीन अलग-अलग तरह के ऐप्लिकेशन रजिस्टर करता है.

यह हर Cloud Storage बकेट के लिए Firebase Security Rules भी उपलब्ध कराता है और 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 की सेवाएं चालू करता है. साथ ही, Cloud Firestore के लिए Firebase App Check को लागू करने की सुविधा सेट अप करता है और उसे चालू करता है, ताकि इसे सिर्फ़ आपके 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 ब्लॉक में

सुझाव: जब भी हो सके, हर resource ब्लॉक में project एट्रिब्यूट शामिल करें

प्रोजेक्ट एट्रिब्यूट को शामिल करने पर, Terraform, बताए गए प्रोजेक्ट में रिसॉर्स ब्लॉक में बताए गए इन्फ़्रास्ट्रक्चर को बनाएगा. इस गाइड और हमारी सैंपल कॉन्फ़िगरेशन फ़ाइलों में, इस तरीके का इस्तेमाल किया गया है.

project के बारे में Terraform का आधिकारिक दस्तावेज़ देखें.

provider ब्लॉक में user_project_override

ज़्यादातर संसाधनों को प्रोवाइड करने के लिए, आपको user_project_override = true का इस्तेमाल करना चाहिए. इसका मतलब है कि अपने Firebase प्रोजेक्ट के लिए कोटा देखना. हालांकि, कोटा की जांच स्वीकार करने के लिए, अपने नए प्रोजेक्ट को सेट अप करने के लिए, आपको पहले user_project_override = false का इस्तेमाल करना होगा.

user_project_override के बारे में Terraform का आधिकारिक दस्तावेज़ देखें.

पक्का करें कि gcloud CLI आदेश चलाने के लिए इस्तेमाल किए जा रहे उपयोगकर्ता खाते ने Firebase की सेवा की शर्तें (Firebase की सेवा की शर्तें) स्वीकार की हों.

  • यह जांच करने के लिए, उपयोगकर्ता खाते में साइन इन किए गए ब्राउज़र का इस्तेमाल करें. इसके बाद, Firebase कंसोल में मौजूदा Firebase प्रोजेक्ट देखें. अगर आपको कोई मौजूदा Firebase प्रोजेक्ट दिखता है, तो इसका मतलब है कि उपयोगकर्ता खाते ने Firebase के सेवा की शर्तें स्वीकार कर ली हैं.

  • अगर आपको कोई मौजूदा Firebase प्रोजेक्ट नहीं दिख रहा है, तो हो सकता है कि उपयोगकर्ता खाते ने Firebase के सेवा की शर्तें स्वीकार न की हों. इसे ठीक करने के लिए, Firebase कंसोल की मदद से नया Firebase प्रोजेक्ट बनाएं. साथ ही, प्रोजेक्ट बनाने के दौरान Firebase की सेवा की शर्तें स्वीकार करें. कंसोल में प्रोजेक्ट सेटिंग में जाकर, इस प्रोजेक्ट को तुरंत मिटाया जा सकता है.

कुछ मिनट इंतज़ार करें और फिर से terraform apply चलाने की कोशिश करें.

ऐसा अलग-अलग सिस्टम में प्रोपेगेशन में लगने वाली देरी की वजह से हो सकता है. terraform import चलाकर, संसाधन को Terraform स्टेट में इंपोर्ट करके, इस समस्या को हल करने की कोशिश करें. इसके बाद, terraform apply को फिर से चलाने की कोशिश करें.

हर संसाधन को इंपोर्ट करने का तरीका जानने के लिए, Terraform दस्तावेज़ के "इंपोर्ट" सेक्शन में जाएं. उदाहरण के लिए, Cloud Firestore के लिए "इंपोर्ट" दस्तावेज़.

गड़बड़ी के मैसेज से पता चलता है कि Terraform एक ही समय पर कई इंडेक्स बनाने और/या दस्तावेज़ बनाने की कोशिश कर रहा है. इस वजह से, एक साथ कई काम करने से जुड़ी गड़बड़ी हुई है. terraform apply को फिर से चलाने की कोशिश करें.

इस गड़बड़ी का मतलब है कि Terraform को यह पता नहीं है कि कोटा की जांच किस प्रोजेक्ट के लिए करनी है. समस्या हल करने के लिए, resource ब्लॉक में ये चीज़ें देखें:

  • पक्का करें कि आपने project एट्रिब्यूट के लिए कोई वैल्यू दी हो.
  • पक्का करें कि आपने सेवा देने वाली कंपनी का इस्तेमाल user_project_override = true (कोई उपनाम नहीं) के साथ किया हो. Firebase के सैंपल में, यह google-beta है.

प्रोजेक्ट आईडी पहले से मौजूद होने की ये वजहें हो सकती हैं:

  • उस आईडी से जुड़ा प्रोजेक्ट किसी और का है.

    • इसे ठीक करने के लिए: कोई दूसरा प्रोजेक्ट आईडी चुनें.
  • उस आईडी से जुड़ा प्रोजेक्ट हाल ही में मिटाया गया था (सॉफ़्ट-मिटाया गया है).

    • इस समस्या को हल करने के लिए: अगर आपको लगता है कि आईडी से जुड़ा प्रोजेक्ट आपका है, तो projects.get REST API का इस्तेमाल करके प्रोजेक्ट की स्थिति देखें.
  • उस आईडी से जुड़ा प्रोजेक्ट, मौजूदा उपयोगकर्ता के तहत सही तरीके से मौजूद हो. इस गड़बड़ी की एक संभावित वजह यह हो सकती है कि किसी पिछले terraform apply में रुकावट आई हो.

    • इसे ठीक करने के लिए: ये कमांड चलाएं:
      terraform import google_project.default PROJECT_ID इसके बाद
      terraform import google_firebase_project.default PROJECT_ID

अगर आपने अपने डिफ़ॉल्ट Cloud Firestore इंस्टेंस को प्रोविज़न करने से पहले, google_app_engine_application के ज़रिए अपनी डिफ़ॉल्ट Cloud Storage बकेट को प्रोविज़न किया है, तो आपको पता चलेगा कि आपका डिफ़ॉल्ट Cloud Firestore इंस्टेंस पहले से ही प्रोविज़न हो चुका है. ध्यान दें कि उपलब्ध कराया गया डेटाबेस इंस्टेंस, डेटास्टोर मोड में है. इसका मतलब है कि Firebase SDK टूल, पुष्टि करने की सुविधा या Firebase Security Rules के पास इसका ऐक्सेस नहीं है. अगर आपको इन Firebase सेवाओं के साथ Cloud Firestore का इस्तेमाल करना है, तो आपको डेटाबेस खाली करना होगा. इसके बाद, Google Cloud कंसोल में जाकर, डेटाबेस का टाइप बदलना होगा.

जब किसी प्रोजेक्ट की डिफ़ॉल्ट Cloud Storage बकेट को (google_app_engine_application के ज़रिए) प्रोवाइड किया जाता है और प्रोजेक्ट में अब तक उसका डिफ़ॉल्ट Cloud Firestore इंस्टेंस नहीं है, तो google_app_engine_application प्रोजेक्ट के डिफ़ॉल्ट Cloud Firestore इंस्टेंस को अपने-आप प्रोवाइड करता है.

इसलिए, आपके प्रोजेक्ट के डिफ़ॉल्ट Cloud Firestore इंस्टेंस के लिए, पहले से ही प्रोविज़न किया गया है. इसलिए, अगर उस डिफ़ॉल्ट इंस्टेंस के लिए फिर से प्रोविज़न करने की कोशिश की जाती है, तो google_firestore_database गड़बड़ी का मैसेज दिखाएगा.

प्रोजेक्ट का डिफ़ॉल्ट Cloud Firestore इंस्टेंस प्रोवाइड होने के बाद, उसे "फिर से प्रोवाइड" नहीं किया जा सकता या उसकी जगह नहीं बदली जा सकती. ध्यान दें कि प्रोवाइड किया गया डेटाबेस इंस्टेंस, डेटास्टोर मोड में है. इसका मतलब है कि इसे Firebase SDKs, पुष्टि करने की सुविधा या Firebase Security Rules से ऐक्सेस नहीं किया जा सकता. अगर आपको इन Firebase सेवाओं के साथ Cloud Firestore का इस्तेमाल करना है, तो आपको डेटाबेस खाली करना होगा. इसके बाद, Google Cloud कंसोल में जाकर, डेटाबेस का टाइप बदलना होगा.