Terraform এর মাধ্যমে Firebase প্রকল্প এবং পণ্য সেট আপ এবং পরিচালনা করুন

১. ভূমিকা

লক্ষ্য

আপনি টেরাফর্ম ব্যবহার করে একটি ফায়ারবেস প্রজেক্ট সেট আপ এবং পরিচালনা করতে পারেন, যার মধ্যে ইনফ্রাস্ট্রাকচার এবং ফায়ারবেস প্রোডাক্টের প্রোগ্রাম্যাটিক কনফিগারেশনও অন্তর্ভুক্ত।

এই কোডল্যাবে প্রথমে একটি নতুন ফায়ারবেস প্রজেক্ট তৈরি করার জন্য কীভাবে একটি টেরাফর্ম কনফিগারেশন ফাইল তৈরি করতে হয় তা বর্ণনা করা হয়েছে, এবং এরপর সেই প্রজেক্টে ব্যবহার করতে চাওয়া অ্যাপস ও ফায়ারবেস প্রোডাক্টগুলো কীভাবে কনফিগার করতে হয় তা দেখানো হয়েছে। আমরা টেরাফর্ম কমান্ড লাইনের মৌলিক বিষয়গুলোও আলোচনা করেছি, যেমন—পরিবর্তনগুলোর প্রিভিউ দেখা এবং তারপর সেগুলো বাস্তবায়ন করা।

আপনি যদি Terraform ব্যবহার করে Firebase প্রোজেক্ট ও প্রোডাক্ট সেট আপ এবং পরিচালনা করতে শিখতে চান, তাহলে এই কোডল্যাবটি আপনার জন্য!

আপনি যা শিখবেন

  • কিভাবে একটি টেরাফর্ম কনফিগারেশন ফাইল ( *.tf ) তৈরি করবেন
  • আপনার পরিকাঠামো পরিচালনা করতে টেরাফর্ম সিএলআই কমান্ড কীভাবে ব্যবহার করবেন
  • আপনার রিসোর্স এবং সার্ভিসগুলো আপডেট করতে আপনার কনফিগারেশন কীভাবে পরিবর্তন করবেন
  • আপনার কনফিগারেশনটি একটি বাস্তব ওয়েব অ্যাপে (যার নাম ফ্রেন্ডলি চ্যাট ) কীভাবে প্রয়োগ করবেন
  • বিভিন্ন পরিবেশে (প্রোডাকশন, স্টেজিং, ইত্যাদি) কীভাবে সমান্তরাল (এবং সিঙ্ক করা) কনফিগারেশন নির্ধারণ করবেন

আপনার যা যা লাগবে

এই কোডল্যাবে সফল হওয়ার জন্য টেরাফর্ম এবং এর পরিভাষা সম্পর্কে প্রাথমিক জ্ঞান থাকা প্রয়োজন, সেইসাথে নিম্নলিখিত পূর্বশর্তগুলো পূরণ করতে হবে:

এই কোডল্যাবটি একটি বাস্তব নমুনা অ্যাপ প্রদান করে, যাতে আপনি Terraform-এর মাধ্যমে যা কিছু প্রোভিশন করেন তা পরীক্ষা করতে এবং তার সাথে ইন্টারঅ্যাক্ট করতে পারেন। এটি করার জন্য, আপনার নিম্নলিখিত জিনিসগুলির প্রয়োজন হবে:

  • একটি ওয়েব অ্যাপের নমুনা কোড - কোডল্যাবের পরবর্তী ধাপে এই কোডটি ডাউনলোড করুন।
  • প্যাকেজ ম্যানেজার npm (যা সাধারণত Node.js-এর সাথে আসে) – এই টুলগুলো ইনস্টল করুন।
  • ফায়ারবেস সিএলআই - এই সিএলআই ইনস্টল করুন এবং লগ ইন করুন।

২. প্রারম্ভিক কোডটি সংগ্রহ করুন।

এই কোডল্যাবে, আপনি টেরাফর্মের মাধ্যমে প্রোভিশন করা বিষয়গুলো একটি বাস্তব ওয়েব অ্যাপে পরীক্ষা করে দেখতে পারেন। আমরা এটি করার পরামর্শ দিই, যাতে আপনি টেরাফর্ম-প্রোভিশন করা রিসোর্স ব্যবহার করার জন্য প্রয়োজনীয় সমস্ত ধাপ বুঝতে পারেন।

কমান্ড লাইন থেকে কোডল্যাবের গিটহাব রিপোজিটরিটি ক্লোন করুন:

git clone https://github.com/firebase/codelab-friendlychat-web

বিকল্পভাবে, যদি আপনার গিট ইনস্টল করা না থাকে, তাহলে আপনি রিপোজিটরিটি একটি জিপ ফাইল হিসেবে ডাউনলোড করতে পারেন।

৩. একটি টেরাফর্ম কনফিগারেশন তৈরি করুন

টেরাফর্ম সেট আপ

  1. ডাউনলোড করা স্যাম্পল অ্যাপটির কোডবেসে, web ডিরেক্টরির রুটে যান।
  2. ওই ডিরেক্টরির রুটে, main.tf নামে একটি Terraform কনফিগারেশন ফাইল তৈরি করুন এবং তাতে নিম্নলিখিত প্রাথমিক সেটআপটি যোগ করুন:

    main.tf
    # Terraform configuration to set up providers by version.
    terraform {
      required_providers {
        google-beta = {
          source  = "hashicorp/google-beta"
          version = "~> 7.0"
        }
      }
    }
    
    # Configure the provider not to use the specified project for quota check.
    # This provider should only be used during project creation and initializing services.
    provider "google-beta" {
      alias                 = "no_user_project_override"
      user_project_override = false
    }
    
    # Configure the provider that uses the new project's quota.
    provider "google-beta" {
      user_project_override = true
    }
    

প্রতিটি google-beta প্রোভাইডারের user_project_override নামে একটি অ্যাট্রিবিউট আছে, যা নির্ধারণ করে টেরাফর্মের অপারেশনগুলো কীভাবে কোটা দ্বারা যাচাই করা হবে। বেশিরভাগ রিসোর্স প্রোভিশনিং করার জন্য, আপনার user_project_override = true ব্যবহার করা উচিত, যার অর্থ হলো আপনার নিজের ফায়ারবেস প্রজেক্টের বিপরীতে কোটা যাচাই করা। তবে, আপনার নতুন প্রজেক্টকে এমনভাবে সেট আপ করতে যাতে এটি কোটা যাচাই গ্রহণ করতে পারে, তার জন্য আপনাকে প্রথমে user_project_override=false ব্যবহার করতে হবে। এই কোডল্যাবের পরবর্তী ধাপগুলোতে টেরাফর্ম alias সিনট্যাক্স আপনাকে এই দুটি প্রোভাইডার সেটআপের মধ্যে পার্থক্য করতে সাহায্য করবে।

ডিরেক্টরিতে টেরাফর্ম ইনিশিয়ালাইজ করুন

প্রথমবার নতুন কনফিগ তৈরি করার জন্য, কনফিগারেশনে নির্দিষ্ট করা প্রোভাইডারটি ডাউনলোড করতে হবে।

এই প্রারম্ভিক কাজটি করার জন্য, আপনার main.tf কনফিগারেশন ফাইলটি যে ডিরেক্টরিতে রয়েছে, তার রুট থেকে নিম্নলিখিত কমান্ডটি চালান:

terraform init

৪. Terraform-এর মাধ্যমে একটি Firebase প্রজেক্ট তৈরি করুন।

একটি Firebase প্রজেক্ট তৈরি করার ক্ষেত্রে, এটা মনে রাখা জরুরি যে প্রতিটি Firebase প্রজেক্ট আসলে একটি Google Cloud প্রজেক্ট, যেটিতে শুধু Firebase সার্ভিসগুলো সক্রিয় করা থাকে।

