1st gen Node.js ফাংশন থেকে 2nd gen-এ আপগ্রেড করা

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

এই ডকুমেন্টে দেওয়া উদাহরণে ধরে নেওয়া হয়েছে যে আপনি CommonJS মডিউল (require স্টাইল ইমপোর্ট) সহ JavaScript ব্যবহার করছেন, কিন্তু একই নীতি ESM (import … from স্টাইল ইমপোর্ট) ও TypeScript সহ JavaScript-এর ক্ষেত্রেও প্রযোজ্য।

মাইগ্রেশন প্রসেস

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

আমরা সাজেস্ট করি যে একবারে একটি ফাংশন মাইগ্রেট করুন এবং এগিয়ে যাওয়ার আগে পরীক্ষা ও যাচাইকরণ করুন।

Firebase CLI ও firebase-functions ভার্সন যাচাই করুন

আপনি কমপক্ষে Firebase CLI ভার্সন 12.00 এবং firebase-functions ভার্সন 4.3.0 ব্যবহার করছেন কিনা তা নিশ্চিত করুন। যেকোনও নতুন ভার্সন ২য় জেনারেশন ও ১ম জেনারেশন, দু'টির সাথেই কাজ করবে।

ইমপোর্ট আপডেট করা

firebase-functionsSDK-এর মধ্যে থাকা v2 সাবপ্যাকেজ থেকে ২য় জেনারেশনের ফাংশন ইমপোর্ট করা হয়। এই আলাদা ইমপোর্ট পাথ হল সেইসব Firebase CLI যা নির্ধারণ করতে হবে আপনার ফাংশন কোডকে ১ম বা ২য় জেনারেশন ফাংশন হিসেবে ডেপ্লয় করা হবে কিনা।

v2 সাবপ্যাকেজটি মডুলার এবং আপনার প্রয়োজন অনুযায়ী নির্দিষ্ট মডিউল ইমপোর্ট করার জন্য আমরা সাজেস্ট করি।

আগে: ফার্স্ট জেনারেশন

const functions = require("firebase-functions/v1");

পরে: 2nd gen

// explicitly import each trigger
const {onRequest} = require("firebase-functions/v2/https");
const {onDocumentCreated} = require("firebase-functions/v2/firestore");

ট্রিগারের সংজ্ঞা আপডেট করা

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

কিছু ট্রিগারের জন্য কলব্যাকে পাস করা আর্গুমেন্ট পরিবর্তন করা হয়েছে। এই উদাহরণে, মনে রাখবেন যে onDocumentCreated কলব্যাকের আর্গুমেন্টগুলিকে একটি event অবজেক্টে কনসোলিডেট করা হয়েছে। এছাড়াও, কিছু ট্রিগারে সুবিধাজনক নতুন কনফিগারেশন ফিচার আছে, যেমন onRequest ট্রিগারের cors বিকল্প।

আগে: ফার্স্ট জেনারেশন

const functions = require("firebase-functions/v1");

exports.date = functions.https.onRequest((req, res) => {
  // ...
});

exports.uppercase = functions.firestore
  .document("my-collection/{docId}")
  .onCreate((change, context) => {
    // ...
  });

পরে: 2nd gen

const {onRequest} = require("firebase-functions/v2/https");
const {onDocumentCreated} = require("firebase-functions/v2/firestore");

exports.date = onRequest({cors: true}, (req, res) => {
  // ...
});

exports.uppercase = onDocumentCreated("my-collection/{docId}", (event) => {
  /* ... */
});

JavaScript-এর ডেস্ট্রাকচারিংয়ের মাধ্যমে রিরাইট করার প্রচেষ্টা কমানো

আপনার ফাংশনের বডি যদি জটিল হয় এবং সেটি যদি 1st gen কনটেক্সট বা প্রোভাইডার-নির্দিষ্ট প্যারামিটারের (যেমন message বা snapshot) উপর খুব বেশি নির্ভরশীল হয়, তাহলে আপনি 2nd gen SDK-তে বিল্ট-ইন 1st gen কম্প্যাটিবিলিটি হেল্পার ব্যবহার করতে পারেন।

