Terraform এবং Firebase দিয়ে শুরু করুন

Firebase Terraform সমর্থন করতে শুরু করেছে। আপনি যদি এমন একটি দলে থাকেন যা নির্দিষ্ট সংস্থান এবং পরিষেবাগুলি সক্ষম করে Firebase প্রকল্পগুলিকে স্বয়ংক্রিয় এবং মানসম্মত করতে চায়, তাহলে Firebase-এর সাথে Terraform ব্যবহার করা আপনার জন্য উপযুক্ত হতে পারে।

Firebase-এর সাথে Terraform ব্যবহার করার জন্য মৌলিক কর্মপ্রবাহের মধ্যে নিম্নলিখিতগুলি অন্তর্ভুক্ত রয়েছে:

  • একটি Terraform কনফিগারেশন ফাইল (একটি .tf ফাইল) তৈরি এবং কাস্টমাইজ করা যা আপনি যে পরিকাঠামোর ব্যবস্থা করতে চান তা নির্দিষ্ট করে (অর্থাৎ, আপনি যে সংস্থানগুলি সরবরাহ করতে চান এবং যে পরিষেবাগুলি আপনি সক্ষম করতে চান)।

  • gcloud CLI কমান্ডগুলি ব্যবহার করে যা Terraform-এর সাথে ইন্টারফেস করে .tf ফাইলে নির্দিষ্ট পরিকাঠামোর ব্যবস্থা করতে।

আপনি Terraform এবং Firebase দিয়ে কি করতে পারেন?

এই নির্দেশিকায় সাধারণীকৃত কর্মপ্রবাহের উদাহরণ হল একটি Android অ্যাপ সহ একটি নতুন ফায়ারবেস প্রকল্প তৈরি করা। কিন্তু আপনি Terraform এর সাথে আরও অনেক কিছু করতে পারেন, যেমন:

  • টেরাফর্ম ব্যবহার করে বিদ্যমান পরিকাঠামো মুছুন এবং সংশোধন করুন।

  • টেরাফর্ম ব্যবহার করে পণ্য-নির্দিষ্ট কনফিগারেশন এবং কাজগুলি পরিচালনা করুন, যেমন:

    • Firebase Authentication সাইন-ইন প্রদানকারী সক্রিয় করা হচ্ছে।
    • Cloud Storage বালতি বা ডাটাবেস দৃষ্টান্ত তৈরি করা এবং তাদের জন্য Firebase Security Rules স্থাপন করা।

আপনি এই সমস্ত কাজগুলি সম্পন্ন করতে স্ট্যান্ডার্ড Terraform কনফিগারেশন ফাইল এবং কমান্ড ব্যবহার করতে পারেন। এবং এটিতে আপনাকে সাহায্য করার জন্য, আমরা বেশ কয়েকটি সাধারণ ব্যবহারের ক্ষেত্রে নমুনা Terraform কনফিগারেশন ফাইল সরবরাহ করেছি।



Firebase এর সাথে Terraform ব্যবহার করার জন্য সাধারণ কর্মপ্রবাহ

পূর্বশর্ত

এই নির্দেশিকাটি Firebase-এর সাথে Terraform ব্যবহার করার একটি ভূমিকা, তাই এটি Terraform-এর সাথে মৌলিক দক্ষতা অনুমান করে। এই ওয়ার্কফ্লো শুরু করার আগে আপনি নিম্নলিখিত পূর্বশর্তগুলি সম্পূর্ণ করেছেন তা নিশ্চিত করুন৷

  • Terraform ইনস্টল করুন এবং তাদের অফিসিয়াল টিউটোরিয়াল ব্যবহার করে Terraform এর সাথে নিজেকে পরিচিত করুন।

  • Google Cloud CLI ( gcloud CLI ) ইনস্টল করুন। একটি ব্যবহারকারী অ্যাকাউন্ট বা একটি পরিষেবা অ্যাকাউন্ট ব্যবহার করে লগইন করুন৷

    • ব্যবহারকারীর অ্যাকাউন্ট ব্যবহার করলে, আপনি অবশ্যই Firebase পরিষেবার শর্তাবলী (Firebase ToS) স্বীকার করেছেন। আপনি Firebase ToS স্বীকার করেছেন যদি আপনি Firebase কনসোলে একটি Firebase প্রকল্প দেখতে পারেন
    • টেরাফর্মের জন্য নির্দিষ্ট কিছু পদক্ষেপ নেওয়ার জন্য (উদাহরণস্বরূপ, প্রকল্পগুলি তৈরি করুন), নিম্নলিখিতগুলি অবশ্যই সত্য হতে হবে:
      • ব্যবহারকারী বা পরিষেবা অ্যাকাউন্টের অবশ্যই সেই ক্রিয়াগুলির জন্য প্রযোজ্য IAM অ্যাক্সেস থাকতে হবে।
      • যদি ব্যবহারকারী বা পরিষেবার অ্যাকাউন্ট Google Cloud সংস্থার অংশ হয়, তাহলে সংস্থার নীতিগুলি অ্যাকাউন্টটিকে সেই পদক্ষেপগুলি নেওয়ার অনুমতি দিতে হবে৷