অন্তর্নিহিত গুগল ক্লাউড প্রজেক্ট এবং এপিআই-এর জন্য ব্লক যোগ করুন

  1. প্রথমে, মূল গুগল ক্লাউড প্রজেক্টটি প্রস্তুত করুন।

    আপনার main.tf কনফিগারেশন ফাইলে নিম্নলিখিত রিসোর্স ব্লকটি যোগ করুন।

    আপনাকে আপনার নিজের প্রোজেক্টের নাম (যেমন "Terraform FriendlyChat Codelab" ) এবং আপনার নিজের প্রোজেক্ট আইডি (যেমন "terraform-codelab-your-initials" ) উল্লেখ করতে হবে। মনে রাখবেন যে, ' name ভ্যালুটি শুধুমাত্র Firebase ইন্টারফেসের মধ্যেই ব্যবহৃত হয় এবং সাধারণ ব্যবহারকারীরা এটি দেখতে পান না। তবে, project_id ভ্যালুটি Google-এর কাছে আপনার প্রোজেক্টকে স্বতন্ত্রভাবে শনাক্ত করে, তাই নিশ্চিত করুন যে আপনি একটি অনন্য ভ্যালু উল্লেখ করেছেন। main.tf
    ...
    
    # Create a new Google Cloud project.
    resource "google_project" "default" {
      provider = google-beta.no_user_project_override
    
      name            = "<PROJECT_NAME_OF_YOUR_PROJECT>"
      project_id      = "<PROJECT_ID_OF_YOUR_PROJECT>"
    
      billing_account = "<YOUR_BILLING_ACCOUNT_ID>" # Add this line with your Cloud Billing account ID
    }
    
  2. এরপরে, আপনাকে প্রয়োজনীয় অন্তর্নিহিত API-গুলো সক্রিয় করতে হবে: Service Usage API এবং Firebase Management API।

    আপনি যখন ফায়ারবেস কনসোল ব্যবহার করে একটি ফায়ারবেস প্রজেক্ট তৈরি করেন, তখন এই এপিআই সক্রিয়করণটি সাধারণত নেপথ্যে সম্পন্ন হয়ে যায়, কিন্তু টেরাফর্মকে এই সক্রিয়করণটি করার জন্য সুস্পষ্টভাবে নির্দেশ দিতে হয়।

    আপনার main.tf কনফিগারেশন ফাইলে (নতুন ক্লাউড প্রজেক্ট তৈরি করার ব্লকটির ঠিক নিচে), নিম্নলিখিত রিসোর্স ব্লকটি যোগ করুন:

    main.tf
    ...
    
    # Enable the required underlying Service Usage API.
    resource "google_project_service" "serviceusage" {
      provider = google-beta.no_user_project_override
    
      project = google_project.default.project_id
      service = "serviceusage.googleapis.com"
    
      # Don't disable the service if the resource block is removed by accident.
      disable_on_destroy = false
    }
    
    # Enable the required underlying Firebase Management API.
    resource "google_project_service" "firebase" {
      provider = google-beta.no_user_project_override
    
      project = google_project.default.project_id
      service = "firebase.googleapis.com"
    
      # Don't disable the service if the resource block is removed by accident.
      disable_on_destroy = false
    }
    
    সার্ভিস ইউসেজ এপিআই (Service Usage API) সক্রিয় করার মাধ্যমে, আপনার নতুন প্রজেক্ট কোটা চেক গ্রহণ করতে সক্ষম হবে! সুতরাং, পরবর্তী সকল রিসোর্স প্রোভিশনিং এবং সার্ভিস সক্রিয় করার জন্য, আপনার user_project_override সহ প্রোভাইডারটি ব্যবহার করা উচিত (কোনো অ্যালিয়াসের প্রয়োজন নেই)।

ফায়ারবেস পরিষেবাগুলি সক্রিয় করতে একটি ব্লক যোগ করুন

একটি ফায়ারবেস প্রজেক্ট তৈরি করার জন্য একেবারে শেষ যে কাজটি করতে হবে তা হলো প্রজেক্টটিতে ফায়ারবেস সার্ভিসগুলো সক্রিয় করা।

এরপর আপনার main.tf কনফিগারেশন ফাইলে নিম্নলিখিত রিসোর্স ব্লকটি যোগ করুন।

উপরেই যেমন উল্লেখ করা হয়েছে, লক্ষ্য করুন যে এই রিসোর্স ব্লকটি user_project_override সহ প্রোভাইডারটি ব্যবহার করছে (কোনো অ্যালিয়াসের প্রয়োজন নেই)।

main.tf

...

# Enable Firebase services for the new project created above.
resource "google_firebase_project" "default" {
  provider = google-beta

  project = google_project.default.project_id

  # Wait until the required APIs are enabled.
  depends_on = [
    google_project_service.firebase,
    google_project_service.serviceusage,
  ]
}

উপরের রিসোর্স ব্লকে, আপনি depends_on ক্লজটি লক্ষ্য করতে পারেন, যা Terraform-কে অন্তর্নিহিত API-গুলো সক্রিয় হওয়া পর্যন্ত অপেক্ষা করতে বলে। এই ক্লজটি ছাড়া, Terraform নির্ভরতা সম্পর্কে জানতে পারে না এবং সমান্তরালভাবে রিসোর্স প্রোভিশনিং করার সময় ত্রুটির সম্মুখীন হতে পারে।

কনফিগারেশন প্রয়োগ করুন

  1. নতুন রিসোর্সগুলো প্রোভিশন করতে এবং আপনার কনফিগ ফাইলে উল্লেখিত API-গুলো সক্রিয় করতে, আপনার main.tf ফাইলটি যে ডিরেক্টরিতে রয়েছে (যেটি web হওয়া উচিত), সেই ডিরেক্টরির রুট থেকে নিম্নলিখিত কমান্ডটি চালান:
    terraform apply
    
  2. টার্মিনালে, টেরাফর্ম যে কাজগুলো করবে তার একটি পরিকল্পনা প্রিন্ট করে।

    সবকিছু প্রত্যাশা অনুযায়ী দেখা গেলে, yes লিখে পদক্ষেপগুলো অনুমোদন করুন।

    main.tf
    Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
      + create
    
    Terraform will perform the following actions:
    
      # google_firebase_project.default will be created
      + resource "google_firebase_project" "default" {
          + display_name   = (known after apply)
          + id             = (known after apply)
          + project        = "terraform-friendlychat-codelab"
          + project_number = (known after apply)
        }
    
      # google_project.default will be created
      + resource "google_project" "default" {
          + auto_create_network = true
          + id                  = (known after apply)
          + name                = "Terraform FriendlyChat Codelab"
          + number              = (known after apply)
          + project_id          = "terraform-friendlychat-codelab"
          + skip_delete         = (known after apply)
        }
    
      # google_project_service.firebase will be created
      + resource "google_project_service" "firebase" {
          + disable_on_destroy = false
          + id                 = (known after apply)
          + project            = "terraform-friendlychat-codelab"
          + service            = "firebase.googleapis.com"
        }
    
      # google_project_service.serviceusage will be created
      + resource "google_project_service" "serviceusage" {
          + disable_on_destroy = false
          + id                 = (known after apply)
          + project            = "terraform-friendlychat-codelab"
          + service            = "serviceusage.googleapis.com"
        }
    
    Plan: 4 to add, 0 to change, 0 to destroy.
    
    Do you want to perform these actions?
      Terraform will perform the actions described above.
      Only 'yes' will be accepted to approve.
    
      Enter a value: yes # <----
    

মনে রাখবেন, যদি আপনি পরিবর্তনগুলো প্রয়োগ না করে শুধু প্রিভিউ করতে চান, তাহলে এর পরিবর্তে terraform plan কমান্ডটি ব্যবহার করতে পারেন।

পরিবর্তনগুলি যাচাই করুন

Terraform-এর রান সম্পন্ন হওয়ার পর, নিম্নলিখিত কমান্ডটি চালিয়ে আপনি Terraform দ্বারা প্রোভিশন করা সমস্ত রিসোর্স এবং সক্রিয় থাকা সার্ভিসগুলোর অবস্থা পরীক্ষা করতে পারেন:

terraform show

মুদ্রিত হলে আপনি যা দেখতে পাবেন তার একটি উদাহরণ এখানে দেওয়া হলো। আপনার স্টেটে আপনার প্রোজেক্টের জন্য নির্দিষ্ট মান থাকবে।

# google_firebase_project.default:
resource "google_firebase_project" "default" {
    display_name   = "Terraform FriendlyChat Codelab"
    id             = "projects/terraform-friendlychat-codelab"
    project        = "terraform-friendlychat-codelab"
    project_number = "000000000"
}

# google_project.default:
resource "google_project" "default" {
    auto_create_network = true
    id                  = "projects/terraform-friendlychat-codelab"
    name                = "Terraform FriendlyChat Codelab"
    number              = "000000000"
    project_id          = "terraform-friendlychat-codelab"
}

# google_project_service.firebase:
resource "google_project_service" "firebase" {
    disable_on_destroy = false
    id                 = "terraform-friendlychat-codelab/firebase.googleapis.com"
    project            = "terraform-friendlychat-codelab"
    service            = "firebase.googleapis.com"
}

# google_project_service.serviceusage:
resource "google_project_service" "serviceusage" {
    disable_on_destroy = false
    id                 = "terraform-friendlychat-codelab/serviceusage.googleapis.com"
    project            = "terraform-friendlychat-codelab"
    service            = "serviceusage.googleapis.com"
}

বিকল্পভাবে, আপনি ফায়ারবেস কনসোলে প্রজেক্টটি দেখে যাচাই করতে পারেন যে এটি তৈরি হয়েছে কিনা।

The Terraform FriendlyChat Codelab project selected on the Firebase console

৫. Terraform-এর মাধ্যমে আপনার Firebase অ্যাপটি রেজিস্টার করুন।

Firebase ব্যবহার করার জন্য, আপনাকে আপনার অ্যাপের প্রতিটি প্ল্যাটফর্ম-ভেরিয়েন্ট আপনার Firebase প্রজেক্টে রেজিস্টার করতে হবে। এই কোডল্যাবে, আপনি Terraform-এর মাধ্যমে যা প্রোভিশন করেছেন তা পরীক্ষা করতে এবং তার সাথে ইন্টারঅ্যাক্ট করতে একটি বাস্তব অ্যাপ ব্যবহার করবেন। এই অ্যাপটি একটি ওয়েব অ্যাপ, তাই আপনাকে Terraform-কে বলতে হবে যেন এটি আপনার নতুন তৈরি করা Firebase প্রজেক্টে একটি Firebase ওয়েব অ্যাপ রেজিস্টার করে।

