আপনার পরিবেশ কনফিগার করুন

প্রায়শই আপনার ফাংশনগুলির জন্য অতিরিক্ত কনফিগারেশনের প্রয়োজন হয়, যেমন তৃতীয় পক্ষের API কী বা টিউনেবল সেটিংস। Firebase SDK for Cloud Functions আপনার প্রকল্পের জন্য এই ধরণের ডেটা সংরক্ষণ এবং পুনরুদ্ধার করা সহজ করার জন্য অন্তর্নির্মিত পরিবেশ কনফিগারেশন অফার করে।

আপনি এই বিকল্পগুলির মধ্যে একটি বেছে নিতে পারেন:

  • প্যারামিটারাইজড কনফিগারেশন (বেশিরভাগ পরিস্থিতিতে প্রস্তাবিত)। এটি দৃঢ়ভাবে টাইপ করা পরিবেশ কনফিগারেশন প্রদান করে যা স্থাপনের সময় যাচাই করা প্যারামিটার সহ, যা ত্রুটি প্রতিরোধ করে এবং ডিবাগিংকে সহজ করে।
  • এনভায়রনমেন্ট ভেরিয়েবলের ফাইল-ভিত্তিক কনফিগারেশন। এই পদ্ধতির সাহায্যে, আপনি এনভায়রনমেন্ট ভেরিয়েবল লোড করার জন্য ম্যানুয়ালি একটি dotenv ফাইল তৈরি করতে পারেন।

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

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

Cloud Functions for Firebase আপনার কোডবেসের ভিতরে কনফিগারেশন প্যারামিটারগুলিকে ঘোষণামূলকভাবে সংজ্ঞায়িত করার জন্য একটি ইন্টারফেস প্রদান করে। এই প্যারামিটারগুলির মান ফাংশন স্থাপনের সময়, স্থাপন এবং রানটাইম বিকল্পগুলি সেট করার সময় এবং কার্যকর করার সময় উভয়ই উপলব্ধ। এর অর্থ হল যে সমস্ত প্যারামিটারের একটি বৈধ মান না থাকলে CLI স্থাপনকে ব্লক করবে।

নোড.জেএস

const { onRequest } = require('firebase-functions/v2/https');
const { defineInt, defineString } = require('firebase-functions/params');

// Define some parameters
const minInstancesConfig = defineInt('HELLO_WORLD_MININSTANCES');
const welcomeMessage = defineString('WELCOME_MESSAGE');

// To use configured parameters inside the config for a function, provide them
// directly. To use them at runtime, call .value() on them.
export const helloWorld = onRequest(
  { minInstances: minInstancesConfig },
(req, res) => {
    res.send(`${welcomeMessage.value()}! I am a function.`);
  }
);

পাইথন

from firebase_functions import https_fn
from firebase_functions.params import IntParam, StringParam

MIN_INSTANCES = IntParam("HELLO_WORLD_MIN_INSTANCES")
WELCOME_MESSAGE = StringParam("WELCOME_MESSAGE")

# To use configured parameters inside the config for a function, provide them
# directly. To use them at runtime, call .value() on them.
@https_fn.on_request(min_instances=MIN_INSTANCES)
def hello_world(req):
    return https_fn.Response(f'{WELCOME_MESSAGE.value()}! I am a function!')

প্যারামিটারাইজড কনফিগারেশন ভেরিয়েবল সহ একটি ফাংশন স্থাপন করার সময়, Firebase CLI প্রথমে স্থানীয় .env ফাইল থেকে তাদের মান লোড করার চেষ্টা করে। যদি সেগুলি সেই ফাইলগুলিতে উপস্থিত না থাকে এবং কোনও default সেট না থাকে, তাহলে CLI স্থাপনের সময় মানগুলির জন্য অনুরোধ করবে এবং তারপর স্বয়ংক্রিয়ভাবে আপনার functions/ ডিরেক্টরিতে .env.<project_ID> নামক একটি .env ফাইলে তাদের মানগুলি সংরক্ষণ করবে:

$ firebase deploy
i  functions: preparing codebase default for deployment
? Enter a string value for ENVIRONMENT: prod
i  functions: Writing new parameter values to disk: .env.projectId
…
$ firebase deploy
i  functions: Loaded environment variables from .env.projectId

আপনার ডেভেলপমেন্ট ওয়ার্কফ্লোর উপর নির্ভর করে, জেনারেট করা .env.<project_ID> ফাইলটি ভার্সন কন্ট্রোলে যোগ করা কার্যকর হতে পারে।

গ্লোবাল স্কোপে প্যারামিটার ব্যবহার করা