ধাপ 1: একটি Terraform কনফিগারেশন ফাইল তৈরি এবং কাস্টমাইজ করুন

একটি Terraform কনফিগারেশন ফাইলের দুটি প্রধান বিভাগ প্রয়োজন (যা নীচে বিশদে বর্ণনা করা হয়েছে):

আপনার provider সেট আপ করুন

Firebase পণ্য বা পরিষেবাগুলি যেই জড়িত থাকুক না কেন একটি provider সেটআপ প্রয়োজন৷

  1. আপনার স্থানীয় ডিরেক্টরিতে একটি Terraform কনফিগার ফাইল (যেমন main.tf ফাইল) তৈরি করুন।

    এই নির্দেশিকায়, আপনি এই কনফিগারেশন ফাইলটি উভয় provider সেটআপ এবং সমস্ত অবকাঠামো নির্দিষ্ট করতে ব্যবহার করবেন যা আপনি Terraform তৈরি করতে চান। নোট করুন, যদিও, আপনার কাছে কীভাবে প্রদানকারী সেটআপ অন্তর্ভুক্ত করবেন তার বিকল্প রয়েছে।

    আপনার Terraform কনফিগারেশনের বাকি অংশে একটি provider সেটআপ কীভাবে অন্তর্ভুক্ত করবেন তার জন্য আপনার কাছে নিম্নলিখিত বিকল্প রয়েছে:

    • বিকল্প 1: এটিকে একটি একক Terraform .tf কনফিগারেশন ফাইলের শীর্ষে অন্তর্ভুক্ত করুন (যেমন এই নির্দেশিকায় দেখানো হয়েছে)।

      • এই বিকল্পটি ব্যবহার করুন যদি আপনি সবেমাত্র Terraform দিয়ে শুরু করছেন বা Firebase-এর সাথে Terraform ব্যবহার করে দেখুন।
    • বিকল্প 2: এটিকে একটি পৃথক .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 ফাইল), আপনাকে টেরাফর্ম তৈরি করতে চান এমন সমস্ত অবকাঠামো নির্দিষ্ট করতে হবে (অর্থাৎ আপনি যে সমস্ত সংস্থানগুলি সরবরাহ করতে চান এবং আপনি যে সমস্ত পরিষেবা সক্ষম করতে চান)। এই নির্দেশিকাটিতে, সমস্ত Firebase সংস্থানগুলির একটি সম্পূর্ণ তালিকা খুঁজুন যা Terraform সমর্থন করে

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


ধাপ 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 প্রকল্প দেখুন।



Terraform সমর্থন সহ Firebase সম্পদ

নিম্নলিখিত ফায়ারবেস এবং Google সংস্থানগুলিতে Terraform সমর্থন রয়েছে৷ এবং আমরা সব সময় আরো সম্পদ যোগ করছি! সুতরাং আপনি যদি Terraform এর সাথে যে সংস্থানটি পরিচালনা করতে চান তা দেখতে না পান, তাহলে এটি উপলব্ধ কিনা তা দেখতে শীঘ্রই ফিরে দেখুন বা GitHub রেপোতে একটি সমস্যা ফাইল করে এটির অনুরোধ করুন।


