Firebase এক্সটেনশনকে নিজে তৈরি করা ফাংশন কিটে মাইগ্রেট করা

মাইগ্রেশন পাথ বেছে নিন: npm-এ ফাংশন কিটে মাইগ্রেট করুন নিজস্ব তৈরি করা ফাংশন কিটে মাইগ্রেট করুন

কোনও প্রকাশক npm-এ ডিস্ট্রিবিউট করা অফিসিয়াল রিপ্লেসমেন্ট কিট তৈরি না করলে, এই নির্দেশিকা আপনাকে তাদের এক্সটেনশন ফর্ক করার এবং এটি একটি লোকাল ফাংশন কিট হিসেবে সেট-আপ করার ধাপগুলি দেখায়।

মাইগ্রেশন সংক্রান্ত পরিচিত সীমাবদ্ধতা চেক করা

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

  • কাস্টম Docker রিপোজিটরি এবং KMS কী-এর জন্য ম্যানুয়াল সমাধান প্রয়োজন Cloud Functions for Firebase কাস্টম Docker রিপোজিটরি বা গ্রাহক-পরিচালিত এনক্রিপশন কী (KMS কী) কনফিগার করার জন্য রিপ্লেসমেন্ট সিস্টেম প্যারামিটার সমর্থন করে না। আপনার এক্সটেনশন যদি এই প্যারামিটারগুলির মধ্যে কোনও একটি কনফিগার করে, তাহলে FAQ সমাধান দেখুন।

শুরু করার আগে

আপনাকে Firebase CLI সেট-আপ করতে এবং Firebase প্রোজেক্ট ইনিশিয়ালাইজ করতে হবে। CLI ব্যবহার করার সময়, আপনি firebase-tools ভার্সন >= 15.32.0 ব্যবহার করছেন কিনা তা ভাল করে দেখে নিন, যেটিতে নতুন মাইগ্রেশন ও ফাংশন কিট কমান্ড আছে।

প্রয়োজনীয় অ্যাকাউন্ট সংক্রান্ত অনুমতি ও ভূমিকা

মাইগ্রেশনের সময় Firebase CLI-এর মাধ্যমে কী তৈরি ও কনফিগার করতে হবে তার উপর নির্ভর করে, Firebase ও Google Cloud-এর মাধ্যমে যাচাই করার জন্য আপনি যে অ্যাকাউন্ট ব্যবহার করছেন, সেটিতে নিম্নলিখিত ভূমিকা থাকতে হবে:

  • roles/firebaseextensions.editor
  • roles/cloudbuild.builds.editor
  • roles/artifactregistry.writer
  • roles/run.developer
  • roles/iam.serviceAccountUser
  • roles/iam.serviceAccountCreator
  • roles/cloudfunctions.admin (সর্বজনীন এন্ডপয়েন্টের জন্য আপনাকে setIamPermissions করতে হলে)
  • roles/secretmanager.admin (গোপন তথ্য ব্যবহার করলে)
  • roles/serviceusage.serviceUsageAdmin (আপনাকে নতুন API চালু করতে হলে)

আমরা এমন একটি অ্যাকাউন্ট ব্যবহার করার সাজেশন দিই যা আগে এক্সটেনশন ইনস্টল করেছে এবং ফাংশন ডিপ্লয় করেছে, কারণ এই অনুমতিগুলির বেশিরভাগই আগে থেকেই মঞ্জুর করা থাকবে। আপনার মাইগ্রেট করা অ্যাকাউন্টে আরও ভূমিকা যোগ করতে হলে, Google Cloud IAM নির্দেশাবলী অনুসরণ করুন।

আপনার এক্সটেনশন ইনস্ট্যান্স লেটেস্ট ভার্সনে আপগ্রেড করুন

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

আপনার এক্সটেনশনটি কোথায় ইনস্টল করা হয়েছে তার উপর নির্ভর করে, সেটি আপডেট করতে নিম্নলিখিত বিকল্পগুলির মধ্যে একটি ব্যবহার করুন:

  • Firebase কনসোল থেকে
  • Firebase CLI থেকে এটি ব্যবহার করে:
    • firebase ext:update <extension-instance-id> --project <project-id> firebase deploy --only extensions --project <project-id>