স্থাপনার সময়, আপনার প্যারামিটারের প্রকৃত মান পাওয়ার আগেই আপনার ফাংশন কোড লোড এবং পরিদর্শন করা হয়। এর অর্থ হল গ্লোবাল স্কোপের সময় প্যারামিটারের মান আনার ফলে স্থাপনা ব্যর্থ হয়। যেসব ক্ষেত্রে আপনি একটি প্যারামিটার ব্যবহার করে একটি গ্লোবাল মান শুরু করতে চান, সেক্ষেত্রে initialization callback onInit() ব্যবহার করুন। এই কলব্যাকটি প্রোডাকশনে চলমান যেকোনো ফাংশনের আগে চলে কিন্তু স্থাপনার সময় কল করা হয় না, তাই এটি একটি প্যারামিটারের মান অ্যাক্সেস করার জন্য একটি নিরাপদ জায়গা।

নোড.জেএস

const { GoogleGenerativeAI } = require('@google/generative-ai');
const { defineSecret } = require('firebase-functions/params');
const { onInit } = require('firebase-functions/v2/core');

const apiKey = defineSecret('GOOGLE_API_KEY');

let genAI;
onInit(() => {
  genAI = new GoogleGenerativeAI(apiKey.value());
})

পাইথন

from firebase_functions.core import init
from firebase_functions.params import StringParam, PROJECT_ID
import firebase_admin
import vertexai

location = StringParam("LOCATION")

x = "hello"

@init
def initialize():
  # Note: to write back to a global, you'll need to use the "global" keyword
  # to avoid creating a new local with the same name.
  global x
  x = "world"
  firebase_admin.initialize_app()
  vertexai.init(PROJECT_ID.value, location.value)

যদি আপনি Secret ধরণের প্যারামিটার ব্যবহার করেন, তাহলে মনে রাখবেন যে এগুলি শুধুমাত্র সেই ফাংশনগুলির প্রক্রিয়ায় উপলব্ধ যা গোপনকে আবদ্ধ করে। যদি কোনও গোপন শুধুমাত্র কিছু ফাংশনে আবদ্ধ থাকে, তাহলে এটি ব্যবহার করার আগে secret.value() মিথ্যা কিনা তা পরীক্ষা করে দেখুন।

CLI আচরণ কনফিগার করুন

প্যারামিটারগুলি একটি Options অবজেক্ট দিয়ে কনফিগার করা যেতে পারে যা CLI কীভাবে মানগুলির জন্য প্রম্পট করবে তা নিয়ন্ত্রণ করে। নিম্নলিখিত উদাহরণটি একটি ফোন নম্বরের ফর্ম্যাট যাচাই করার জন্য, একটি সহজ নির্বাচন বিকল্প প্রদান করার জন্য এবং Firebase প্রকল্প থেকে স্বয়ংক্রিয়ভাবে একটি নির্বাচন বিকল্প পূরণ করার জন্য বিকল্পগুলি সেট করে:

নোড.জেএস

const { defineString } = require('firebase-functions/params');

const welcomeMessage = defineString('WELCOME_MESSAGE', {default: 'Hello World',
description: 'The greeting that is returned to the caller of this function'});

const onlyPhoneNumbers = defineString('PHONE_NUMBER', {
  input: {
    text: {
      validationRegex: /\d{3}-\d{3}-\d{4}/,
      validationErrorMessage: "Please enter
a phone number in the format XXX-YYY-ZZZZ"
    },
  },
});

const selectedOption = defineString('PARITY', {input: params.select(["odd", "even"])});

const memory = defineInt("MEMORY", {
  description: "How much memory do you need?",
  input: params.select({ "micro": 256, "chonky": 2048 }),
});

const extensions = defineList("EXTENSIONS", {
  description: "Which file types should be processed?",
  input: params.multiSelect(["jpg", "tiff", "png", "webp"]),
});

const storageBucket = defineString('BUCKET', {
  description: "This will automatically
populate the selector field with the deploying Cloud Project’s
storage buckets",
  input: params.PICK_STORAGE_BUCKET,
});

পাইথন

from firebase_functions.params import (
    StringParam,
    ListParam,
    TextInput,
    SelectInput,
    SelectOptions,
    ResourceInput,
    ResourceType,
)

MIN_INSTANCES = IntParam("HELLO_WORLD_MIN_INSTANCES")

WELCOME_MESSAGE = StringParam(
    "WELCOME_MESSAGE",
    default="Hello World",
    description="The greeting that is returned to the caller of this function",
)

ONLY_PHONE_NUMBERS = StringParam(
    "PHONE_NUMBER",
    input=TextInput(
        validation_regex="\d{3}-\d{3}-\d{4}",
        validation_error_message="Please enter a phone number in the format XXX-YYY-XXX",
    ),
)