ওয়েব অ্যাপটি নিবন্ধন করতে একটি ব্লক যোগ করুন

আপনার ফায়ারবেস প্রজেক্টে ওয়েব অ্যাপটি রেজিস্টার করতে, আপনার main.tf ফাইলে নিম্নলিখিত রিসোর্স ব্লকটি যুক্ত করুন।

আপনার ওয়েব অ্যাপের জন্য আপনাকে নিজস্ব display_name নির্দিষ্ট করতে হবে। মনে রাখবেন, এই নামটি শুধুমাত্র Firebase ইন্টারফেসের মধ্যেই ব্যবহৃত হয় এবং সাধারণ ব্যবহারকারীরা এটি দেখতে পান না।

main.tf

...

# Create a Firebase Web App in the new project created above.
resource "google_firebase_web_app" "default" {
  provider = google-beta

  project      = google_firebase_project.default.project
  display_name = "<DISPLAY_NAME_OF_YOUR_WEB_APP>"
}

কনফিগারেশন প্রয়োগ করুন

  1. নতুন রিসোর্সটি প্রোভিশন করতে, আপনার main.tf ফাইলটি যে ডিরেক্টরিতে আছে (যেটি web হওয়া উচিত), সেই একই ডিরেক্টরির রুট থেকে নিম্নলিখিত কমান্ডটি চালান।
    terraform apply
    
    মনে রাখবেন যে এই কমান্ডটি নতুন করে কোনো গুগল ক্লাউড প্রজেক্ট তৈরি করবে না। টেরাফর্ম শনাক্ত করবে যে নির্দিষ্ট প্রজেক্ট আইডি সহ একটি প্রজেক্ট ইতিমধ্যেই বিদ্যমান আছে এবং প্রজেক্টটির বর্তমান অবস্থার সাথে .tf ফাইলের তথ্যের তুলনা করে প্রয়োজনীয় পরিবর্তনগুলো করবে।
  2. মুদ্রিত কর্মপরিকল্পনাটি পর্যালোচনা করুন। সবকিছু প্রত্যাশা অনুযায়ী মনে হলে, পদক্ষেপগুলো অনুমোদন করার জন্য yes টাইপ করে এন্টার চাপুন।

পরিবর্তনগুলি যাচাই করুন

নিম্নলিখিত কমান্ডটি চালিয়ে আপনি নতুনভাবে সরবরাহ করা রিসোর্সটির অবস্থা পরীক্ষা করতে পারেন:

terraform show

বিকল্পভাবে, আপনি ফায়ারবেস কনসোলে অ্যাপটি দেখে যাচাই করতে পারেন যে এটি আপনার প্রোজেক্টে সফলভাবে নিবন্ধিত হয়েছে কিনা। 'Project settings'- এ যান এবং তারপরে নিচে স্ক্রল করে 'Your apps' সেকশনে যান।

৬. ফায়ারবেস অথেনটিকেশন সেট আপ করুন

যেকোনো অ্যাপের জন্য অথেনটিকেশন একটি গুরুত্বপূর্ণ অংশ। ব্যবহারকারীদের তাদের গুগল অ্যাকাউন্ট দিয়ে আপনার ওয়েব অ্যাপে সাইন ইন করার সুযোগ দিতে, আপনি ফায়ারবেস অথেনটিকেশন চালু করতে এবং ‘সাইন-ইন উইথ গুগল’ পদ্ধতিটি সেট আপ করতে পারেন।

উল্লেখ্য যে, এই কোডল্যাবে আমরা ফায়ারবেস অথেনটিকেশন সেট আপ করার জন্য দুটি ভিন্ন বিকল্প দিয়েছি:

  • বিকল্প ১ (সুপারিশকৃত) : Firebase কনসোলে Firebase Authentication সেট আপ করুন, যার জন্য GCIP-এর প্রয়োজন নেই।
    • এই বিকল্পটি ব্যবহার করার অর্থ হলো, আপনাকে আপনার নতুন প্রজেক্টটি কোনো ক্লাউড বিলিং অ্যাকাউন্টের সাথে লিঙ্ক করতে হবে না । উল্লেখ্য যে, এই নির্দিষ্ট কোডল্যাবটির জন্য ক্লাউড স্টোরেজ ব্যবহার করতে একটি বিলিং অ্যাকাউন্ট প্রয়োজন, তাই প্রাথমিক টেরাফর্ম কনফিগারেশনে ইতিমধ্যেই একটি বিলিং অ্যাকাউন্ট লিঙ্ক করা ছিল।
  • বিকল্প ২ : গুগল ক্লাউড আইডেন্টিটি প্ল্যাটফর্ম (GCIP) এপিআই ব্যবহার করে টেরাফর্মের মাধ্যমে ফায়ারবেস অথেনটিকেশন সেট আপ করুন।
    • এই বিকল্পটি ব্যবহার করার অর্থ হলো আপনাকে আপনার নতুন প্রজেক্টটি একটি ক্লাউড বিলিং অ্যাকাউন্টের সাথে লিঙ্ক করতে হবে, কারণ GCIP-এর শর্তানুযায়ী প্রজেক্টটিকে ব্লেজ প্রাইসিং প্ল্যানের অন্তর্ভুক্ত থাকতে হবে।

বিকল্প ১: ফায়ারবেস কনসোল ব্যবহার করে প্রমাণীকরণ সেট আপ করুন

Firebase কনসোল ব্যবহার করে Firebase Authentication সেট আপ করার জন্য আপনার প্রজেক্টটিকে Blaze প্রাইসিং প্ল্যানে থাকার প্রয়োজন নেই।

ফায়ারবেস অথেনটিকেশন সেট আপ করার এবং গুগল দিয়ে সাইন-ইন করার পদ্ধতি নিচে দেওয়া হলো:

  1. Firebase কনসোলের বাম প্যানেলে Databases & Storage সেকশনটি খুঁজুন।
  2. Authentication-এ ক্লিক করুন, Get started-এ ক্লিক করুন, এবং তারপরে Sign-in method ট্যাবে ক্লিক করুন (অথবা সরাসরি সেখানে যেতে এখানে ক্লিক করুন )।
  3. ‘Add new provider’-এ ক্লিক করুন এবং ‘Additional providers’ সেকশন থেকে Google সিলেক্ট করুন।
  4. সক্ষম করুন টগলটি সক্রিয় করুন।
  5. আপনার অ্যাপের সর্বজনীন নামটি FriendlyChat এর মতো কিছু একটা রাখুন (এটি বিশ্বব্যাপী অনন্য হওয়ার প্রয়োজন নেই)।
  6. ড্রপডাউন মেনু থেকে একটি প্রজেক্ট সাপোর্ট ইমেল বেছে নিন এবং তারপরে সেভ-এ ক্লিক করুন। Configuring Firebase Auth on the Firebase console
  7. আপনার গুগলকে একটি সক্রিয় সাইন-ইন প্রদানকারী হিসেবে দেখা উচিত। Firebase console Authentication page: Google sign-in enabled

বিকল্প ২: গুগল ক্লাউড আইডেন্টিটি প্ল্যাটফর্ম (GCIP) এপিআই ব্যবহার করে টেরাফর্মের মাধ্যমে অথেনটিকেশন সেট আপ করুন

টেরাফর্মের মাধ্যমে ফায়ারবেস অথেনটিকেশন সেট আপ করতে হলে আপনাকে অবশ্যই GCIP API ব্যবহার করতে হবে, যার অর্থ হলো প্রজেক্টটিকে ব্লেজ প্রাইসিং প্ল্যানে থাকতে হবে। প্রজেক্টটির সাথে একটি ক্লাউড বিলিং অ্যাকাউন্ট যুক্ত করার মাধ্যমে আপনি আপনার ফায়ারবেস প্রজেক্টকে ব্লেজ প্ল্যান ব্যবহার করার জন্য আপগ্রেড করতে পারেন।

টেরাফর্মের মাধ্যমে বিলিং সক্ষম করুন

  1. আপনার যদি আগে থেকে কোনো ক্লাউড বিলিং অ্যাকাউন্ট না থাকে, তাহলে প্রথম ধাপ হলো গুগল ক্লাউড কনসোলে একটি নতুন অ্যাকাউন্ট তৈরি করা। এটি করার সময়, এর বিলিং অ্যাকাউন্ট আইডিটি লিখে রাখুন। বিলিং পেজের মধ্যে আপনার প্রোজেক্টের সাথে যুক্ত বিলিং অ্যাকাউন্ট আইডিটি খুঁজে পাওয়া যাবে। Enabling a billing account using the Google Cloud console
  2. Terraform-এর মাধ্যমে আপনার প্রোজেক্টে বিলিং চালু করতে, আপনার main.tf ফাইলে বিদ্যমান google_project রিসোর্সে একটি billing_account অ্যাট্রিবিউট যোগ করুন:

    main.tf
    ...
    
    # Create a new Google Cloud project.
    resource "google_project" "default" {
      provider = google-beta.no_user_project_override
    
      name            = "<PROJECT_NAME_OF_YOUR_PROJECT>"
      project_id      = "<PROJECT_ID_OF_YOUR_PROJECT>"
      billing_account = "<YOUR_BILLING_ACCOUNT_ID>" # Add this line with your Cloud Billing account ID
    }
    
    ...
    