২য় জেনারেশন SDK অটোমেটিক ইভেন্ট অবজেক্টকে গেটার দিয়ে প্যাচ করে যা ১ম জেনারেশন সিগনেচারের সাথে ম্যাচ করে। এর ফলে, হ্যান্ডলার সিগনেচারে সরাসরি এইসব প্রপার্টি এক্সট্র্যাক্ট করতে জাভাস্ক্রিপ্ট ডিস্ট্রাকচারিং ব্যবহার করতে পারবেন, এর ফলে আপনার ফাংশন লজিক আবার লেখার প্রয়োজন হবে না।

প্রদানকারী ম্যাপিং রেফারেন্স

প্রোভাইডার 1st gen আর্গুমেন্ট 2nd gen প্যাচ করা ইভেন্ট ডিস্ট্রাকচারিং
Pub/Sub (message, context) ({ message, context }) => { ... }
Cloud Firestore (snapshot, context) ({ snapshot, context }) => { ... }
Cloud Storage (object, context) ({ object, context }) => { ... }
Realtime Database (snapshot, context) ({ snapshot, context }) => { ... }
Remote Config (version, context) ({ version, context }) => { ... }
Cloud Scheduler (context) ({ context }) => { ... }
টাস্কের সারি (data, context) ({ data, context }) => { ... }

আগে (ফার্স্ট জেনারেশন):

export const myPubSubV1 = functions.pubsub.topic("my-topic").onPublish((message, context) => {
  const data = message.json;
  const eventId = context.eventId;
  // ... rest of the logic
});

নতুন বিকল্প (ডিস্ট্রাকচারিং সহ ২য় জেনারেশন):

import { onMessagePublished } from "firebase-functions/v2/pubsub";

export const myPubSubV2 = onMessagePublished("my-topic", ({ message, context }) => {
  // No need to change the function body!
  const data = message.json;      // Uses v1 Message wrapper
  const eventId = context.eventId; // Uses v1 EventContext map
  // ... rest of the logic
});

প্যারামিটারাইজড কনফিগারেশন ব্যবহার করা

আপনার কোডবেসের মধ্যে কনফিগারেশন প্যারামিটার ডিক্লেয়ার করার জন্য আরও সুরক্ষিত ইন্টারফেসের জন্য ২য় জেনারেশনের ফাংশন functions.config-এর সহায়তা বাদ দেয়। নতুন params মডিউল সহ, CLI ডিপ্লয়মেন্ট ব্লক করে দেয় যতক্ষণ না সব প্যারামিটারের ভ্যালিড ভ্যালু থাকে, এটি নিশ্চিত করে যে কোনও ফাংশন যেন মিসিং কনফিগারেশন সহ ডিপ্লয় না করা হয়।

আগে: ফার্স্ট জেনারেশন

const functions = require("firebase-functions/v1");

exports.getQuote = functions.https.onRequest(async (req, res) => {
  const quote = await fetchMotivationalQuote(functions.config().apiKey);
  // ...
});

পরে: 2nd gen

const {onRequest} = require("firebase-functions/v2/https");
const {defineSecret} = require("firebase-functions/params");

// Define the secret parameter
const apiKey = defineSecret("API_KEY");

exports.getQuote = onRequest(
  // make the secret available to this function
  { secrets: [apiKey] },
  async (req, res) => {
    // retrieve the value of the secret
    const quote = await fetchMotivationalQuote(apiKey.value());
    // ...
  }
);

functions.config-এর সাথে আপনার আগে থেকে থাকা এনভায়রনমেন্ট কনফিগারেশন থাকলে, ২য় জেনারেশনে আপগ্রেড করার অংশ হিসেবে এই কনফিগারেশন মাইগ্রেট করুন।

functions.config API বন্ধ করে দেওয়া হয়েছে এবং মার্চ ২০২৭-এ এটি সরিয়ে দেওয়া হবে। ওই তারিখের পরে, functions.config সহ ডেপ্লয়মেন্ট কাজ করবে না।