ফায়ারবেস প্রকল্প এবং অ্যাপ পরিচালনা

  • google_firebase_project — একটি বিদ্যমান Google Cloud প্রকল্পে 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 — SAML ইন্টিগ্রেশন কনফিগার করুন

এখনও সমর্থিত নয়:

  • Terraform এর মাধ্যমে মাল্টি-ফ্যাক্টর প্রমাণীকরণ (MFA) কনফিগার করা হচ্ছে

Firebase Data Connect


Firebase Realtime Database

এখনও সমর্থিত নয়:

  • টেরাফর্মের মাধ্যমে Firebase Realtime Database Security Rules স্থাপন করা (প্রোগ্রাম্যাটিক বিকল্পগুলি সহ অন্যান্য টুলিং ব্যবহার করে এই Rules কীভাবে স্থাপন করতে হয় তা শিখুন)

Cloud Firestore

  • google_firestore_database — একটি Cloud Firestore ইনস্ট্যান্স তৈরি করুন

  • google_firestore_indexCloud Firestore জন্য দক্ষ কোয়েরি সক্ষম করুন

  • google_firestore_document — একটি সংগ্রহে একটি নির্দিষ্ট নথির সাথে একটি Cloud Firestore উদাহরণ তৈরি করুন

    গুরুত্বপূর্ণ: এই বীজ নথিতে প্রকৃত ব্যবহারকারী বা উৎপাদন ডেটা ব্যবহার করবেন না।


Cloud Storage for Firebase

  • google_firebase_storage_bucket — একটি বিদ্যমান Cloud Storage বালতি ফায়ারবেস SDK, প্রমাণীকরণ এবং 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 অ্যাকাউন্টের সাথে প্রকল্পটিকে সংযুক্ত করে (GCIP-এর সাথে Firebase Authentication জন্য Blaze মূল্য পরিকল্পনা প্রয়োজন), প্রকল্পের জন্য Firebase পরিষেবাগুলি সক্ষম করে, GCIP-এর সাথে Firebase Authentication সেট আপ করে এবং প্রকল্পের সাথে তিনটি ভিন্ন ধরনের অ্যাপ নিবন্ধন করে৷

মনে রাখবেন যে টেরাফর্মের মাধ্যমে 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 প্রকল্প তৈরি করে, প্রকল্পের জন্য ফায়ারবেস পরিষেবাগুলিকে সক্ষম করে, প্রকল্পের ডিফল্ট 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 দৃষ্টান্তের জন্য ব্লেজ মূল্য পরিকল্পনা প্রয়োজন), প্রকল্পের জন্য ফায়ারবেস পরিষেবাগুলি সক্ষম করে, একাধিক 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 প্রকল্প তৈরি করে, প্রকল্পের জন্য ফায়ারবেস পরিষেবাগুলি সক্ষম করে, প্রকল্পের ডিফল্ট 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 অ্যাকাউন্টের সাথে প্রকল্পটিকে সংযুক্ত করে (অতিরিক্ত বালতিগুলির জন্য ব্লেজ মূল্য পরিকল্পনা প্রয়োজন), প্রকল্পের জন্য ফায়ারবেস পরিষেবাগুলি সক্ষম করে, অতিরিক্ত, নন-ডিফল্ট 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"
    }
  }
}



সমস্যা সমাধান এবং FAQ

এই নির্দেশিকাটি "প্রকল্প" এর সাথে কাজ করার সময় নিম্নলিখিত Terraform বৈশিষ্ট্যগুলি ব্যবহার করে।

একটি resource ব্লকের মধ্যে project

প্রস্তাবিত: যখনই সম্ভব, প্রতিটি resource ব্লকের মধ্যে project বৈশিষ্ট্য অন্তর্ভুক্ত করুন

একটি প্রকল্প বৈশিষ্ট্য অন্তর্ভুক্ত করে, Terraform নির্দিষ্ট প্রকল্পের মধ্যে রিসোর্স ব্লকে নির্দিষ্ট পরিকাঠামো তৈরি করবে। এই গাইড এবং আমাদের নমুনা কনফিগার ফাইলগুলি এই অনুশীলনটি ব্যবহার করে।