SELECT_OPTION = StringParam(
    "PARITY",
    input=SelectInput([SelectOptions(value="odd"), SelectOptions(value="even")]),
)

STORAGE_BUCKET = StringParam(
    "BUCKET",
    input=ResourceInput(type=ResourceType.STORAGE_BUCKET),
    description="This will automatically populate the selector field with the deploying Cloud Project's storage buckets",
)

প্যারামিটারের ধরণ

প্যারামিটারাইজড কনফিগারেশন প্যারামিটার মানগুলির জন্য শক্তিশালী টাইপিং প্রদান করে এবং ক্লাউড সিক্রেট ম্যানেজার থেকে গোপনীয়তা সমর্থন করে। সমর্থিত প্রকারগুলি হল:

  • গোপন
  • স্ট্রিং
  • বুলিয়ান
  • পূর্ণসংখ্যা
  • ভাসা
  • তালিকা (নোড.জেএস)

প্যারামিটার সংজ্ঞায়িত করার ফাংশন সম্পর্কে তথ্যের জন্য params নেমস্পেস রেফারেন্স দেখুন।

প্যারামিটার মান এবং রাশি

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

রানটাইম বিকল্প হিসেবে আপনার ফাংশনে একটি প্যারামিটার পাস করতে, এটি সরাসরি পাস করুন:

নোড.জেএস

const { onRequest } = require('firebase-functions/v2/https');
const { defineInt } = require('firebase-functions/params');
const minInstancesConfig = defineInt('HELLO\_WORLD\_MININSTANCES');