টেরাফর্মের মাধ্যমে ফায়ারবেস অথেনটিকেশন সক্রিয় করুন এবং গুগল দিয়ে সাইন-ইন করুন।

  1. GCIP সহ Firebase Authentication চালু করতে, আপনার main.tf ফাইলে নিম্নলিখিত রিসোর্স ব্লকগুলি যুক্ত করুন:

    main.tf
    ...
    
    # Enable the Identity Toolkit API.
    resource "google_project_service" "auth" {
      provider = google-beta
    
      project  = google_firebase_project.default.project
      service =  "identitytoolkit.googleapis.com"
    
      # Don't disable the service if the resource block is removed by accident.
      disable_on_destroy = false
    }
    
    # Create an Identity Platform config.
    # Also, enable Firebase Authentication using Identity Platform (if Authentication isn't yet enabled).
    resource "google_identity_platform_config" "auth" {
      provider = google-beta
      project  = google_firebase_project.default.project
    
      # For example, you can configure to auto-delete anonymous users.
      autodelete_anonymous_users = true
    
      # Wait for identitytoolkit.googleapis.com to be enabled before initializing Authentication.
      depends_on = [
        google_project_service.auth,
      ]
    }
    
  2. গুগল দিয়ে সাইন-ইন চালু করতে আপনার একটি OAuth ক্লায়েন্ট থাকা প্রয়োজন। এই সেটআপটি করার জন্য গুগল ক্লাউড কনসোলের APIs & Services বিভাগে যান।
  3. যেহেতু আপনি এই প্রজেক্টের জন্য প্রথমবারের মতো ক্লায়েন্ট আইডি তৈরি করছেন, তাই আপনাকে আপনার OAuth কনসেন্ট স্ক্রিনটি কনফিগার করতে হবে।
    1. OAuth সম্মতি স্ক্রিন পৃষ্ঠাটি খুলুন এবং তারপরে আপনার এইমাত্র তৈরি করা প্রজেক্টটি নির্বাচন করুন।
    2. ব্যবহারকারীর ধরন ‘এক্সটার্নাল’ হিসেবে সেট করুন, এবং তারপর ‘ক্রিয়েট’ বাটনে ক্লিক করুন।
    3. পরবর্তী স্ক্রিনে নিচের তথ্যগুলো পূরণ করুন এবং তারপর 'Save and continue'- তে ক্লিক করুন।
      • আপনার অ্যাপের সর্বজনীন নামটি FriendlyChat এর মতো কিছু একটা রাখুন (এটি বিশ্বব্যাপী অনন্য হওয়ার প্রয়োজন নেই)।
      • ড্রপডাউন মেনু থেকে একটি ব্যবহারকারী সহায়তা ইমেল বেছে নিন।
      • ডেভেলপারের যোগাযোগের তথ্যের জন্য একটি ইমেল দিন।
    4. পরবর্তী স্ক্রিনগুলোতে নিম্নলিখিতগুলি সম্পূর্ণ করুন:
      • স্কোপস পৃষ্ঠায় ডিফল্টগুলো গ্রহণ করুন, এবং তারপর সেভ অ্যান্ড কন্টিনিউ-তে ক্লিক করুন।
      • টেস্ট ইউজার্স পেজে ডিফল্টগুলো গ্রহণ করুন, এবং তারপর সেভ অ্যান্ড কন্টিনিউ-তে ক্লিক করুন।
      • সারাংশটি পর্যালোচনা করুন, এবং তারপর 'ড্যাশবোর্ডে ফিরে যান'-এ ক্লিক করুন।
      Configuring an OAuth2 client using the Google Cloud console
  4. ক্রেডেনশিয়ালস পেজে নিম্নলিখিত পদক্ষেপগুলো অনুসরণ করে একটি OAuth ক্লায়েন্ট সেট আপ করুন:
    1. Create credentials-এ ক্লিক করুন এবং OAuth ক্লায়েন্ট আইডি নির্বাচন করুন।
    2. অ্যাপ্লিকেশন টাইপ ড্রপ-ডাউন থেকে ওয়েব অ্যাপ্লিকেশন নির্বাচন করুন।
    3. Name ফিল্ডে আপনার অ্যাপের নাম লিখুন, যেমন FriendlyChat (এটি বিশ্বব্যাপী অনন্য হওয়ার প্রয়োজন নেই)।
    4. নিম্নলিখিতগুলি সেট করে আপনার অ্যাপের URL-কে এই OAuth ক্লায়েন্টটি ব্যবহার করার অনুমতি দিন:
      • অনুমোদিত জাভাস্ক্রিপ্ট অরিজিন- এর অধীনে, ইউআরআই যোগ করুন-এ ক্লিক করুন এবং প্রবেশ করান।
        https://<PROJECT_ID>.firebaseapp.com , যেখানে <PROJECT_ID> হলো আপনার main.tf ফাইলে সেট করা প্রজেক্ট আইডি।
      • অনুমোদিত রিডাইরেক্ট ইউআরআই-এর অধীনে, ইউআরআই যোগ করুন-এ ক্লিক করুন এবং প্রবেশ করান।
        https://<PROJECT_ID>.firebaseapp.com/__/auth/handler , যেখানে <PROJECT_ID> হলো আপনার main.tf ফাইলে সেট করা প্রজেক্ট আইডি।
    5. সংরক্ষণ করুন- এ ক্লিক করুন।
    Obtaining the OAuth2 Client ID and secret from the Google Cloud console Credentials page
  5. আপনার OAuth ক্লায়েন্ট আইডি এবং ক্লায়েন্ট সিক্রেট ব্যবহার করে গুগলের মাধ্যমে সাইন-ইন সক্ষম করতে, আপনার main.tf ফাইলে নিম্নলিখিত ব্লকটি যুক্ত করুন:

    main.tf
    ...
    
    variable "oauth_client_secret" {
      type = string
    
      description = "OAuth client secret. For this codelab, you can pass in this secret through the environment variable TF_VAR_oauth_client_secret. In a real app, you should use a secret manager service."
    
      sensitive = true
    }
    
    resource "google_identity_platform_default_supported_idp_config" "google_sign_in" {
      provider = google-beta
      project  = google_firebase_project.default.project
    
      enabled       = true
      idp_id        = "google.com"
      client_id     = "<YOUR_OAUTH_CLIENT_ID>"
      client_secret = var.oauth_client_secret
    
      depends_on = [
         google_identity_platform_config.auth
      ]
    }
    

কনফিগারেশন প্রয়োগ করুন

  1. আপনার কনফিগারেশন অনুযায়ী অথেনটিকেশন সেট আপ করতে, আপনার main.tf ফাইলটি যে ডিরেক্টরিতে আছে (যেটি web হওয়া উচিত), সেই ডিরেক্টরির রুট থেকে নিম্নলিখিত কমান্ডগুলি চালান:
    export TF_VAR_oauth_client_secret="<YOUR_OAUTH_CLIENT_SECRET>"
    
    terraform apply
    
    মনে রাখবেন যে, terraform apply চালালে নতুন কোনো গুগল ক্লাউড প্রজেক্ট তৈরি হবে না। Terraform শনাক্ত করবে যে নির্দিষ্ট প্রজেক্ট আইডি সহ একটি প্রজেক্ট ইতিমধ্যেই বিদ্যমান আছে এবং প্রজেক্টটির বর্তমান অবস্থার সাথে .tf ফাইলের তথ্যের তুলনা করবে। এরপর এটি প্রাপ্ত পরিবর্তনগুলো প্রয়োগ করবে।
  2. মুদ্রিত কর্মপরিকল্পনাটি পর্যালোচনা করুন। সবকিছু প্রত্যাশা অনুযায়ী মনে হলে, পদক্ষেপগুলো অনুমোদন করার জন্য yes টাইপ করে এন্টার চাপুন।

পরিবর্তনগুলি যাচাই করুন

  1. Firebase কনসোলের বাম প্যানেলে Databases & Storage সেকশনটি খুঁজুন।
  2. Authentication-এ ক্লিক করুন, এবং তারপর Sign-in method ট্যাবে ক্লিক করুন (অথবা সরাসরি সেখানে যেতে এখানে ক্লিক করুন )।
  3. আপনার গুগলকে একটি সক্রিয় সাইন-ইন প্রদানকারী হিসেবে দেখা উচিত। Firebase console Authentication page: Google sign-in enabled

৭. একটি ফায়ারস্টোর ডেটাবেস এবং এর নিরাপত্তা নিয়মাবলী সেট আপ করুন।