project সম্পর্কে অফিসিয়াল Terraform ডকুমেন্টেশন দেখুন.

provider ব্লকের মধ্যে user_project_override

বেশিরভাগ সম্পদের ব্যবস্থা করার জন্য, আপনাকে user_project_override = true ব্যবহার করতে হবে, যার অর্থ আপনার নিজের ফায়ারবেস প্রকল্পের বিপরীতে কোটা পরীক্ষা করা। যাইহোক, আপনার নতুন প্রকল্প সেট আপ করতে যাতে এটি কোটা চেক গ্রহণ করতে পারে, আপনাকে প্রথমে user_project_override = false ব্যবহার করতে হবে।

user_project_override সম্পর্কে অফিসিয়াল Terraform ডকুমেন্টেশন দেখুন।

নিশ্চিত করুন যে আপনি যে ব্যবহারকারীর অ্যাকাউন্টটি gcloud CLI কমান্ডগুলি চালানোর জন্য ব্যবহার করছেন সেটি Firebase পরিষেবার শর্তাবলী (Firebase ToS) স্বীকার করেছে৷

  • আপনি ব্যবহারকারীর অ্যাকাউন্টে সাইন ইন করা একটি ব্রাউজার ব্যবহার করে এবং Firebase কনসোলে একটি বিদ্যমান Firebase প্রকল্প দেখার চেষ্টা করে এই পরীক্ষাটি করতে পারেন। আপনি যদি একটি বিদ্যমান Firebase প্রকল্প দেখতে পারেন, তাহলে ব্যবহারকারীর অ্যাকাউন্ট Firebase ToS স্বীকার করেছে।

  • আপনি যদি কোনো বিদ্যমান ফায়ারবেস প্রজেক্ট দেখতে না পান, তাহলে ব্যবহারকারীর অ্যাকাউন্ট সম্ভবত Firebase ToS স্বীকার করেনি। এটি ঠিক করতে, Firebase কনসোলের মাধ্যমে একটি নতুন Firebase প্রকল্প তৈরি করুন এবং প্রকল্প তৈরির অংশ হিসাবে Firebase ToS গ্রহণ করুন৷ আপনি কনসোলে প্রজেক্ট সেটিংসের মাধ্যমে অবিলম্বে এই প্রকল্পটি মুছে ফেলতে পারেন।

কয়েক মিনিট অপেক্ষা করুন, এবং তারপর আবার terraform apply করার চেষ্টা করুন।

এটি বিভিন্ন সিস্টেমে প্রচার বিলম্বের কারণে হতে পারে। terraform import চালানোর মাধ্যমে টেরাফর্ম স্টেটে সম্পদ আমদানি করে এই সমস্যাটি সমাধান করার চেষ্টা করুন। তারপর আবার 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 দৃষ্টান্তের ব্যবস্থা করার চেষ্টা করার আগে আপনার ডিফল্ট ক্লাউড Cloud Storage বালতি ( google_app_engine_application এর মাধ্যমে) ব্যবস্থা করে থাকেন, তাহলে আপনি দেখতে পাবেন যে আপনার ডিফল্ট Cloud Firestore দৃষ্টান্ত ইতিমধ্যেই বিধান করা হয়েছে৷ মনে রাখবেন যে প্রভিশন করা ডাটাবেস ইন্সট্যান্স ডেটাস্টোর মোডে আছে, যার মানে এটি Firebase SDK, প্রমাণীকরণ, বা Firebase Security Rules অ্যাক্সেসযোগ্য নয় । আপনি যদি এই ফায়ারবেস পরিষেবাগুলির সাথে 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 SDK, প্রমাণীকরণ, বা Firebase Security Rules অ্যাক্সেসযোগ্য নয় । আপনি যদি এই ফায়ারবেস পরিষেবাগুলির সাথে Cloud Firestore ব্যবহার করতে চান, তাহলে আপনাকে ডাটাবেসটি খালি করতে হবে এবং তারপরে Google Cloud কনসোলে এর ডাটাবেসের প্রকার পরিবর্তন করতে হবে।