export const helloWorld = onRequest(
  { minInstances: minInstancesConfig },
  (req, res) => {
    //…

পাইথন

from firebase_functions import https_fn
from firebase_functions.params import IntParam

MIN_INSTANCES = IntParam("HELLO_WORLD_MIN_INSTANCES")

@https_fn.on_request(min_instances=MIN_INSTANCES)
def hello_world(req):
    ...

অতিরিক্তভাবে, কোন বিকল্পটি বেছে নেবেন তা জানার জন্য যদি আপনাকে কোনও প্যারামিটারের সাথে তুলনা করতে হয়, তাহলে মান পরীক্ষা করার পরিবর্তে আপনাকে বিল্ট-ইন তুলনাকারী ব্যবহার করতে হবে:

নোড.জেএস

const { onRequest } = require('firebase-functions/v2/https');
const environment = params.defineString(ENVIRONMENT, {default: 'dev'});

// use built-in comparators
const minInstancesConfig = environment.equals('PRODUCTION').thenElse(10, 1);
export const helloWorld = onRequest(
  { minInstances: minInstancesConfig },
  (req, res) => {
    //…

পাইথন

from firebase_functions import https_fn
from firebase_functions.params import IntParam, StringParam

ENVIRONMENT = StringParam("ENVIRONMENT", default="dev")
MIN_INSTANCES = ENVIRONMENT.equals("PRODUCTION").then(10, 0)

@https_fn.on_request(min_instances=MIN_INSTANCES)
def hello_world(req):
    ...

শুধুমাত্র রানটাইমে ব্যবহৃত প্যারামিটার এবং প্যারামিটার এক্সপ্রেশনগুলি তাদের value ফাংশন দিয়ে অ্যাক্সেস করা যেতে পারে:

নোড.জেএস

const { onRequest } = require('firebase-functions/v2/https');
const { defineString } = require('firebase-functions/params');
const welcomeMessage = defineString('WELCOME_MESSAGE');

// To use configured parameters inside the config for a function, provide them
// directly. To use them at runtime, call .value() on them.
export const helloWorld = onRequest(
(req, res) => {
    res.send(`${welcomeMessage.value()}! I am a function.`);
  }
);

পাইথন

from firebase_functions import https_fn
from firebase_functions.params import StringParam

WELCOME_MESSAGE = StringParam("WELCOME_MESSAGE")

@https_fn.on_request()
def hello_world(req):
    return https_fn.Response(f'{WELCOME_MESSAGE.value()}! I am a function!')

অন্তর্নির্মিত পরামিতি

ক্লাউড ফাংশন SDK তিনটি পূর্ব-নির্ধারিত প্যারামিটার অফার করে, firebase-functions/params সাবপ্যাকেজ থেকে পাওয়া যায়:

নোড.জেএস

  • projectID — ক্লাউড প্রকল্প যেখানে ফাংশনটি চলছে।
  • databaseURL — ফাংশনের সাথে সম্পর্কিত রিয়েলটাইম ডাটাবেস ইনস্ট্যান্সের ইউআরএল (যদি ফায়ারবেস প্রকল্পে সক্ষম করা থাকে)।
  • storageBucket — ফাংশনের সাথে যুক্ত ক্লাউড স্টোরেজ বাকেট (যদি Firebase প্রকল্পে সক্ষম করা থাকে)।

পাইথন

  • PROJECT_ID — ক্লাউড প্রকল্প যেখানে ফাংশনটি চলছে।
  • DATABASE_URL — ফাংশনের সাথে সম্পর্কিত রিয়েলটাইম ডাটাবেস ইনস্ট্যান্সের URL (যদি Firebase প্রকল্পে সক্ষম করা থাকে)।
  • STORAGE_BUCKET — ফাংশনের সাথে যুক্ত ক্লাউড স্টোরেজ বাকেট (যদি Firebase প্রকল্পে সক্ষম করা থাকে)।

এইগুলি সকল ক্ষেত্রে ব্যবহারকারী-সংজ্ঞায়িত স্ট্রিং প্যারামিটারের মতো কাজ করে, তবে যেহেতু তাদের মানগুলি সর্বদা Firebase CLI-তে পরিচিত, তাই তাদের মানগুলি স্থাপনের সময় কখনই অনুরোধ করা হবে না বা .env ফাইলগুলিতে সংরক্ষণ করা হবে না।

গোপন পরামিতি

defineSecret() ব্যবহার করে সংজ্ঞায়িত Secret ধরণের প্যারামিটারগুলি স্ট্রিং প্যারামিটারগুলিকে প্রতিনিধিত্ব করে যার একটি মান ক্লাউড সিক্রেট ম্যানেজারে সংরক্ষিত থাকে। স্থানীয় .env ফাইলের বিপরীতে পরীক্ষা করার এবং অনুপস্থিত থাকলে ফাইলটিতে একটি নতুন মান লেখার পরিবর্তে, secret প্যারামিটারগুলি ক্লাউড সিক্রেট ম্যানেজারে অস্তিত্ব পরীক্ষা করে এবং স্থাপনের সময় একটি নতুন সিক্রেটের মান সম্পর্কে ইন্টারেক্টিভভাবে প্রম্পট করে।

এইভাবে সংজ্ঞায়িত গোপন প্যারামিটারগুলি অবশ্যই পৃথক ফাংশনের সাথে আবদ্ধ হতে হবে যার অ্যাক্সেস থাকা উচিত:

নোড.জেএস

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

export const postToDiscord = onRequest(
  { secrets: [discordApiKey] },
  (req, res) => {
  const apiKey = discordApiKey.value();
    //…

পাইথন

from firebase_functions import https_fn
from firebase_functions.params import SecretParam

DISCORD_API_KEY = SecretParam('DISCORD_API_KEY')

@https_fn.on_request(secrets=[DISCORD_API_KEY])
def post_to_discord(req):
    api_key = DISCORD_API_KEY.value

যেহেতু ফাংশনটি কার্যকর না হওয়া পর্যন্ত সিক্রেটসের মানগুলি লুকানো থাকে, তাই আপনি আপনার ফাংশনটি কনফিগার করার সময় সেগুলি ব্যবহার করতে পারবেন না।

পরিবেশের ভেরিয়েবল

Cloud Functions for Firebase আপনার অ্যাপ্লিকেশন রানটাইমে .env ফাইলে নির্দিষ্ট পরিবেশ ভেরিয়েবল লোড করার জন্য dotenv ফাইল ফর্ম্যাট সমর্থন করে। একবার স্থাপন করা হলে, পরিবেশ ভেরিয়েবলগুলি process.env ইন্টারফেস (Node.js-ভিত্তিক প্রকল্পগুলিতে) অথবা os.environ (পাইথন-ভিত্তিক প্রকল্পগুলিতে) মাধ্যমে পড়া যেতে পারে।

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

  1. আপনার functions/ ডিরেক্টরিতে একটি .env ফাইল তৈরি করুন:

    # Directory layout:
    #   my-project/
    #     firebase.json
    #     functions/
    #       .env
    #       package.json
    #       index.js
    
  2. সম্পাদনার জন্য .env ফাইলটি খুলুন এবং পছন্দসই কীগুলি যোগ করুন। উদাহরণস্বরূপ:

    PLANET=Earth
    AUDIENCE=Humans
    
  3. ফাংশন স্থাপন করুন এবং পরিবেশের ভেরিয়েবল লোড হয়েছে কিনা তা যাচাই করুন:

    firebase deploy --only functions
    # ...
    # i functions: Loaded environment variables from .env.
    # ...
    

একবার আপনার কাস্টম এনভায়রনমেন্ট ভেরিয়েবল স্থাপন করা হলে, আপনার ফাংশন কোড সেগুলি অ্যাক্সেস করতে পারবে:

নোড.জেএস

// Responds with "Hello Earth and Humans"
exports.hello = onRequest((request, response) => {
  response.send(`Hello ${process.env.PLANET} and ${process.env.AUDIENCE}`);
});

পাইথন

import os

@https_fn.on_request()
def hello(req):
    return https_fn.Response(
        f"Hello {os.environ.get('PLANET')} and {os.environ.get('AUDIENCE')}"
    )

পরিবেশগত ভেরিয়েবলের একাধিক সেট স্থাপন করা

আপনার Firebase প্রকল্পের জন্য যদি পরিবেশ ভেরিয়েবলের একটি বিকল্প সেটের প্রয়োজন হয় (যেমন স্টেজিং বনাম প্রোডাকশন), তাহলে একটি .env. <project or alias > ফাইল তৈরি করুন এবং সেখানে আপনার প্রকল্প-নির্দিষ্ট পরিবেশ ভেরিয়েবল লিখুন। .env এবং প্রকল্প-নির্দিষ্ট .env ফাইলের পরিবেশ ভেরিয়েবলগুলি (যদি থাকে) সমস্ত স্থাপন করা ফাংশনে অন্তর্ভুক্ত করা হবে।

উদাহরণস্বরূপ, একটি প্রকল্পে উন্নয়ন এবং উৎপাদনের জন্য সামান্য ভিন্ন মান সম্বলিত এই তিনটি ফাইল অন্তর্ভুক্ত থাকতে পারে:

.env .env.dev .env.prod
গ্রহ = পৃথিবী

শ্রোতা = মানুষ

শ্রোতা=দেব মানুষ শ্রোতা = উৎপাদিত মানুষ

ঐ পৃথক ফাইলগুলির মানগুলি বিবেচনা করে, আপনার ফাংশনগুলির সাথে স্থাপন করা পরিবেশ ভেরিয়েবলের সেট আপনার লক্ষ্য প্রকল্পের উপর নির্ভর করে পরিবর্তিত হবে:

$ firebase use dev
$ firebase deploy --only functions
i functions: Loaded environment variables from .env, .env.dev.
# Deploys functions with following user-defined environment variables:
#   PLANET=Earth
#   AUDIENCE=Dev Humans

$ firebase use prod
$ firebase deploy --only functions
i functions: Loaded environment variables from .env, .env.prod.
# Deploys functions with following user-defined environment variables:
#   PLANET=Earth
#   AUDIENCE=Prod Humans

সংরক্ষিত পরিবেশ ভেরিয়েবল

কিছু এনভায়রনমেন্ট ভেরিয়েবল কী অভ্যন্তরীণ ব্যবহারের জন্য সংরক্ষিত। আপনার .env ফাইলগুলিতে এই কীগুলির কোনওটি ব্যবহার করবেন না:

  • X_GOOGLE_ দিয়ে শুরু হওয়া সকল কী
  • EXT_ থেকে শুরু হওয়া সকল কী
  • FIREBASE_ দিয়ে শুরু হওয়া সকল কী
  • নিম্নলিখিত তালিকা থেকে যেকোনো কী:
  • ক্লাউড_রানটাইম_কনফিগ
  • প্রবেশ_পয়েন্ট
  • জিসিপি_প্রজেক্ট
  • জিসিএলউড_প্রকল্প
  • গুগল_ক্লাউড_প্রকল্প
  • ফাংশন_ট্রিগার_টাইপ
  • ফাংশন_নাম
  • ফাংশন_মেমোরি_এমবি
  • FUNCTION_TIMEOUT_SEC
  • ফাংশন_আইডেন্টিটি
  • ফাংশন_রিজিওন
  • ফাংশন_টার্গেট
  • ফাংশন_সিগন্যাচার_টাইপ
  • কে_সার্ভিস
  • K_REVISION সম্পর্কে
  • বন্দর
  • কে_কনফিগারেশন

সংবেদনশীল কনফিগারেশন তথ্য সংরক্ষণ এবং অ্যাক্সেস করুন

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

সংবেদনশীল কনফিগারেশন তথ্য সংরক্ষণে আপনাকে সাহায্য করার জন্য, Cloud Functions for Firebase Google Cloud Secret Manager এর সাথে একীভূত হয়। এই এনক্রিপ্ট করা পরিষেবাটি কনফিগারেশন মানগুলিকে নিরাপদে সংরক্ষণ করে, একই সাথে প্রয়োজনে আপনার ফাংশনগুলি থেকে সহজে অ্যাক্সেসের অনুমতি দেয়।

একটি গোপন তথ্য তৈরি করুন এবং ব্যবহার করুন

একটি গোপন তথ্য তৈরি করতে, Firebase CLI ব্যবহার করুন।

একটি গোপন তথ্য তৈরি এবং ব্যবহার করতে:

  1. আপনার স্থানীয় প্রকল্প ডিরেক্টরির মূল থেকে, নিম্নলিখিত কমান্ডটি চালান:

    firebase functions:secrets:set SECRET_NAME

  2. SECRET_NAME এর জন্য একটি মান লিখুন।

    CLI একটি সাফল্যের বার্তা প্রতিধ্বনিত করে এবং সতর্ক করে যে পরিবর্তনটি কার্যকর করার জন্য আপনাকে অবশ্যই ফাংশন স্থাপন করতে হবে।

  3. স্থাপনের আগে, নিশ্চিত করুন যে আপনার ফাংশন কোডটি secrets বিকল্পটি ব্যবহার করে ফাংশনটিকে গোপনীয়তা অ্যাক্সেস করার অনুমতি দেয়:

    নোড.জেএস

    const { onRequest } = require('firebase-functions/v2/https');
    
    exports.processPayment = onRequest(
      { secrets: ["SECRET_NAME"] },
      (req, res) => {
        const myBillingService = initializeBillingService(
          // reference the secret value
          process.env.SECRET_NAME
        );
        // Process the payment
      }
    );

    পাইথন

    import os
    from firebase_functions import https_fn
    
    @https_fn.on_request(secrets=["SECRET_NAME"])
    def process_payment(req):
        myBillingService = initialize_billing(key=os.environ.get('SECRET_NAME'))
        # Process the payment
        ...
    
  4. Cloud Functions স্থাপন করুন:

    firebase deploy --only functions

    এখন আপনি অন্য যেকোনো এনভায়রনমেন্ট ভেরিয়েবলের মতো এটি অ্যাক্সেস করতে পারবেন। বিপরীতভাবে, যদি অন্য কোনও ফাংশন যা গোপনীয়তা নির্দিষ্ট করে না, গোপনীয়তা অ্যাক্সেস করার চেষ্টা করে, তবে এটি একটি অনির্ধারিত মান পায়:

    নোড.জেএস

    exports.anotherEndpoint = onRequest((request, response) => {
      response.send(`The secret API key is ${process.env.SECRET_NAME}`);
      // responds with "The secret API key is undefined" because the `secrets` option is missing
    });
    

    পাইথন

    @https_fn.on_request()
    def another_endpoint(req):
        return https_fn.Response(f"The secret API key is {os.environ.get("SECRET_NAME")}")
        # Responds with "The secret API key is None" because the `secrets` parameter is missing.
    

একবার আপনার ফাংশনটি স্থাপন করা হয়ে গেলে, এটি গোপন মান অ্যাক্সেস করতে পারবে। শুধুমাত্র যেসব ফাংশন তাদের secrets বিকল্পে একটি গোপন অন্তর্ভুক্ত করে, তারাই পরিবেশ পরিবর্তনশীল হিসাবে সেই গোপন মান অ্যাক্সেস করতে পারবে। এটি আপনাকে নিশ্চিত করতে সাহায্য করে যে গোপন মানগুলি কেবল যেখানে প্রয়োজন সেখানেই উপলব্ধ, যা দুর্ঘটনাক্রমে গোপন তথ্য ফাঁস হওয়ার ঝুঁকি হ্রাস করে।

গোপনীয়তা পরিচালনা করা

আপনার গোপনীয়তা পরিচালনা করতে Firebase CLI ব্যবহার করুন। এইভাবে গোপনীয়তা পরিচালনা করার সময়, মনে রাখবেন যে কিছু CLI পরিবর্তনের জন্য আপনাকে সংশ্লিষ্ট ফাংশনগুলি পরিবর্তন এবং/অথবা পুনরায় স্থাপন করতে হবে। বিশেষ করে:

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

গোপন ব্যবস্থাপনার জন্য Firebase সিএলআই কমান্ডের সারসংক্ষেপ এখানে দেওয়া হল:

# Change the value of an existing secret
firebase functions:secrets:set SECRET_NAME

# View the value of a secret
functions:secrets:access SECRET_NAME

# Destroy a secret
functions:secrets:destroy SECRET_NAME

# View all secret versions and their state
functions:secrets:get SECRET_NAME

# Automatically clean up all secrets that aren't referenced by any of your functions
functions:secrets:prune

access এবং destroy কমান্ডের জন্য, আপনি একটি নির্দিষ্ট সংস্করণ পরিচালনা করার জন্য ঐচ্ছিক সংস্করণ প্যারামিটার প্রদান করতে পারেন। উদাহরণস্বরূপ:

functions:secrets:access SECRET_NAME[@VERSION]

এই ক্রিয়াকলাপগুলি সম্পর্কে আরও তথ্যের জন্য, CLI সহায়তা দেখার জন্য -h কমান্ডটি পাস করুন।

গোপন তথ্য কীভাবে জমা করা হয়

Secret Manager বিনামূল্যে ৬টি সক্রিয় গোপন সংস্করণের অনুমতি দেয়। এর মানে হল, আপনি একটি ফায়ারবেস প্রকল্পে প্রতি মাসে ৬টি গোপন সংস্করণ বিনামূল্যে রাখতে পারবেন।

ডিফল্টরূপে, Firebase CLI যখন উপযুক্ত হয় তখন অব্যবহৃত গোপন সংস্করণগুলি স্বয়ংক্রিয়ভাবে ধ্বংস করার চেষ্টা করে, যেমন যখন আপনি গোপনের একটি নতুন সংস্করণের সাথে ফাংশন স্থাপন করেন। এছাড়াও, আপনি functions:secrets:destroy এবং functions:secrets:prune ব্যবহার করে সক্রিয়ভাবে অব্যবহৃত গোপনীয়তাগুলি পরিষ্কার করতে পারেন।

Secret Manager একটি সিক্রেটে ১০,০০০টি বিলবিহীন মাসিক অ্যাক্সেস অপারেশনের অনুমতি দেয়। ফাংশন ইনস্ট্যান্সগুলি যখনই কোল্ড স্টার্ট করে তখন কেবল তাদের secrets অপশনে উল্লেখিত সিক্রেটগুলি পড়ে। যদি আপনার অনেক ফাংশন ইনস্ট্যান্স থাকে যা অনেক সিক্রেট পড়ে, তাহলে আপনার প্রকল্পটি এই ভাতা অতিক্রম করতে পারে, সেই সময়ে আপনাকে প্রতি ১০,০০০ অ্যাক্সেস অপারেশনের জন্য $০.০৩ চার্জ করা হবে।

আরও তথ্যের জন্য, Secret Manager প্রাইসিং দেখুন।

এমুলেটর সাপোর্ট

dotenv এর সাথে পরিবেশ কনফিগারেশনটি একটি স্থানীয় Cloud Functions এমুলেটরের সাথে ইন্টারঅপারেট করার জন্য ডিজাইন করা হয়েছে।

স্থানীয় Cloud Functions এমুলেটর ব্যবহার করার সময়, আপনি একটি .env.local ফাইল সেট আপ করে আপনার প্রকল্পের জন্য পরিবেশ ভেরিয়েবলগুলিকে ওভাররাইড করতে পারেন। .env.local এর বিষয়বস্তু .env এবং প্রকল্প-নির্দিষ্ট .env ফাইলের চেয়ে প্রাধান্য পায়।

উদাহরণস্বরূপ, একটি প্রকল্পে উন্নয়ন এবং স্থানীয় পরীক্ষার জন্য সামান্য ভিন্ন মান সম্বলিত এই তিনটি ফাইল অন্তর্ভুক্ত থাকতে পারে:

.env .env.dev .env.local
গ্রহ = পৃথিবী

শ্রোতা = মানুষ

শ্রোতা=দেব মানুষ শ্রোতা = স্থানীয় মানুষ

স্থানীয় প্রসঙ্গে শুরু হলে, এমুলেটরটি পরিবেশের ভেরিয়েবলগুলি লোড করে যেমন দেখানো হয়েছে:

  $ firebase emulators:start
  i  emulators: Starting emulators: functions
  # Starts emulator with following environment variables:
  #  PLANET=Earth
  #  AUDIENCE=Local Humans

Cloud Functions এমুলেটরের গোপনীয়তা এবং শংসাপত্র

Cloud Functions এমুলেটর সংবেদনশীল কনফিগারেশন তথ্য সংরক্ষণ এবং অ্যাক্সেস করার জন্য সিক্রেট ব্যবহার সমর্থন করে। ডিফল্টরূপে, এমুলেটর অ্যাপ্লিকেশন ডিফল্ট শংসাপত্র ব্যবহার করে আপনার উৎপাদন সিক্রেট অ্যাক্সেস করার চেষ্টা করবে। CI পরিবেশের মতো কিছু পরিস্থিতিতে, অনুমতি সীমাবদ্ধতার কারণে এমুলেটর গোপন মান অ্যাক্সেস করতে ব্যর্থ হতে পারে।

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

রানটাইম কনফিগারেশন থেকে মাইগ্রেট করুন

যদি আপনি functions.config দিয়ে পরিবেশ কনফিগারেশন ব্যবহার করে থাকেন, তাহলে ২০২৫ সালের শেষের আগে আপনার বিদ্যমান কনফিগারেশনটি একটি সমর্থিত ফর্ম্যাটে স্থানান্তর করতে হবে, যখন functions.config বাতিল করা হবে। ২০২৫ সালের ডিসেম্বরের পরে, functions.config দিয়ে নতুন স্থাপনা ব্যর্থ হবে।

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

params সাবপ্যাকেজে মাইগ্রেট করুন

যদি আপনি functions.config দিয়ে পরিবেশ কনফিগারেশন ব্যবহার করে থাকেন, তাহলে আপনি আপনার বিদ্যমান কনফিগারেশনটিকে প্যারামিটারাইজড কনফিগারেশন হিসাবে রিফ্যাক্টর করে স্থানান্তর করতে পারেন। উদাহরণস্বরূপ:

আগে: ১ম প্রজন্ম

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

exports.date = functions.https.onRequest((req, res) => {
  const date = new Date();
  const formattedDate =
date.toLocaleDateString(functions.config().dateformat);

  // ...
});

পরে: দ্বিতীয় প্রজন্ম

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

const dateFormat = defineString("DATE_FORMAT");

exports.date = onRequest((req, res) => {
  const date = new Date();
  const formattedDate = date.toLocaleDateString(dateFormat.value());

  // ...
});

প্যারামিটারের মান সেট করুন

প্রথমবার যখন আপনি স্থাপন করবেন, তখন Firebase CLI সমস্ত প্যারামিটারের মান জিজ্ঞাসা করবে এবং মানগুলি একটি dotenv ফাইলে সংরক্ষণ করবে। আপনার functions.config মানগুলি রপ্তানি করতে, firebase functions:config:export চালান।

অতিরিক্ত নিরাপত্তার জন্য, আপনি প্যারামিটারের ধরন এবং বৈধতা নিয়মও নির্দিষ্ট করতে পারেন।

বিশেষ ক্ষেত্রে: API কী

params মডিউলটি ক্লাউড সিক্রেট ম্যানেজারের সাথে একীভূত হয়, যা API কীগুলির মতো সংবেদনশীল মানগুলিতে সূক্ষ্ম অ্যাক্সেস নিয়ন্ত্রণ প্রদান করে। আরও তথ্যের জন্য গোপন প্যারামিটারগুলি দেখুন।

স্বয়ংক্রিয়ভাবে জনবহুল পরিবেশ ভেরিয়েবল

কিছু এনভায়রনমেন্ট ভেরিয়েবল আছে যা স্বয়ংক্রিয়ভাবে ফাংশন রানটাইম এবং স্থানীয়ভাবে অনুকরণ করা ফাংশনে পূর্ণ হয়। এর মধ্যে রয়েছে Google Cloud দ্বারা পূর্ণ করা ভেরিয়েবল , সেইসাথে একটি Firebase-নির্দিষ্ট পরিবেশ ভেরিয়েবল:

process.env.FIREBASE_CONFIG : নিম্নলিখিত Firebase প্রকল্প কনফিগারেশন তথ্য প্রদান করে:

{
  databaseURL: 'https://DATABASE_NAME.firebaseio.com',
  storageBucket: 'PROJECT_ID.firebasestorage.app',
  projectId: 'PROJECT_ID'
}

মনে রাখবেন যে আপনার প্রকৃত Firebase কনফিগারেশনের মানগুলি আপনার প্রকল্পে প্রয়োগ করা রিসোর্সের উপর নির্ভর করে পরিবর্তিত হতে পারে।

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

const admin = require('firebase-admin');
admin.initializeApp();

যদি আপনি টাইপস্ক্রিপ্টে ফাংশন লিখছেন, তাহলে এভাবে শুরু করুন:

import * as functions from 'firebase-functions/v1';
import * as admin from 'firebase-admin';
import 'firebase-functions/v1';
admin.initializeApp();

যদি আপনার সার্ভিস অ্যাকাউন্ট ক্রেডেনশিয়াল ব্যবহার করে ডিফল্ট প্রজেক্ট কনফিগারেশনের মাধ্যমে অ্যাডমিন SDK আরম্ভ করার প্রয়োজন হয়, তাহলে আপনি একটি ফাইল থেকে ক্রেডেনশিয়াল লোড করতে পারেন এবং FIREBASE_CONFIG এ এভাবে যোগ করতে পারেন:

serviceAccount = require('./serviceAccount.json');

const adminConfig = JSON.parse(process.env.FIREBASE_CONFIG);
adminConfig.credential = admin.credential.cert(serviceAccount);
admin.initializeApp(adminConfig);