ডিপ্লয়মেন্ট ব্যর্থতা আটকাতে, Firebase CLI ব্যবহার করে আপনার কনফিগারেশন Cloud Secret Manager-এ মাইগ্রেট করুন। এটি সাজেস্ট করা হয় কারণ আপনার কনফিগারেশন মাইগ্রেট করার সবচেয়ে সুরক্ষিত ও কার্যকর উপায় এটি।

  1. Firebase CLI-এর মাধ্যমে কনফিগারেশন এক্সপোর্ট করা

    Cloud Secret Manager-এ নতুন সিক্রেটে আপনার আগে থেকে থাকা এনভায়রনমেন্ট কনফিগারেশন এক্সপোর্ট করতে config export কমান্ড ব্যবহার করুন:

    $ firebase functions:config:export
    i  This command retrieves your Runtime Config values (accessed via functions.config())
       and exports them as a Secret Manager secret.
    
    i  Fetching your existing functions.config() from your project...  ✔
       Fetched your existing functions.config().
    
    i  Configuration to be exported:
    ⚠  This may contain sensitive data. Do not share this output.
    
    {
       ...
    }
    
    ✔ What would you like to name the new secret for your configuration? RUNTIME_CONFIG
    
    ✔  Created new secret version projects/project/secrets/RUNTIME_CONFIG/versions/1```
    
  2. সিক্রেট বাইন্ড করতে ফাংশন কোড আপডেট করা

    Cloud Secret Manager-এ নতুন সিক্রেটে সেভ করা কনফিগারেশন ব্যবহার করতে, আপনার ফাংশন সোর্সে defineJsonSecret API ব্যবহার করুন। এছাড়াও, যেসব ফাংশনে সিক্রেট প্রয়োজন সেগুলির সাথে সেগুলি বাউন্ড করা আছে কিনা তা নিশ্চিত করুন।

    আগে

    const functions = require("firebase-functions/v1");
    
    exports.myFunction = functions.https.onRequest((req, res) => {
      const apiKey = functions.config().someapi.key;
      // ...
    });
    

    পরে

    const { onRequest } = require("firebase-functions/v2/https");
    const { defineJsonSecret } = require("firebase-functions/params");
    
    const config = defineJsonSecret("RUNTIME_CONFIG");
    
    exports.myFunction = onRequest(
      // Bind secret to your function
      { secrets: [config] },
      (req, res) => {
        // Access secret values via .value()
        const apiKey = config.value().someapi.key;
        // ...
    });
    
  3. ফাংশন ডিপ্লয় করা

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

    firebase deploy --only functions:<your-function-name>
    

রানটাইম বিকল্প সেট করা

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

আগে: ফার্স্ট জেনারেশন

const functions = require("firebase-functions/v1");

exports.date = functions
  .runWith({
    // Keep 5 instances warm for this latency-critical function
    minInstances: 5,
  })
  // locate function closest to users
  .region("asia-northeast1")
  .https.onRequest((req, res) => {
    // ...
  });

exports.uppercase = functions
  // locate function closest to users and database
  .region("asia-northeast1")
  .firestore.document("my-collection/{docId}")
  .onCreate((change, context) => {
    // ...
  });

পরে: 2nd gen

const {onRequest} = require("firebase-functions/v2/https");
const {onDocumentCreated} = require("firebase-functions/v2/firestore");
const {setGlobalOptions} = require("firebase-functions/v2");

// locate all functions closest to users
setGlobalOptions({ region: "asia-northeast1" });

exports.date = onRequest({
    // Keep 5 instances warm for this latency-critical function
    minInstances: 5,
  }, (req, res) => {
  // ...
});

exports.uppercase = onDocumentCreated("my-collection/{docId}", (event) => {
  /* ... */
});

ডিফল্ট পরিষেবা অ্যাকাউন্ট আপডেট করা (ঐচ্ছিক)

১ম জেনারেশন ফাংশন Firebase API-তে অ্যাক্সেস অনুমোদন করার জন্য Google App Engine ডিফল্ট সার্ভিস অ্যাকাউন্ট ব্যবহার করে, অন্যদিকে ২য় জেনারেশন ফাংশন Compute Engine ডিফল্ট সার্ভিস অ্যাকাউন্ট ব্যবহার করে। এই পার্থক্যের ফলে, যেসব ফাংশন ২য় জেনারেশনে মাইগ্রেট করা হয়েছে সেগুলির ক্ষেত্রে অনুমতি সংক্রান্ত সমস্যা হতে পারে, যদি আপনি ১ম জেনারেশনের পরিষেবা অ্যাকাউন্টে বিশেষ অনুমতি দিয়ে থাকেন। আপনি কোনও পরিষেবা অ্যাকাউন্টের অনুমতি পরিবর্তন না করে থাকলে, এই ধাপটি এড়িয়ে যেতে পারেন।

সাজেস্ট করা সমাধান হল, আপনি যে ফাংশনগুলি ২য় জেনারেশনে মাইগ্রেট করতে চান সেগুলিতে আগে থেকেই থাকা ১ম জেনারেশনের App Engine ডিফল্ট পরিষেবা অ্যাকাউন্ট স্পষ্টভাবে অ্যাসাইন করুন, এর ফলে ২য় জেনারেশনের ডিফল্ট ওভাররাইড হয়ে যাবে। আপনি এটি নিশ্চিত করতে পারেন যে প্রতিটি মাইগ্রেট করা ফাংশন serviceAccountEmail-এর জন্য সঠিক ভ্যালু সেট করে:

const {onRequest} = require("firebase-functions/https");
const {onDocumentCreated} = require("firebase-functions/v2/firestore");
const {setGlobalOptions} = require("firebase-functions");

// Use the App Engine default service account for all functions
setGlobalOptions({serviceAccountEmail: '<my-project-number>@<wbr>appspot.gserviceaccount.com'});

// Now I use the App Engine default service account.
exports.date = onRequest({cors: true}, (req, res) => {
  // ...
});

// I do too!
exports.uppercase = onDocumentCreated("my-collection/{docId}", (event) => {
  // ...
});

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

কনকারেন্সি ব্যবহার করা

২য় জেনারেশনের ফাংশনের একটি গুরুত্বপূর্ণ সুবিধা হল, একটি ফাংশন ইনস্ট্যান্স একই সাথে একাধিক অনুরোধ পূরণ করতে পারে। এর ফলে ব্যবহারকারীদের কোল্ড স্টার্টের সংখ্যা উল্লেখযোগ্যভাবে কমে যেতে পারে। সাধারণত, কনকারেন্সি ৮০-তে সেট করা থাকে, তবে আপনি এটিকে ১ থেকে ১০০০-এর মধ্যে যেকোনও ভ্যালুতে সেট করতে পারেন:

const {onRequest} = require("firebase-functions/v2/https");

exports.date = onRequest({
    // set concurrency value
    concurrency: 500
  },
  (req, res) => {
    // ...
});

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

গ্লোবাল ভেরিয়েবল ব্যবহার অডিট করা

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

আপগ্রেড করার সময়, আপনি ফাংশনের CPU gcf_gen1 হিসেবে সেট করতে এবং concurrency-এর মান ১ হিসেবে সেট করে ১ম জেনারেশনের আচরণ ফিরিয়ে আনতে পারবেন:

const {onRequest} = require("firebase-functions/v2/https");

exports.date = onRequest({
    // TEMPORARY FIX: remove concurrency
    cpu: "gcf_gen1",
    concurrency: 1
  },
  (req, res) => {
    // ...
});

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

নতুন ২য় জেনারেশন ফাংশনে ট্রাফিক মাইগ্রেট করা

ঠিক যেমন ফাংশনের অঞ্চল বা ট্রিগার ধরন পরিবর্তন করার সময়, আপনাকে ২য় জেনারেশন ফাংশনকে একটি নতুন নাম দিতে হবে এবং ধীরে ধীরে সেটিতে ট্রাফিক মাইগ্রেট করতে হবে।

একই নামে ফাংশনকে ১ম থেকে ২য় জেনারেশনে আপগ্রেড করা এবং firebase deploy চালানো সম্ভব নয়। এটি করলে এই সমস্যাটি হবে:

Upgrading from GCFv1 to GCFv2 is not yet supported. Please delete your old function or wait for this feature to be ready.

আপনার ফাংশন যে ধরনের ট্রিগার ব্যবহার করে তার উপর মাইগ্রেশন স্ট্র্যাটেজি নির্ভর করে।

Callable, টাস্ক কিউ ও HTTP ট্রিগার মাইগ্রেট করা

এইসব ট্রিগার হল সরাসরি ইনভোকেশন। কারণ ২য় জেনারেশনের ফাংশনের একটি নতুন নাম (এবং HTTP ট্রিগারের জন্য একটি নতুন URL) থাকবে, আপনি ক্লায়েন্টদের আপডেট করার মাধ্যমে ট্রাফিক মাইগ্রেট করতে পারবেন।

  1. আপনার কোডে ফাংশনের নাম পরিবর্তন করুন (যেমন, myCallable-এর নাম পরিবর্তন করে myCallableV2 করুন)।
  2. ফাংশন ডেপ্লয় করুন। ১ম ও ২য় জেনারেশনের ফাংশন এখন চলছে।
  3. নতুন ২য় জেনারেশন ফাংশনের নাম বা URL-এর দিকে পয়েন্ট করার জন্য আপনার ক্লায়েন্ট কোড বা কলার আপডেট করুন।
  4. সব ট্রাফিক নতুন ফাংশনে শিফট করা হয়ে গেলে, Firebase CLI-এর firebase functions:delete কমান্ড ব্যবহার করে 1st gen ফাংশন মুছে দিন।

ব্যাকগ্রাউন্ড ট্রিগার মাইগ্রেট করা

ব্যাকগ্রাউন্ড ট্রিগার (যেমন Pub/Sub, Cloud Firestore এবং Cloud Storage ট্রিগার) আপনার প্রোজেক্টের ইভেন্টে প্রতিক্রিয়া জানায়। ট্রানজিশন চলাকালীন কোনও ইভেন্ট যাতে মিস না হয়ে যায়, তার জন্য আপনাকে অবশ্যই সাময়িকভাবে 1st gen ও 2nd gen ফাংশন পাশাপাশি চালাতে হবে।

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

  1. ১ম জেনারেশন ফাংশনের পাশাপাশি ২য় জেনারেশন ফাংশন যোগ করুন, আপনার কোডে আগে থেকে থাকা ১ম জেনারেশন ফাংশন রেখে দিন এবং একই ইভেন্ট সোর্স শুনতে থাকা ২য় জেনারেশন ফাংশন যোগ করুন।

    import * as functions from "firebase-functions/v1";
    import { onMessagePublished } from "firebase-functions/v2/pubsub";
    
    // --- Existing 1st gen function ---
    export const myPubSub = functions.pubsub.topic("my-topic").onPublish((message, context) => {
      console.log("V1 handler running for event:", context.eventId);
      // ... existing v1 function logic ...
    });
    
    // --- New v2 passthrough function ---
    export const myPubSubV2 = onMessagePublished("my-topic", async ({ message, context }) => {
      console.log("v2 handler triggering V1 for event:", context.eventId);
      // Call the v1 function's handler
      await myPubSub.run(message, context);
    });
    
  2. রান firebase deploy দুটি ফাংশনই এখন চালু আছে এবং একই ইভেন্ট শুনছে।

  3. ২য় জেনারেশন ফাংশন ট্রাফিক পাচ্ছে কিনা তা যাচাই করুন। দুটি ফাংশনের জন্যই লগ মনিটর করুন। নিশ্চিত করুন যে সব ইভেন্টের জন্য ২য় জেনারেশন ফাংশনটি চালু করা হয়েছে এবং কল সফল হচ্ছে।

  4. ফাংশনটি সঠিকভাবে পারফর্ম করছে বলে আপনি নিশ্চিত হলে, 1ম জেনারেশন ফাংশন থেকে আসল বিজনেস লজিক সরিয়ে 2য় জেনারেশন ফাংশনের বডিতে রাখুন। আপনি পাসথ্রু পদ্ধতি ব্যবহার করে থাকলে, myPubSub.run()-এ কল করার প্রয়োজন নেই।

    import * as functions from "firebase-functions/v1";
    import { onMessagePublished } from "firebase-functions/v2/pubsub";
    
    // --- Existing v1 function (to be removed next) ---
    export const myPubSub = functions.pubsub.topic("my-topic").onPublish((message, context) => {
      console.log("v1 handler running for event:", context.eventId);
      // ... existing v1 function logic ...
    });
    
    // --- New v2 function with full logic ---
    export const myPubSubV2 = onMessagePublished("my-topic", ({ message, context }) => {
      console.log("v2 handler running for event:", context.eventId);
      // ... existing v1 function logic WAS MOVED HERE ...
    });
    

    এই পরিবর্তন প্রয়োগ করুন।

  5. আপনার কোড থেকে ১ম জেনারেশনের ফাংশন ডেফিনিশন সরিয়ে দিন এবং আবার ডেপ্লয় করুন। CLI আপনাকে Google Cloud থেকে 1st gen ফাংশন মুছে দেওয়ার জন্য প্রম্পট করবে।