এই কোডল্যাবের ওয়েব অ্যাপটির জন্য, আপনাকে ব্যবহারকারীদের মধ্যেকার বার্তাগুলো একটি ফায়ারস্টোর ডেটাবেসে সংরক্ষণ করতে হবে।

  1. প্রয়োজনীয় API-গুলো সক্রিয় করতে এবং ডাটাবেস ইনস্ট্যান্স প্রস্তুত করতে, আপনার main.tf ফাইলে নিম্নলিখিত রিসোর্স ব্লকগুলো যুক্ত করুন:

    main.tf
    ...
    
    # Enable required APIs for Cloud Firestore.
    resource "google_project_service" "firestore" {
      provider = google-beta
    
      project  = google_firebase_project.default.project
      for_each = toset([
        "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
    }
    
    # Provision the Firestore database instance.
    resource "google_firestore_database" "default" {
      provider                    = google-beta
    
      project                     = google_firebase_project.default.project
      name                        = "(default)"
      # See available locations:
      # https://firebase.google.com/docs/firestore/locations
      location_id                 = "<NAME_OF_DESIRED_REGION>"
      # "FIRESTORE_NATIVE" is required to use Firestore with Firebase SDKs,
      # authentication, and Firebase Security Rules.
      type                        = "FIRESTORE_NATIVE"
      concurrency_mode            = "OPTIMISTIC"
    
      depends_on = [
        google_project_service.firestore
      ]
    }
    
  2. <NAME_OF_DESIRED_REGION> পরিবর্তন করে সেই অঞ্চলের নাম দিন যেখানে আপনি ডাটাবেসটি রাখতে চান।

    প্রোডাকশন অ্যাপ তৈরি করার সময়, আপনি চাইবেন এটি এমন একটি অঞ্চলে থাকুক যা অধিকাংশ ব্যবহারকারীর কাছাকাছি এবং ক্লাউড ফাংশনের মতো অন্যান্য ফায়ারবেস পরিষেবার সাথে সংযুক্ত। এই কোডল্যাবের জন্য, আপনি us-east1 (সাউথ ক্যারোলাইনা) ব্যবহার করতে পারেন অথবা আপনার সবচেয়ে কাছের অঞ্চলটি ব্যবহার করতে পারেন ( ক্লাউড ফায়ারস্টোর লোকেশন দেখুন)।
  3. Firebase-এর কাছে অ্যাক্সেসযোগ্য প্রতিটি Firestore ডাটাবেস ইনস্ট্যান্স অবশ্যই Firebase Security Rules দ্বারা সুরক্ষিত থাকতে হবে।

    এই কোডল্যাবের নমুনা কোডটি firestore.rules ফাইলে এক সেট সুরক্ষিত ফায়ারস্টোর নিয়ম সরবরাহ করে, যা আপনি web ডিরেক্টরির রুটে খুঁজে পাবেন।
  4. নিম্নলিখিত কাজগুলো করার জন্য আপনার main.tf ফাইলে নিচের রিসোর্স ব্লকগুলো যুক্ত করুন:
    • স্থানীয় firestore.rules ফাইল থেকে ফায়ারবেস নিরাপত্তা নিয়মের একটি সেট তৈরি করুন।
    • ফায়ারস্টোর ইনস্ট্যান্সের জন্য রুলসেটটি প্রকাশ করুন।
    উল্লেখ্য যে, এই রিসোর্স ব্লকগুলো ফায়ারবেস কনসোলে পাবলিশ বাটনে ক্লিক করা অথবা firebase deploy --only firestore:rules চালানোর সমতুল্য কাজ করে।

    main.tf
    ...
    
    # Create a ruleset of Firestore Security Rules from a local file.
    resource "google_firebaserules_ruleset" "firestore" {
      provider = google-beta
    
      project  = google_firebase_project.default.project
      source {
        files {
          name = "firestore.rules"
          # Write security rules in a local file named "firestore.rules".
          # Learn more: https://firebase.google.com/docs/firestore/security/get-started
          content = file("firestore.rules")
        }
      }
    
      # Wait for Firestore to be provisioned before creating this ruleset.
      depends_on = [
        google_firestore_database.default,
      ]
    }
    
    # Release 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_firebase_project.default.project
    
      # Wait for Firestore to be provisioned before releasing the ruleset.
      depends_on = [
        google_firestore_database.default,
      ]
    
      lifecycle {
        replace_triggered_by = [
          google_firebaserules_ruleset.firestore
        ]
      }
    }
    
  5. ফায়ারস্টোর ডাটাবেস প্রোভিশন করতে এবং এর নিরাপত্তা নিয়মগুলো প্রয়োগ করতে terraform apply চালান।
  6. যাচাই করুন যে ডেটাবেসটি প্রোভিশন করা হয়েছে এবং এর নিরাপত্তা নিয়মগুলি ডেপ্লয় করা হয়েছে:
    1. Firebase কনসোলের বাম প্যানেলে Databases & Storage সেকশনটি খুঁজুন।
    2. Firestore Database সেকশনে যান এবং তারপর Rules ট্যাবে ক্লিক করুন।
    Verifying Cloud Firestore rules using the Firebase console

৮. একটি ক্লাউড স্টোরেজ বাকেট এবং এর নিরাপত্তা নিয়মাবলী সেট আপ করুন।

এই কোডল্যাবের ওয়েব অ্যাপটির জন্য, ব্যবহারকারীদের মধ্যে আদান-প্রদান করা ছবিগুলো একটি ক্লাউড স্টোরেজ বাকেটে সংরক্ষণ করতে হবে।

  1. প্রয়োজনীয় API-গুলো সক্রিয় করতে এবং একটি ক্লাউড স্টোরেজ বাকেট প্রস্তুত করতে, আপনার main.tf ফাইলে নিম্নলিখিত রিসোর্স ব্লকগুলো যুক্ত করুন।

    main.tf
    ...
    
    # Enable required APIs for Cloud Storage for Firebase.
    resource "google_project_service" "storage" {
      provider = google-beta
    
      project  = google_firebase_project.default.project
      for_each = toset([
        "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
    }
    
    # Provision a Cloud Storage bucket.
    # This is not the default Cloud Storage bucket for your project
    # (provisioning of the default bucket via Terraform is coming soon)
    resource "google_storage_bucket" "bucket" {
      provider = google-beta
      project  = google_firebase_project.default.project
      name     = "<NAME_OF_STORAGE_BUCKET>"
      # See available locations: https://cloud.google.com/storage/docs/locations#available-locations
      location = "<NAME_OF_DESIRED_REGION_FOR_BUCKET>"
    }
    
    # Make the Storage bucket accessible for Firebase SDKs, authentication, and Firebase Security Rules.
    resource "google_firebase_storage_bucket" "bucket" {
      provider  = google-beta
    
      project   = google_firebase_project.default.project
      bucket_id = google_storage_bucket.bucket.name
    }
    
  2. Firebase-এর নাগালের মধ্যে থাকা প্রতিটি ক্লাউড স্টোরেজ বাকেট অবশ্যই Firebase নিরাপত্তা নিয়ম দ্বারা সুরক্ষিত থাকতে হবে।

    এই কোডল্যাবের নমুনা কোডটি storage.rules ফাইলে এক সেট সুরক্ষিত ফায়ারস্টোর নিয়ম সরবরাহ করে, যা আপনি web ডিরেক্টরির রুটে খুঁজে পাবেন।
  3. নিম্নলিখিত কাজগুলো করার জন্য আপনার main.tf ফাইলে নিচের রিসোর্স ব্লকগুলো যুক্ত করুন:
    • স্থানীয় ফাইল থেকে ফায়ারবেস নিরাপত্তা নিয়মের একটি সেট তৈরি করুন।
    • স্টোরেজ বাকেটের জন্য রুলসেটটি রিলিজ করুন।
    উল্লেখ্য যে, এই রিসোর্স ব্লকগুলো ফায়ারবেস কনসোলে পাবলিশ বাটনে ক্লিক করা অথবা firebase deploy --only storage চালানোর সমতুল্য কাজ করে।

    main.tf
    ...
    
    # Create a ruleset of Cloud Storage Security Rules from a local file.
    resource "google_firebaserules_ruleset" "storage" {
      provider = google-beta
    
      project  = google_firebase_project.default.project
      source {
        files {
          # Write security rules in a local file named "storage.rules".
          # Learn more: https://firebase.google.com/docs/storage/security/get-started
          name    = "storage.rules"
          content = file("storage.rules")
        }
      }
    
      # Wait for the Storage bucket to be provisioned before creating this ruleset.
      depends_on = [
        google_firebase_storage_bucket.bucket,
      ]
    }
    
    # Release the ruleset for the Storage bucket.
    resource "google_firebaserules_release" "bucket" {
      provider     = google-beta
    
      name         = "firebase.storage/${google_firebase_storage_bucket.bucket.bucket_id}"
      ruleset_name = "projects/${google_firebase_project.default.project}/rulesets/${google_firebaserules_ruleset.storage.name}"
      project      = google_firebase_project.default.project
    }
    
  4. ক্লাউড স্টোরেজ বাকেটটি প্রোভিশন করতে এবং এর নিরাপত্তা নিয়মগুলো প্রয়োগ করতে terraform apply চালান।
  5. যাচাই করুন যে বাকেটটি প্রোভিশন করা হয়েছে এবং এর নিরাপত্তা নিয়মগুলো ডিপ্লয় করা হয়েছে:
    1. Firebase কনসোলের বাম প্যানেলে Databases & Storage সেকশনটি খুঁজুন।
    2. স্টোরেজ বিভাগে যান এবং তারপরে রুলস ট্যাবে ক্লিক করুন।
    Verifying security rules using the Firebase console
  6. আপনার কোডবেসে, index.js পরিবর্তন করে নাম দ্বারা নন-ডিফল্ট বাকেটটিকে রেফারেন্স করুন:
    import { getApp } from "firebase/app";
    import { getStorage } from "firebase/storage";
    
    // Get a non-default Storage bucket
    const firebaseApp = getApp();
    const storage = getStorage(firebaseApp, "gs://<NAME_OF_STORAGE_BUCKET>");
    

৯. আপনার অ্যাপটি স্থানীয়ভাবে চালান

আপনি এখন প্রথমবারের মতো আপনার ওয়েব অ্যাপটি চালানোর জন্য প্রস্তুত! আপনি আপনার অ্যাপটি স্থানীয়ভাবে পরিবেশন করতে ফায়ারবেস হোস্টিং এমুলেটর ব্যবহার করবেন।

  1. একটি নতুন টার্মিনাল উইন্ডো খুলুন এবং web ডিরেক্টরি থেকে এমুলেটরটি চালু করতে নিম্নলিখিত Firebase CLI কমান্ডটি চালান:
    firebase emulators:start --project=<PROJECT_ID>
    
  2. আপনার ব্রাউজারে, CLI দ্বারা প্রাপ্ত স্থানীয় URL-এ (সাধারণত http://localhost:5000 ) আপনার ওয়েব অ্যাপটি খুলুন।

আপনি আপনার FriendlyChat অ্যাপের UI দেখতে পাবেন, যা (এখনও!) কাজ করছে না। অ্যাপটি এখনও Firebase-এর সাথে সংযুক্ত নয়, কিন্তু এই কোডল্যাবের পরবর্তী ধাপগুলো সম্পন্ন করলেই তা সংযুক্ত হয়ে যাবে!

মনে রাখবেন, যখনই আপনি আপনার ওয়েব অ্যাপে কোনো পরিবর্তন করবেন (যেমনটি আপনি এই কোডল্যাবের পরবর্তী ধাপগুলিতে করবেন), তখন সেই পরিবর্তনগুলির সাথে স্থানীয় URL আপডেট করতে আপনার ব্রাউজারটি রিফ্রেশ করুন।

১০. ফায়ারবেস ইনস্টল, কনফিগার এবং ইনিশিয়ালাইজ করুন

ফায়ারবেসের সাথে একটি অ্যাপ চালু করতে, আপনার অ্যাপটিতে ফায়ারবেস এসডিকে এবং আপনার ফায়ারবেস প্রজেক্টের জন্য ফায়ারবেস কনফিগারেশন প্রয়োজন।

এই কোডল্যাবের নমুনা কোডটি ইতিমধ্যেই একটি কার্যকরী অ্যাপ, যেখানে অ্যাপটিতে বিভিন্ন ফায়ারবেস প্রোডাক্ট ব্যবহারের জন্য প্রয়োজনীয় সমস্ত ডিপেন্ডেন্সি এবং ফাংশন অন্তর্ভুক্ত রয়েছে। কী কী কাজ ইতিমধ্যে করা হয়েছে তা দেখতে চাইলে আপনি web/package.json এবং web/src/index.js ফাইলগুলো দেখতে পারেন।

যদিও নমুনা কোডটি প্রায় সম্পূর্ণ, আপনার অ্যাপটি চালু করার জন্য আপনাকে এখনও কয়েকটি কাজ করতে হবে, যার মধ্যে রয়েছে: Firebase SDK ইনস্টল করা, আপনার বিল্ড শুরু করা, আপনার অ্যাপে Firebase কনফিগারেশন যোগ করা এবং সবশেষে Firebase ইনিশিয়ালাইজ করা।

Firebase SDK ইনস্টল করুন এবং আপনার ওয়েবপ্যাক বিল্ড শুরু করুন।

আপনার অ্যাপের বিল্ড শুরু করতে আপনাকে কয়েকটি কমান্ড চালাতে হবে।

  1. একটি নতুন টার্মিনাল উইন্ডো খুলুন।
  2. নিশ্চিত করুন যে আপনি web ডিরেক্টরির রুটে আছেন।
  3. Firebase SDK ডাউনলোড করতে npm install চালান।
  4. যেকোনো ডিপেন্ডেন্সি আপডেট করতে npm update চালান।
  5. ওয়েবপ্যাক চালু করতে npm run start চালান।

কোডল্যাবের বাকি অংশের জন্য, ওয়েবপ্যাক এখন ক্রমাগত আপনার সোর্স কোড পুনর্নির্মাণ করবে।

আপনার অ্যাপে আপনার ফায়ারবেস কনফিগারেশন যোগ করুন

আপনাকে আপনার অ্যাপে ফায়ারবেস কনফিগারেশনও যোগ করতে হবে, যাতে ফায়ারবেস এসডিকে-গুলো জানতে পারে যে আপনি কোন ফায়ারবেস প্রজেক্টটি ব্যবহার করতে চান।

এই কোডল্যাবের জন্য, আপনার ফায়ারবেস কনফিগারেশন পেতে দুটি ভিন্ন বিকল্প রয়েছে:

  • বিকল্প ১ : ফায়ারবেস কনসোল থেকে আপনার ফায়ারবেস কনফিগ সংগ্রহ করুন।
  • বিকল্প ২ : Terraform-এর মাধ্যমে আপনার Firebase কনফিগারেশন সংগ্রহ করুন।

বিকল্প ১: ফায়ারবেস কনসোল থেকে কনফিগটি সংগ্রহ করুন এবং আপনার কোডবেসে যোগ করুন।

  1. Firebase কনসোলে, আপনার প্রোজেক্ট সেটিংসে যান।
  2. নিচে স্ক্রল করে 'Your apps' কার্ডটিতে যান এবং তারপর আপনার ওয়েব অ্যাপটি নির্বাচন করুন।
  3. Firebase SDK স্নিপেট প্যান থেকে Config নির্বাচন করুন এবং তারপর কনফিগ স্নিপেটটি কপি করুন।
  4. আপনার অ্যাপের web/src/firebase-config.js ফাইলে আপনার কনফিগটি নিচের মতো করে পেস্ট করুন:

    firebase-config.js
    ...
    
    const config = {
      apiKey: "<API_KEY>",
      authDomain: "<PROJECT_ID>.firebaseapp.com",
      projectId: "<PROJECT_ID>",
      storageBucket: "<PROJECT_ID>.firebasestorage.app",
      messagingSenderId: "<SENDER_ID>",
      appId: "<APP_ID>",
      measurementId: "<G-MEASUREMENT_ID>",
    };
    
    ...
    

বিকল্প ২: Terraform-এর মাধ্যমে কনফিগারেশনটি সংগ্রহ করুন এবং আপনার কোডবেসে যোগ করুন।

বিকল্পভাবে, আপনি Terraform-এর CLI-তে একটি আউটপুট ভ্যালু হিসেবে আপনার Firebase কনফিগারেশন পেতে পারেন।

  1. আপনার main.tf ফাইলে, google_firebase_web_app রিসোর্স ব্লকটি খুঁজুন (যে ব্লকটি আপনার প্রোজেক্টে একটি ওয়েব অ্যাপ রেজিস্টার করেছিল)।
  2. ঐ ব্লকটির ঠিক পরেই নিম্নলিখিত ব্লকগুলো যোগ করুন:

    main.tf
    ...
    
    data "google_firebase_web_app_config" "default" {
      provider     = google-beta
      project      = google_firebase_project.default.project
      web_app_id   = google_firebase_web_app.default.app_id
    }
    
    output "friendlychat_web_app_config" {
      value = {
        projectId         = google_firebase_project.default.project
        appId             = google_firebase_web_app.default.app_id
        apiKey            = data.google_firebase_web_app_config.default.api_key
        authDomain        = data.google_firebase_web_app_config.default.auth_domain
        storageBucket     = lookup(data.google_firebase_web_app_config.default, "storage_bucket", "")
        messagingSenderId = lookup(data.google_firebase_web_app_config.default, "messaging_sender_id", "")
        measurementId     = lookup(data.google_firebase_web_app_config.default, "measurement_id", "")
      }
    }
    
    ...
    
  3. যেহেতু data ব্লক এবং output ব্লক কোনোভাবেই পরিকাঠামো পরিবর্তন করার জন্য নয়, তাই আপনাকে শুধু নিম্নলিখিত কমান্ডগুলো চালাতে হবে।
    1. আপনার ওয়েব অ্যাপের ফায়ারবেস কনফিগারেশনটি আপনার ডিরেক্টরির টেরাফর্ম স্টেটে লোড করতে, এই কমান্ডটি চালান:
      terraform refresh
      
    2. Firebase কনফিগারেশনের মানগুলো প্রিন্ট করতে এই কমান্ডটি চালান:
      terraform output –json
      
      নিচে একটি কনফিগের আউটপুটের উদাহরণ দেওয়া হলো। আপনার প্রিন্ট করা আউটপুটে আপনার প্রজেক্ট এবং অ্যাপের ভ্যালুগুলো থাকবে।
      {
        "friendlychat_web_app_config": {
          "sensitive": false,
          "type": [
            "object",
            {
              "apiKey": "string",
              "appId": "string",
              "authDomain": "string",
              "measurementId": "string",
              "messagingSenderId": "string",
              "projectId": "string",
              "storageBucket": "string"
            }
          ],
          "value": {
            "apiKey": "<API_KEY>",
            "appId": "<APP_ID>",
            "authDomain": "<PROJECT_ID>.firebaseapp.com",
            "measurementId": "<G-MEASUREMENT_ID>",
            "messagingSenderId": "<SENDER_ID>",
            "projectId": "<PROJECT_ID>",
            "storageBucket": "<PROJECT_ID>.firebasestorage.app"
          }
        }
      }
      
  4. value ম্যাপের ভেতর থেকে মানগুলো কপি করুন।
  5. এই মানগুলো (আপনার কনফিগারেশন) আপনার অ্যাপের web/src/firebase-config.js ফাইলে নিচের মতো করে পেস্ট করুন:

    firebase-config.js
    ...
    
    const config = {
      apiKey: "<API_KEY>",
      appId: "<APP_ID>",
      authDomain: "<PROJECT_ID>.firebaseapp.com",
      measurementId: "<G-MEASUREMENT_ID>",
      messagingSenderId: "<SENDER_ID>",
      projectId: "<PROJECT_ID>",
      storageBucket: "<PROJECT_ID>.firebasestorage.app",
    };
    
    ...
    

আপনার অ্যাপে Firebase চালু করুন

অবশেষে, Firebase চালু করার জন্য, আপনার অ্যাপের web/src/index.js ফাইলে নিম্নলিখিত কোডটি যুক্ত করুন:

index.js

...

const firebaseAppConfig = getFirebaseConfig();
initializeApp(firebaseAppConfig);

আপনার অ্যাপটি ব্যবহার করে দেখুন

এখন যেহেতু ফায়ারবেসের জন্য সবকিছু কনফিগার করা হয়ে গেছে, আপনি আপনার কার্যকরী ওয়েব অ্যাপটি পরীক্ষা করে দেখতে পারেন।

  1. আপনার অ্যাপটি পরিবেশনকারী ব্রাউজারটি রিফ্রেশ করুন।
  2. এখন আপনি গুগল দিয়ে সাইন ইন করে চ্যাটে বার্তা পোস্ট করা শুরু করতে পারবেন। আপনার কাছে ছবির ফাইল থাকলে, আপনি সেগুলো আপলোডও করতে পারবেন!

১১. বিভিন্ন পরিবেশে আপনার কনফিগারেশন প্রতিলিপি করুন

একই ধরনের কনফিগারেশনযুক্ত একাধিক ইনফ্রাস্ট্রাকচার পরিচালনা করার ক্ষেত্রে টেরাফর্ম অত্যন্ত পারদর্শী (উদাহরণস্বরূপ, একটি প্রোডাকশন প্রজেক্টের অনুরূপ একটি স্টেজিং ফায়ারবেস প্রজেক্ট সেট আপ করা)।

এই কোডল্যাবে, আপনি স্টেজিং এনভায়রনমেন্ট হিসেবে ব্যবহারের জন্য একটি দ্বিতীয় ফায়ারবেস প্রজেক্ট তৈরি করবেন।

এই স্টেজিং প্রজেক্টটি তৈরি করার জন্য বিদ্যমান কনফিগারেশনটি প্রতিলিপি করতে আপনার কাছে দুটি বিকল্প রয়েছে:

  • বিকল্প ১ : Terraform কনফিগারেশনটির একটি অনুলিপি তৈরি করুন।
    এই বিকল্পটি প্রতিলিপিকৃত প্রকল্পটি মূল প্রকল্প থেকে কতটা ভিন্ন হতে পারে, সে বিষয়ে সর্বাধিক নমনীয়তা প্রদান করে।
  • বিকল্প ২ : for_each ব্যবহার করে কনফিগারেশনগুলো পুনরায় ব্যবহার করুন।
    এই বিকল্পটি কোড পুনঃব্যবহারের আরও ভালো সুযোগ দেয়, যদি প্রতিটি প্রজেক্টের মধ্যে উল্লেখযোগ্য কোনো পার্থক্য না থাকে এবং আপনি একবারে সমস্ত প্রজেক্টে পরিবর্তনগুলো প্রয়োগ করতে চান।

বিকল্প ১: টেরাফর্ম কনফিগারেশনের একটি অনুলিপি তৈরি করুন

এই বিকল্পটি রেপ্লিকেট করা প্রজেক্টটি সোর্স প্রজেক্ট থেকে কতটা আলাদা হতে পারবে, সে বিষয়ে সর্বাধিক নমনীয়তা প্রদান করে; যেমন, ভিন্ন ডিসপ্লে নামের অ্যাপ এবং পর্যায়ক্রমিক রোলআউট রাখা।

  1. আপনার web ডিরেক্টরির রুটে main_staging.tf নামে একটি নতুন Terraform কনফিগারেশন ফাইল তৈরি করুন।
  2. আপনার main.tf ফাইল থেকে terraform এবং provider ব্লকগুলো ছাড়া বাকি সব resource ব্লক কপি করে main_staging.tf ফাইলে পেস্ট করুন।
  3. এরপর আপনার স্টেজিং প্রজেক্টের সাথে কাজ করানোর জন্য main_staging.tf এ থাকা আপনার প্রতিটি রেপ্লিকেটেড রিসোর্স ব্লক পরিবর্তন করতে হবে:
    • রিসোর্স লেবেল: দ্বন্দ্ব এড়াতে একটি নতুন নাম ব্যবহার করুন। উদাহরণস্বরূপ, resource "google_project" "default" নাম পরিবর্তন করে resource "google_project" "staging" রাখুন।
    • রিসোর্স রেফারেন্স: প্রতিটি আপডেট করুন। উদাহরণস্বরূপ, google_firebase_project.default.project কে google_firebase_project.staging.project এ আপডেট করুন।
    এই কোডল্যাবের গিটহাব রিপোজিটরিতে আপনি main_staging.tf ফাইলের সম্পূর্ণ কনফিগারেশন খুঁজে পাবেন:

    web/terraform-checkpoints/replicate-config/main_staging-copypaste.tf

    আপনি যদি এই কনফিগারেশনটি ব্যবহার করতে চান, তাহলে নিম্নলিখিত বিষয়গুলো নিশ্চিত করুন:
    1. main_staging-copypaste.tf থেকে কনফিগটি কপি করে আপনার main_staging.tf ফাইলে পেস্ট করুন।
    2. আপনার main_staging.tf ফাইলে নিম্নলিখিত কাজগুলো করুন:
      • google_project রিসোর্স ব্লকে, name অ্যাট্রিবিউট, project-id অ্যাট্রিবিউট এবং (যদি আপনি Terraform-এর মাধ্যমে Authentication সেট আপ করে থাকেন) billing_account অ্যাট্রিবিউট আপনার নিজের মান দিয়ে আপডেট করুন।
      • google_firebase_web_app রিসোর্স ব্লকে, display_name অ্যাট্রিবিউটটি আপনার নিজের মান দিয়ে আপডেট করুন।
      • google_firestore_database এবং google_app_engine_application রিসোর্স ব্লকগুলিতে, location_id অ্যাট্রিবিউটগুলি আপনার নিজের মান দিয়ে আপডেট করুন।
    main_staging.tf
    # Create a new Google Cloud project.
    resource "google_project" "staging" {
      provider = google-beta.no_user_project_override
    
      name            = "<PROJECT_NAME_OF_STAGING_PROJECT>"
      project_id      = "<PROJECT_ID_OF_STAGING_PROJECT"
      # Required if you want to set up Authentication via Terraform
      billing_account = "<YOUR_BILLING_ACCOUNT_ID>"
    }
    
    # Enable the required underlying Service Usage API.
    resource "google_project_service" "staging_serviceusage" {
      provider = google-beta.no_user_project_override
    
      project = google_project.staging.project_id
      service = "serviceusage.googleapis.com"
    
      # Don't disable the service if the resource block is removed by accident.
      disable_on_destroy = false
    }
    
    # Enable the required underlying Firebase Management API.
    resource "google_project_service" "staging_firebase" {
      provider = google-beta.no_user_project_override
    
      project = google_project.staging.project_id
      service = "firebase.googleapis.com"
    
      # Don't disable the service if the resource block is removed by accident.
      disable_on_destroy = false
    }
    
    # Enable Firebase services for the new project created above.
    resource "google_firebase_project" "staging" {
      provider = google-beta
    
      project = google_project.staging.project_id
    
      # Wait until the required APIs are enabled.
      depends_on = [
        google_project_service.staging_serviceusage,
        google_project_service.staging_firebase,
      ]
    }
    
    # Create a Firebase Web App in the new project created above.
    resource "google_firebase_web_app" "staging" {
      provider = google-beta
    
      project      = google_firebase_project.staging.project
      display_name = "<DISPLAY_NAME_OF_YOUR_WEB_APP>"
      deletion_policy = "DELETE"
    }
    
  4. আপনার নতুন "স্টেজিং" ফায়ারবেস প্রজেক্ট ও এর সমস্ত রিসোর্স প্রোভিশন করতে এবং এর সার্ভিসগুলো চালু করতে terraform apply চালান।
  5. আগের মতোই ফায়ারবেস কনসোলে সবকিছু পরীক্ষা করে নিশ্চিত করুন যে সেগুলো প্রত্যাশা অনুযায়ী প্রোভিশন এবং এনাবল করা হয়েছে।

বিকল্প ২: for_each ব্যবহার করে কনফিগারেশন পুনরায় ব্যবহার করুন

এই বিকল্পটি কোড পুনঃব্যবহারের আরও বেশি সুযোগ দেয়, যদি প্রতিটি প্রজেক্টের মধ্যে উল্লেখযোগ্য কোনো পার্থক্য না থাকে এবং আপনি একবারে সমস্ত প্রজেক্টে পরিবর্তনগুলো প্রয়োগ করতে চান। এটি টেরাফর্ম ল্যাঙ্গুয়েজের for_each মেটা-আর্গুমেন্ট ব্যবহার করে।

  1. আপনার main.tf ফাইলটি খুলুন।
  2. আপনি যে প্রতিটি রিসোর্স ব্লক প্রতিলিপি করতে চান, তার মধ্যে নিচের মতো করে একটি for_each মেটা-আর্গুমেন্ট যোগ করুন:

    main.tf
    # Create new Google Cloud projects.
    resource "google_project" "default" {
      provider        = google-beta.no_user_project_override
      name            = each.value
      # Create a unique project ID for each project, with each ID starting with <PROJECT_ID>.
      project_id      = "<PROJECT_ID>-${each.key}"
      # Required if you want to set up Authentication via Terraform
      billing_account = "<YOUR_BILLING_ACCOUNT_ID>"
    
      # Required for the projects to display in any list of Firebase projects.
      labels = {
        "firebase" = "enabled"
      }
    
      for_each = {
        prod    = "<PROJECT_NAME_OF_PROD_PROJECT>"
        staging = "<PROJECT_NAME_OF_STAGING_PROJECT>"
      }
    }
    
    # Enable the required underlying Service Usage API.
    resource "google_project_service" "serviceusage" {
      provider = google-beta.no_user_project_override
      for_each = google_project.default
    
      project = each.value.project_id
      service = "serviceusage.googleapis.com"
    
      # Don't disable the service if the resource block is removed by accident.
      disable_on_destroy = false
    }
    
    # Enable the required underlying Firebase Management API.
    resource "google_project_service" "firebase" {
      provider = google-beta.no_user_project_override
      for_each = google_project.default
    
      project = each.value.project_id
      service = "firebase.googleapis.com"
    
      # Don't disable the service if the resource block is removed by accident.
      disable_on_destroy = false
    }
    
    # Enable Firebase services for each of the new projects created above.
    resource "google_firebase_project" "default" {
      provider = google-beta
      for_each = google_project.default
    
      project = each.value.project_id
    
      depends_on = [
        google_project_service.serviceusage,
        google_project_service.firebase,
      ]
    }
    
    # Create a Firebase Web App in each of the new projects created above.
    resource "google_firebase_web_app" "default" {
      provider = google-beta
      for_each = google_firebase_project.default
    
      project      = each.value.project
      # The Firebase Web App created in each project will have the same display name.
      display_name = "<DISPLAY_NAME_OF_YOUR_WEB_APP>"
      deletion_policy = "DELETE"
    }
    
    
    # NOTE: For this codelab, we recommend setting up Firebase Authentication
    # using the Firebase console. However, if you set up Firebase Authentication
    # using Terraform, copy-paste from your main.tf the applicable blocks.
    # Make sure to add the `for_each` meta-argument into each block.
    
    
    # Copy-paste from your main.tf file the applicable resource blocks
    # for setting up Cloud Firestore (including rules) and
    # for setting up Cloud Storage for Firebase (including rules).
    # Make sure to add the `for_each` meta-argument into each block.
    
    for_each মেটা-আর্গুমেন্ট ব্যবহার করে এমন একটি main.tf ফাইলের সম্পূর্ণ কনফিগারেশন আপনি এই কোডল্যাবের গিটহাব রিপোজিটরিতে খুঁজে পেতে পারেন:

    web/terraform-checkpoints/replicate-config/main-foreach.tf

    আপনি যদি এই কনফিগারেশনটি ব্যবহার করতে চান, তাহলে নিম্নলিখিত বিষয়গুলো নিশ্চিত করুন:
    1. Copy the config from main-foreach.tf , and then paste it into your main.tf file.
    2. In your main.tf file, do the following:
      • In the google_project resource block, update the name attribute, the project-id attribute, and (if you set up Authentication via Terraform) the billing_account attribute with your own values.
      • In the google_firebase_web_app resource block, update the display_name attribute with your own value.
      • In the google_firestore_database and google_app_engine_application resource blocks, update the location_id attributes with your own value.
  3. Instead of applying this config right away, it's important to understand and fix a few things about how Terraform interprets this config compared to the existing infrastructure.
    1. Right now, if you applied this config that uses for_each , the resource addresses would look like the following:
      google_project.default["prod"]
      google_project.default["staging"]
      google_firebase_project.default["prod"]
      google_firebase_project.default["staging"]
      google_firebase_web_app.default["prod"]
      google_firebase_web_app.default["staging"]
      
      However, the existing project you created in the first part of this codelab is known to Terraform as the following:
      google_project.default
      google_firebase_project.default
      google_firebase_android_app.default
      
    2. Run terraform plan to see what actions Terraform would take given the current state.

      The output should show that Terraform would delete the project you created in the first part of this codelab and create two new projects. This is because Terraform doesn't know that the project at the address google_project.default has been moved to the new address google_project.default["prod"] .
    3. To fix this, run the terraform state mv command:
      terraform state mv "google_project.default" "google_project.default[\"prod\"]"
      
    4. Similarly, to fix all the other resource blocks, run terraform state mv for google_firebase_project , google_firebase_web_app , and all the other resource blocks in your main.tf file.
    5. Now, if you run terraform plan again, it shouldn't show that Terraform would delete the project you created in the first part of this codelab.
  4. Run terraform apply to provision your new "staging" Firebase project and all its resources and enable its services.
  5. Verify that everything was provisioned and enabled as expected by checking them in the Firebase console as before.

12. Bonus step: Deploy your staging and prod apps

  1. In your app's codebase, change the firebase-config.js to use the Firebase config from your staging project instead.

    To remind yourself how to get your Firebase config and add it to your app, see the earlier step of this codelab, Add your Firebase configuration to your app.
  2. At the root of your web directory, run the following command to deploy your app to your staging Firebase project.
    firebase deploy --only hosting --project=<STAGING_PROJECT_ID>
    
  3. Open your staging app in the browser via the URL that's printed in the output of firebase deploy . Try signing in, sending messages, and uploading images.

    When you deploy an app to a Firebase project, it uses real Firebase resources, not emulated resources. As you interact with your staging app, you should see data and images appear in your staging project in the Firebase console.
  4. After testing your app in staging, change the firebase-config.js back to using the prod project's Firebase config (the first project that you created in this codelab).
  5. At the root of your web directory, run the following command to deploy your app to your production Firebase project.
    firebase deploy --only hosting --project=<PRODUCTION_PROJECT_ID>
    
  6. Open your production app in the browser via the URL that's printed in the output of firebase deploy . Try signing in, sending messages, and uploading images.

    You should see data and images appear in your production project in the Firebase console.
  7. When you're finished interacting with the two apps for this codelab, you can stop Firebase from serving them. Run the following command for each of your projects:
    firebase hosting:disable --project=<STAGING_PROJECT_ID>
    
    firebase hosting:disable --project=<PRODUCTION_PROJECT_ID>
    

13. Congratulations!

You've used Terraform to configure a real-time chat web application! And you've followed best practices for development environments by creating separate Firebase projects for staging and prod.

What we've covered

  • Using the Terraform CLI to manage cloud resources
  • Using Terraform to configure Firebase products (Authentication, Firestore, Cloud Storage, and Security Rules)
  • Running and testing a web app locally using the Firebase Local Emulator Suite
  • Importing Firebase into a web app
  • Using Terraform to replicate a configuration across multiple environments

For more information about Firebase and Terraform, visit our documentation . You can find a list of all Firebase products with Terraform support, sample Terraform configurations for common use cases, and helpful troubleshooting and FAQ.