আপনি এই ধাপটি এড়িয়ে গেলে, এক্সপোর্ট করার সময় CLI আপনাকে আপগ্রেড করার জন্য প্রম্পট করে কনফিগারেশন যদি আপনার এক্সটেনশন লেটেস্ট ভার্সনে না থাকে।

এক্সটেনশনটি একটি লোকাল ফাংশন কিটে ফর্ক করুন

কোনও এক্সটেনশনকে লোকাল ফাংশন কিটে কনভার্ট করা শুরু করার আগে, এক্সটেনশনের সোর্স কোড আপনার Firebase প্রোজেক্টের মধ্যে আছে কিনা তা নিশ্চিত করুন। এটি করতে, GitHub থেকে এক্সটেনশন রিপোজিটরি ক্লোন করুন, আপনার Firebase প্রোজেক্ট রুটের মধ্যে একটি ডিরেক্টরি তৈরি করুন এবং এক্সটেনশনের functions/ ফোল্ডার ও extension.yaml এতে কপি করুন:

mkdir -p path/to/kit
cp -r /path/to/extension-source/functions/* path/to/kit/
cp /path/to/extension-source/extension.yaml path/to/kit/.

আপনার এক্সটেনশন সোর্স কোড ২য় জেনারেশন ফাংশনে মাইগ্রেট করতে, প্রকাশক মাইগ্রেশন গাইড থেকে ১ থেকে ৮ পর্যন্ত ধাপগুলি অনুসরণ করুন। তারপর নিম্নলিখিত ধাপগুলি অনুসরণ করা চালিয়ে যান।

আপনার লোকাল কিটকে এক্সপোর্ট করা ফাংশন রিজিয়ন এবং উন্নত প্যারামিটার সাপোর্ট করার জন্য তৈরি করুন

লোকাল ফাংশন কিটে, Firebase CLI, প্যাকেজ সেট-আপ করতে এবং মাইগ্রেট করা সিস্টেম প্যারামিটার ব্যবহার করার জন্য এটি কনফিগার করতে, index.ts ফাইল তৈরি করে না। আপনার এক্সটেনশনের জন্য কনফিগার করা ফাংশন রিজিয়ন ও উন্নত প্যারামিটার ব্যবহার করতে, firebase ext:export --mode functions-এর মাধ্যমে এক্সপোর্ট করা ফর্ম্যাট এনভায়রনমেন্ট ভেরিয়েবেল ফাইলে পড়ার জন্য আপনার index.ts ফাইল সেট-আপ করুন।

বিশেষ করে, আপনার ফাংশন এক্সপোর্ট করে এমন টপ-লেভেল index.ts ফাইলে, FUNCTION_DEFAULT_REGION-এর জন্য একটি প্যারামিটার নির্ধারণ করুন এবং EXT_MIGRATED_SYSTEM_<GLOBAL_OPTION> ফর্মের এনভায়রনমেন্ট ভেরিয়েবেল সহ setGlobalOptions কল করুন, যা CLI-এর ব্যবহার করা index-kit-migration.ts টেমপ্লেটের মতো:

import { setGlobalOptions } from "firebase-functions";
import { MemoryOption, VpcEgressSetting, IngressSetting } from "firebase-functions/v2/options";
import { defineString } from "firebase-functions/params";

export const regionParam = defineString("FUNCTION_DEFAULT_REGION", {
  input: { text: { nonEmpty: true } },
  description: "Global default region where functions should be deployed. Can be overridden per-function.",
});

setGlobalOptions({
  region: regionParam,
  memory: (process.env.EXT_MIGRATED_SYSTEM_MEMORY as MemoryOption) ?? undefined,
  timeoutSeconds: process.env.EXT_MIGRATED_SYSTEM_TIMEOUTSECONDS
    ? Number(process.env.EXT_MIGRATED_SYSTEM_TIMEOUTSECONDS)
    : undefined,
  vpcConnectorEgressSettings:
    process.env.EXT_MIGRATED_SYSTEM_VPCCONNECTOREGRESSSETTINGS &&
    process.env.EXT_MIGRATED_SYSTEM_VPCCONNECTOREGRESSSETTINGS !== "VPC_CONNECTOR_EGRESS_SETTINGS_UNSPECIFIED"
      ? (process.env.EXT_MIGRATED_SYSTEM_VPCCONNECTOREGRESSSETTINGS as VpcEgressSetting)
      : undefined,
  vpcConnector: process.env.EXT_MIGRATED_SYSTEM_VPCCONNECTOR ?? undefined,
  maxInstances: process.env.EXT_MIGRATED_SYSTEM_MAXINSTANCES
    ? Number(process.env.EXT_MIGRATED_SYSTEM_MAXINSTANCES)
    : undefined,
  minInstances: process.env.EXT_MIGRATED_SYSTEM_MININSTANCES
    ? Number(process.env.EXT_MIGRATED_SYSTEM_MININSTANCES)
    : undefined,
  ingressSettings: (process.env.EXT_MIGRATED_SYSTEM_INGRESSSETTINGS as IngressSetting) ?? undefined,
  // Parses a comma-separated string of key:value pairs into a key-value object
  // (for example, "key1:value1,key2:value2" -> { key1: "value1", key2: "value2" }).
  labels: process.env.EXT_MIGRATED_SYSTEM_LABELS
    ? process.env.EXT_MIGRATED_SYSTEM_LABELS.split(",").reduce<Record<string, string> | undefined>(
        (acc, curr) => {
          const [key, value] = curr.split(":");
          const trimmedKey = key?.trim();
          const trimmedValue = value?.trim();
          if (!trimmedKey || !trimmedValue) {
            return acc;
          }
          acc = acc ?? {};
          acc[trimmedKey] = trimmedValue;
          return acc;
        },
        undefined,
      )
    : undefined,
});

// Re-export all functions so the Firebase CLI can deploy them
export * from "./your-functions";

মাইগ্রেশনের আগে আপনার কিট পরীক্ষা করুন

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

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

firebase functions:kits:install --directory <path-to-your-fork> --project <test-project-id>

এই কমান্ড আপনাকে কিট আইডি, ইনস্ট্যান্স আইডি এবং আপনার প্রথম টেস্ট ইনস্ট্যান্সের জন্য কনফিগারেশন বেছে নিতে সাহায্য করে। তারপর এটি আপনার ফর্ক করা ডিরেক্টরিকে পয়েন্ট করে এমন একটি লোকাল কিট রেজিস্টার করার জন্য আপনার firebase.json ফাইলকে পরিবর্তন করে, যার প্রতিটি ইনস্ট্যান্সের কনফিগারেশন function-kits/<kit-id>/config-<instance-id>-এ .env ফাইলে স্টোর করা থাকে।

আপনার লোকাল কিটকে একটি টেস্ট প্রোজেক্টে ডিপ্লয় করুন, যেখানে উপযুক্ত রিসোর্স থাকবে যাতে এর আচরণ টেস্ট করা যায়। আপনার এক্সটেনশন টেস্ট করার জন্য আগে থেকেই টেস্ট প্রোজেক্ট সেট-আপ করা থাকলে, নিম্নলিখিত কমান্ড রান করুন:

firebase deploy --only functions:<kit-instance-id> --project <test-project-id>

উদাহরণ: Cloud Firestore থেকে BigQuery পর্যন্ত স্ট্রিম করুন (firestore-bigquery-export)

Cloud Firestore থেকে BigQuery সিঙ্ক এন্ড-টু-এন্ড যাচাই করুন:

  1. Firebase কনসোলের Cloud Firestore পৃষ্ঠায়, আপনি COLLECTION_PATH (users) হিসেবে সেট করা কালেকশন তৈরি করুন, যদি এটি আগে থেকে না থাকে।
  2. bigquery-mirror-test নামে একটি ডকুমেন্ট তৈরি করুন যাতে যেকোনও ভ্যালু সহ যেকোনও ফিল্ড থাকে।
  3. Google Cloud কনসোলের BigQuery পৃষ্ঠায়, র' চেঞ্জলগ টেবিল কোয়েরি করুন। এতে ডকুমেন্ট তৈরির লগ সহ একটি মাত্র সারি থাকতে হবে:

    SELECT * FROM `PROJECT_ID.analytics.users_raw_changelog`
    
  4. লেটেস্ট ভিউ কোয়েরি করুন, যা একমাত্র উপলভ্য ডকুমেন্টের (bigquery-mirror-test) জন্য লেটেস্ট পরিবর্তন ইভেন্ট রিটার্ন করবে:

    SELECT * FROM `PROJECT_ID.analytics.users_raw_latest`
    
  5. Cloud Firestore-এ bigquery-mirror-test ডকুমেন্ট মুছে দাও। এটি লেটেস্ট ভিউ থেকে মুছে যায় এবং র' চেঞ্জলগ টেবিলে একটি DELETE ইভেন্ট যোগ করা হয়।

    আপনি একটি ডকুমেন্টের সম্পূর্ণ ইতিহাস এর মাধ্যমে দেখতে পারবেন:

    SELECT *
       FROM `PROJECT_ID.analytics.users_raw_changelog`
       WHERE document_name = "bigquery-mirror-test"
       ORDER BY timestamp ASC
    

এক্সটেনশন পরীক্ষা করার সময় পার্থক্য:

  • ট্রিগার kit-<kit-instance-id>-fsexportbigquery হিসেবে ডিপ্লয় হয়, ext-<instanceId>-fsexportbigquery হিসেবে নয়। Cloud Functions ড্যাশবোর্ড ও লগে সেই নাম খুঁজুন।
  • আপনার কোড Firebase Local Emulator Suite-এ স্ট্যান্ডার্ড ফাংশন হিসেবে রান করে। আপনি .env.local-এর মাধ্যমে এমুলেটরে ব্যবহার করার জন্য প্যারামিটারের মান সেট করতে পারবেন। এছাড়াও, আপনি firebase-functions-test SDK ব্যবহার করে আপনার কোড ইউনিট টেস্ট করতে পারবেন, যেমনটি Cloud Functions-এর ইউনিট টেস্টিং-এ বর্ণনা করা হয়েছে।
  • প্রভিশনিং আর এক্সটেনশন রানটাইম দ্বারা পরিচালিত হয় না। ডেপ্লয় করার পরে চেঞ্জলগ টেবিল না থাকলে, সেট-আপ টাস্ক ম্যানুয়ালি আবার চালান: firebase functions:lifecycle:run afterFirstDeploy <kit-instance-id>. টাস্কটি আইডেমপোটেন্ট, তাই এটি আবার রান করলে ডেটাসেট, টেবিল ও ভিউ রিকনসাইল করে।
  • প্যারাম ভ্যালু ইনস্টলেশন ফর্মের পরিবর্তে .env থেকে আসে, তাই .env সম্পূর্ণ হয়ে গেলে firebase deploy-এর রি-রান নন-ইন্টার‍্যাক্টিভ হয়।

(ঐচ্ছিক) টেস্টিং থেকে ক্লিন-আপ করা

টেস্ট করার পরে আপনি এই টেস্ট ইন্সট্যান্স সরাতে চাইলে, এটি আনইনস্টল করুন:

firebase functions:kits:uninstall --instance <kit-instance-id> --project <test-project-id>

এটি কিট ডিপ্লয় করার মাধ্যমে তৈরি করা সব ক্লাউড রিসোর্স মুছে দেয় এবং এর ইনস্ট্যান্স কনফিগারেশন সরিয়ে দেয়। আপনার কাছে কিটের একটি মাত্র ইনস্ট্যান্স থাকলে, এটি firebase.json থেকে কিট এন্ট্রিও সরিয়ে দেয়। এটি আপনার লোকাল সোর্স কোড ডিরেক্টরি মুছে দেয় না। প্রোডাকশন মাইগ্রেশনের জন্য কিট ইনস্টল করার সময়, আপনি আবার একটি কিট আইডি বেছে নিতে পারবেন।

এক্সটেনশন থেকে আপনার লোকাল কিটে মাইগ্রেট করুন

আপনার লোকাল কিট টেস্ট করা হয়ে গেছে, এখন আপনি লাইভ ডিপ্লয় করা এক্সটেনশন ইনস্ট্যান্স মাইগ্রেট করতে পারবেন।

১. রিপ্লেসমেন্ট ফাংশন কিট ইনস্ট্যান্স ইনস্টল করুন

আপনার লোকাল ফাংশন কিট ইনস্টল করুন, ম্যানুয়াল কনফিগারেশন এড়িয়ে যেতে --no-configure পাস করুন যাতে পরবর্তী ধাপ আপনার বর্তমান এক্সটেনশন কনফিগারেশন সরাসরি এই কিট ইনস্ট্যান্সে এক্সপোর্ট করতে পারে:

firebase functions:kits:install --no-configure --directory <path-to-your-fork> --project <project-id>

২. এক্সটেনশনের মতো একইভাবে ফাংশন কিট ইনস্ট্যান্স কনফিগার করুন

আপনাকে এই কিট ইনস্ট্যান্স কাস্টমাইজ করতে হবে, যার কনফিগারেশনটি এক্সটেনশনের সাথে অভিন্ন হবে। আপনি নিজের এক্সটেনশন ইনস্ট্যান্স কনফিগারেশন একটি .env ফাইলে এক্সপোর্ট করতে পারবেন, যা কিট সহ সব Cloud Functions-এর জন্য প্যারামিটার, এনভায়রনমেন্ট ভেরিয়েবল এবং সিক্রেট রেফারেন্স কনফিগারেশন ডেটা স্টোর করে। আপনার কিটের কনফিগারেশন ফাইলে সরাসরি এটি এক্সপোর্ট করতে, রান করুন:

firebase ext:export --mode functions --instance <extension-instance-id> --kit-instance <kit-instance-id> --project <project-id>

এই ধাপের শেষে, এই ইনস্ট্যান্সের কনফিগারেশন সংক্রান্ত তথ্য আপনার ইনস্ট্যান্স কনফিগারেশন ডিরেক্টরিতে প্রোজেক্ট-নির্দিষ্ট .env ফাইলে সেভ করা হয়, যেমন: function-kits/<kit-name>/config-<instance-id>/.env.<project-id>

৩. কিট রিপ্লেসমেন্ট ডিপ্লয় ও যাচাই করুন

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

আপনি যে এক্সটেনশন ইনস্ট্যান্স থেকে মাইগ্রেট করেছেন সেখানে উপস্থিত ছিল না এমন কোনও নতুন প্যারামিটার আপনার কিট ব্যবহার করলে, ডেপ্লয়মেন্ট প্রসেসের শুরুতে Firebase CLI আপনাকে সেগুলির জন্য প্রম্পট করে। আপ-টু-ডেট firestore-bigquery-export এক্সটেনশন থেকে এই উদাহরণে এটি প্রত্যাশিত নয়, তবে অনেক কিট কিটের মাধ্যমে ব্যবহৃত যেকোনও ইভেন্ট ট্রিগার সোর্সের জন্য একটি নতুন প্যারামিটারের প্রম্পট দেখায়। এই মাইগ্রেশনের অংশ হিসেবে, আপডেট করা কিটগুলি ২য় জেনারেশন ফাংশন ব্যবহার করে যেখানে এক্সটেনশনগুলি আগে ১ম জেনারেশন ফাংশন ব্যবহার করত। ২য় জেনারেশনে, ফাংশনগুলি তাদের ইভেন্ট সোর্সের কাছাকাছি অবস্থিত এবং একটি অতিরিক্ত প্যারামিটার হিসাবে যোগ করা হয়েছে। ভবিষ্যতের আপডেটে, নতুন প্যারামিটার যোগ করা হলে, পরবর্তী ডেপ্লয়মেন্টে CLI আপনাকে প্রম্পট করবে।

উদাহরণ:

firebase deploy --only functions:firestore-bigquery-export --project my-project

আউটপুট:

=== Deploying to 'my-project'...
i  deploying functions
i  functions: Loaded environment variables from function-kits/firestore-bigquery-export/config-firestore-bigquery-export/.env.my-project
i  functions: ensuring required API bigquery.googleapis.com is enabled...
i  functions: ensuring required API cloudtasks.googleapis.com is enabled...
✔  functions: required APIs are enabled
i  functions: granting declarative IAM roles to managed service account:
   - BigQuery Data Editor
   - BigQuery User
   - Cloud Datastore User
   - Eventarc Event Receiver
   - roles/run.invoker
✔  functions: successfully granted IAM roles
i  functions: creating Node.js 22 (2nd Gen) function kit-firestore-bigquery-export-fsexportbigquery(us-central1)...
i  functions: creating Node.js 22 (2nd Gen) function kit-firestore-bigquery-export-initBigQuerySync(us-central1)...
i  functions: creating Node.js 22 (2nd Gen) function kit-firestore-bigquery-export-setupBigQuerySync(us-central1)...
✔  functions[kit-firestore-bigquery-export-fsexportbigquery(us-central1)] Successful create operation.
✔  functions[kit-firestore-bigquery-export-initBigQuerySync(us-central1)] Successful create operation.
✔  functions[kit-firestore-bigquery-export-setupBigQuerySync(us-central1)] Successful create operation.
i  functions: Executing afterFirstDeploy lifecycle hook targeting: kit-firestore-bigquery-export-initBigQuerySync...
✔  functions: Successfully queued task for lifecycle hook kit-firestore-bigquery-export-initBigQuerySync in queue projects/my-project/locations/us-central1/queues/kit-firestore-bigquery-export-initBigQuerySync.
✔  Deploy complete!

কিটের firebase deploy-এ কোনও সমস্যা ছিল না তা যাচাই করতে, কোনও লাইফসাইকেল হুক ট্রিগার করা হয়েছে কিনা তা দেখতে ডিপ্লয়মেন্ট লগ চেক করুন। Stream Cloud Firestore থেকে BigQuery-এর মতো জনপ্রিয় এক্সটেনশন, লাইফসাইকেল হুক ব্যবহার করে। ট্রিগার করা হলে লাইফসাইকেল হুক কেমন দেখায় তার একটি উদাহরণ নিচে দেওয়া হল:

i  functions: Executing afterFirstDeploy lifecycle hook targeting: kit-firestore-bigquery-export-initBigQuerySync...
✔  functions: Successfully queued task for lifecycle hook kit-firestore-bigquery-export-initBigQuerySync in queue projects/my-project/locations/europe-west1/queues/kit-firestore-bigquery-export-initBigQuerySync.
i  functions: View logs for afterFirstDeploy at: https://console.cloud.google.com/logs/query;query=resource.type%3D%22cloud_run_revision%22%0Aresource.labels.service_name%3D%22kit-firestore-bigquery-export--initbigquerysync%22%0Aresource.labels.location%3D%22europe-west1%22;project=my-project

এই লগ মেসেজগুলি নিম্নলিখিত বিষয়গুলি কনফার্ম করে:

  • একটি লাইফসাইকেল হুক পাওয়া গেছে এবং তা এক্সিকিউট করা হয়েছে।
  • লাইফসাইকেল হুকের সাথে যুক্ত টাস্কের সারিতে একটি টাস্ক সারিবদ্ধ করা হয়েছে।
  • Cloud Logging-এর একটি লিঙ্ক দেওয়া হয়েছে যাতে আপনি যাচাই করতে পারেন যে টাস্কটি কোনও সমস্যা ছাড়াই সম্পূর্ণ হয়েছে।

লগে কোনও সমস্যা নেই এবং আপনার টাস্ক কিউ ইভেন্ট সফলভাবে প্রসেস করা হয়েছে কিনা তা যাচাই করতে Google Cloud কনসোলে লগ লিঙ্ক ফলো করুন। লাইফসাইকেল ইভেন্ট সফলভাবে এক্সিকিউট না হলে, এটি রান করে আপনি আবার ট্রিগার করতে পারবেন:

firebase functions:lifecycle:run <hook-name> <codebase>

আপনি প্রথমবার ফাংশন কিট ইনস্ট্যান্স ডিপ্লয় করলে, রান করুন:

firebase functions:lifecycle:run afterFirstDeploy <kit-instance-id>

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

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

প্রসেসিং পরিবর্তন না হলে এবং এক্সটেনশন ও কিট থেকে ডুপ্লিকেট ফলাফল না পেলে, কিটের কার্যকারিতা ট্রিগার করার পরে কিটের লগ সরাসরি পরীক্ষা করা হল সবচেয়ে ভালো বিকল্প।

উদাহরণ: Cloud Firestore থেকে BigQuery-এ স্ট্রিম করুন

Stream Cloud Firestore থেকে BigQuery এক্সটেনশন ব্যবহার করে, Raw Changelog Table (*_raw_changelog) এবং লেটেস্ট ভিউ টেবিল (*_raw_latest) উভয় জায়গাতেই লেখার সময়, কিট ও এক্সটেনশনে একই ইভেন্ট ডেলিভার করা হলে, ডুপ্লিকেট এন্ট্রি সরিয়ে দেওয়া হবে। তাই, কিট কাজ করছে কিনা তা যাচাই করার জন্য আপনি BigQuery-তে কোনও সারি বা ডুপ্লিকেট সারির উপস্থিতি ব্যবহার করতে পারবেন না।

আপনি firebase functions:logs ব্যবহার করে আপনার Firestore সংগ্রহে লেখার কিছুক্ষণ পরেই ফাংশন লগ দেখতে পারেন এবং একটি লগ এন্ট্রি খুঁজতে পারেন যা নির্দেশ করে যে এটি সফলভাবে একটি লেখা প্রসেস করেছে। ডিফল্ট ইনস্ট্যান্স আইডি সহ এই কিটের জন্য firestore-bigquery-export-এর আইডি এইরকম দেখতে হবে:

2026-09-25T19:52:46.328612Z I kit-firestore-bigquery-export-fsexportbigquery: Started execution of extension
2026-09-25T19:52:46.328644Z I kit-firestore-bigquery-export-fsexportbigquery: {"message":"Firestore event received by onDocumentWritten trigger","document_name":"projects/extensions-eventarc-testing/databases/(default)/documents/exported-messages/cmGP6XLyksqGdw2OgTOq","operation":0,"event_id":"9f59a2a4-1a5e-4c41-a32d-561e3c734502"}
2026-09-25T19:52:46.616064Z I kit-firestore-bigquery-export-fsexportbigquery: Completed execution of extension
2026-09-2

আপনার কাছে অনেক লগ থাকলে, নিম্নলিখিত কমান্ড ব্যবহার করে আপনি নির্দিষ্ট কিট ফাংশনে ফিল্টার করতে পারেন:

firebase functions:log --only <function name>

কিট ইনস্ট্যান্সের জন্য নির্দিষ্ট ফাংশনের নাম খুঁজে পেতে, আপনি নিম্নলিখিত কমান্ড ব্যবহার করতে পারেন:

firebase functions:list | grep kit-<kit instance id>

এই উদাহরণের জন্য:

firebase functions:list | grep kit-firestore-bigquery-export
│ kit-firestore-bigquery-export-fsexportbigquery  │ v2      │ google.cloud.firestore.document.v1.written                    │
│ kit-firestore-bigquery-export-initBigQuerySync  │ v2      │ taskQueue                                                     │
│ kit-firestore-bigquery-export-setupBigQuerySync │ v2      │ taskQueue                                                     │
│ kit-firestore-bigquery-export-syncBigQuery      │ v2      │ taskQueue                                                     │

৪. এক্সটেনশন আনইনস্টল করুন

আপনার ডিপ্লয় করা ফাংশন কিট যাচাই করার পরে, আপনি এক্সটেনশন আনইনস্টল করতে পারেন, যাতে আপনি কিট এবং এক্সটেনশনের জন্য আলাদাভাবে এর আচরণ ডুপ্লিকেট না করেন। আপনি Firebase CLI থেকে সব এক্সটেনশন আনইনস্টল করতে পারবেন, আপনি সেগুলি কীভাবে ইনস্টল করেছেন তা নির্বিশেষে, যদি আপনি --immediate ফ্ল্যাগ পাস করেন:

firebase ext:uninstall <extension-instance-id> --project <project-id> --immediate

উদাহরণ:

firebase ext:uninstall firestore-bigquery-export --project my-project --immediate

আউটপুট:

i  extensions: uninstalling firestore-bigquery-export...
i  extensions: deleting extension instance resources in project my-project...
✔  extensions: successfully uninstalled firestore-bigquery-export

উন্নত মাইগ্রেশন

আপনি একাধিক Firebase প্রোজেক্টে এক্সটেনশন রাখতে পারেন যা আপনি একটি কোডবেস দিয়ে ম্যানেজ করতে চান। যেমন, আপনি যদি একই ইনফ্রাস্ট্রাকচার testing এনভায়রনমেন্ট এবং production এনভায়রনমেন্টে ডেপ্লয় করেন, যার প্রত্যেকটিতে documents Cloud Firestore ইনস্ট্যান্স আছে যা আপনি BigQuery-এ এক্সপোর্ট করেন, তাহলে আপনার কাছে firestore-bigquery-export এক্সটেনশনের দুটি ইনস্ট্যান্স ইনস্টল করা থাকতে পারে:

  • export-documents-testing
  • export-documents-production

Firebase CLI-এর সাথে কাজ করার সময় আপনি যদি একটি কোডবেসে দুটি ফাংশন কিট ইনস্ট্যান্সে এই দুটি এক্সটেনশন ইনস্ট্যান্স মাইগ্রেট করেন এবং firebase deploy --project testing ও firebase deploy --project production ব্যবহার করে ডিপ্লয় করেন, তাহলে প্রতিটি ডিপ্লয়মেন্ট testing এবং production এনভায়রনমেন্টে দুটি ইনস্ট্যান্স তৈরি করবে।

পরিবর্তে, দুটি এক্সটেনশন ইনস্ট্যান্সের জায়গায় একটি ফাংশন কিট ইনস্ট্যান্স ব্যবহার করুন firestore-bigquery-export একাধিক প্রোজেক্টে ডিপ্লয় করা হয়েছে, যেখানে প্রতিটি প্রোজেক্টের নিজস্ব কনফিগারেশন আছে। ইনস্ট্যান্সের জন্য আপনার কনফিগারেশন ডিরেক্টরি নিম্নলিখিতটির মতো দেখতে হতে হবে:

  • config-export-documents/
    • .env.testing
    • .env.production

testing এবং production-এ প্রতিটি ডেপ্লয়মেন্ট আপনার কিটের একটি ইনস্ট্যান্স তৈরি করে সংশ্লিষ্ট কনফিগারেশনের সাথে। আপনি ext:migrate বা functions:kits:install-এর প্রতিটি ইনভোকেশনে --project ফ্ল্যাগ পাস করলে, আগে থেকে থাকা CLI কমান্ড এই সেট-আপ তৈরি করে।

উদাহরণ:

firebase functions:kits:install --package @firebase-function-kits/firestore-bigquery-export --project testing --no-configure --template migration
✔ What would you like to name this kit? firestore-bigquery-export
✔ What would you like to name this instance? export-documents
✔  Wrote function-kits/firestore-bigquery-export/source/package.json
✔  Wrote function-kits/firestore-bigquery-export/source/tsconfig.json
✔  Wrote function-kits/firestore-bigquery-export/source/.gitignore
✔  Wrote function-kits/firestore-bigquery-export/source/src/index.ts
i  functions: Running npm install
✔  Wrote configuration info to firebase.json
✔  functions: Function kit firestore-bigquery-export successfully installed.
# This creates the export-documents instance with an empty .env.testing file
# for the testing project. Now populate it via export:
firebase ext:export --mode functions --instance export-documents-testing \
  --kit-instance export-documents --project testing

# Repeat the export for production into the same kit instance to create
# .env.production from the export-documents-prod instance:
firebase ext:export --mode functions --instance export-documents-prod \
  --kit-instance export-documents --project production

আপনার কাছে এখন একটি কিট ইনস্ট্যান্স কনফিগার করা আছে যা আপনার testing এবং production প্রোজেক্টে তাদের নিজ নিজ কনফিগারেশনের সাথে ডিপ্লয় করা যাবে। আপনি যদি testing প্রোজেক্টে একটি ইনস্ট্যান্স তৈরি করেন এবং production প্রোজেক্টে একই প্যাকেজের জন্য functions:kits:install কমান্ড রান করেন, তাহলে আপনাকে testing-এর জন্য কনফিগার করা ইনস্ট্যান্সটি আবার ব্যবহার করার অথবা দ্বিতীয় ইনস্ট্যান্স ইনস্টল করার বিকল্পের সাথে প্রম্পট করা হবে।