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


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

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

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

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

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

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

Node.js

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> ফাইলটিকে সংস্করণ নিয়ন্ত্রণে যোগ করা উপযোগী হতে পারে।

বৈশ্বিক সুযোগে পরামিতি ব্যবহার করা

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

Node.js

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 প্রকল্প থেকে স্বয়ংক্রিয়ভাবে একটি নির্বাচনের বিকল্প তৈরি করে:

Node.js

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",
)

পরামিতি প্রকার

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

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

পরামিতি মান এবং অভিব্যক্তি

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

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

Node.js

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):
    ...

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

Node.js

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 ফাংশন দিয়ে অ্যাক্সেস করা যেতে পারে:

Node.js

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 সাবপ্যাকেজ থেকে পাওয়া যায়:

Node.js

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

পাইথন

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

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

গোপন পরামিতি

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

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

Node.js

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.
    # ...
    

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

Node.js

// 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')}"
    )

পরিবেশ ভেরিয়েবলের একাধিক সেট স্থাপন করা হচ্ছে

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

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

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

AUDIENCE=মানুষ

AUDIENCE=দেব মানুষ AUDIENCE=প্রোড হিউম্যানস

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

$ 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_ দিয়ে শুরু হওয়া সমস্ত কী
  • নিম্নলিখিত তালিকা থেকে যেকোনো কী:
  • CLOUD_RUNTIME_CONFIG
  • ENTRY_POINT
  • GCP_PROJECT
  • GCLOUD_PROJECT
  • GOOGLE_CLOUD_PROJECT
  • FUNCTION_TRIGGER_TYPE
  • FUNCTION_NAME
  • FUNCTION_MEMORY_MB
  • FUNCTION_TIMEOUT_SEC
  • FUNCTION_IDENTITY
  • FUNCTION_REGION
  • FUNCTION_TARGET
  • FUNCTION_SIGNATURE_TYPE
  • K_SERVICE
  • K_REVISION
  • পোর্ট
  • K_CONFIGURATION

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

.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. স্থাপন করার আগে, নিশ্চিত করুন যে আপনার ফাংশন কোড ফাংশনটিকে runWith প্যারামিটার ব্যবহার করে গোপন অ্যাক্সেস করতে দেয়:

    Node.js

    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

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

    Node.js

    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 `runWith` parameter 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.
    

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

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

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

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

এখানে গোপন ব্যবস্থাপনার জন্য Firebase CLI কমান্ডগুলির একটি সারাংশ রয়েছে:

# 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 কোনো খরচ ছাড়াই 6টি সক্রিয় গোপন সংস্করণের অনুমতি দেয়। এর মানে হল যে আপনি একটি ফায়ারবেস প্রকল্পে প্রতি মাসে 6টি গোপনীয়তা রাখতে পারেন।

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

Secret Manager একটি গোপনে 10,000টি বিলবিহীন মাসিক অ্যাক্সেস অপারেশনের অনুমতি দেয়। ফাংশন দৃষ্টান্তগুলি প্রতিবার ঠান্ডা শুরু হওয়ার সময় তাদের runWith প্যারামিটারে নির্দিষ্ট গোপনীয়তাগুলি পড়ে। যদি আপনার কাছে অনেকগুলি ফাংশন ইনস্ট্যান্স থাকে যা প্রচুর গোপনীয়তা পড়ে, আপনার প্রকল্প এই ভাতা ছাড়িয়ে যেতে পারে, এই সময়ে আপনাকে প্রতি 10,000 অ্যাক্সেস অপারেশনের জন্য $0.03 চার্জ করা হবে।

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

এমুলেটর সমর্থন

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

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

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

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

AUDIENCE=মানুষ

AUDIENCE=দেব মানুষ AUDIENCE=স্থানীয় মানুষ

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

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

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

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

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

পরিবেশ কনফিগারেশন থেকে স্থানান্তর করা হচ্ছে

আপনি যদি functions.config এর সাথে এনভায়রনমেন্ট কনফিগারেশন ব্যবহার করে থাকেন, তাহলে আপনি আপনার বিদ্যমান কনফিগারেশনটিকে এনভায়রনমেন্ট ভেরিয়েবল ( dotenv ফরম্যাটে) হিসেবে স্থানান্তর করতে পারেন। Firebase CLI একটি এক্সপোর্ট কমান্ড প্রদান করে যা আপনার ডিরেক্টরির .firebaserc ফাইলে (নীচের উদাহরণে, local , dev , এবং prod ) তালিকাভুক্ত প্রতিটি উপনাম বা প্রকল্পের কনফিগারেশন .env ফাইল হিসাবে আউটপুট করে।

মাইগ্রেট করতে, firebase functions:config:export কমান্ড:

firebase functions:config:export
i  Importing configs from projects: [project-0, project-1]
⚠  The following configs keys could not be exported as environment variables:

⚠  project-0 (dev):
    1foo.a => 1FOO\_A (Key 1FOO\_A must start with an uppercase ASCII letter or underscore, and then consist of uppercase ASCII letters, digits, and underscores.)

Enter a PREFIX to rename invalid environment variable keys: CONFIG\_
✔  Wrote functions/.env.prod
✔  Wrote functions/.env.dev
✔  Wrote functions/.env.local
✔  Wrote functions/.env

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

আমরা সুপারিশ করি যে আপনি আপনার ফাংশন স্থাপন করার আগে বা উত্স নিয়ন্ত্রণে .env ফাইলগুলি পরীক্ষা করার আগে আপনি জেনারেট করা .env ফাইলগুলির বিষয়বস্তু সাবধানে পর্যালোচনা করুন৷ যদি কোন মান সংবেদনশীল হয় এবং ফাঁস করা উচিত নয়, সেগুলিকে আপনার .env ফাইলগুলি থেকে সরান এবং পরিবর্তে Secret Manager নিরাপদে সংরক্ষণ করুন৷

এছাড়াও আপনাকে আপনার ফাংশন কোড আপডেট করতে হবে। যে কোনো ফাংশন যেগুলি functions.config ব্যবহার করে এখন তার পরিবর্তে process.env ব্যবহার করতে হবে, যেমন এনভায়রনমেন্ট ভেরিয়েবলে দেখানো হয়েছে।