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


প্রায়শই আপনার ফাংশনের জন্য অতিরিক্ত কনফিগারেশনের প্রয়োজন হবে, যেমন তৃতীয় পক্ষের 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 ব্যবহার করতে হবে, যেমন এনভায়রনমেন্ট ভেরিয়েবলে দেখানো হয়েছে।

,


প্রায়শই আপনার ফাংশনের জন্য অতিরিক্ত কনফিগারেশনের প্রয়োজন হবে, যেমন তৃতীয় পক্ষের 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

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!')

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

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

Node.js

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

পাইথন

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

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

গোপন পরামিতি

টাইপ Secret প্যারামিটারগুলি, defineSecret() ব্যবহার করে সংজ্ঞায়িত, স্ট্রিং প্যারামিটারগুলি উপস্থাপন করে যা ক্লাউড সিক্রেট ম্যানেজারে একটি মান সংরক্ষণ করে। কোনও স্থানীয় .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 ইন্টারফেস (নোড.জেএস-ভিত্তিক প্রকল্পগুলিতে) বা 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
গ্রহ = পৃথিবী

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

শ্রোতা = দেব মানুষ শ্রোতা = প্রোড মানুষ

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

$ 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_
  • ফায়ারবেস_ দিয়ে শুরু হওয়া সমস্ত কী
  • নিম্নলিখিত তালিকা থেকে কোনও কী:
  • ক্লাউড_রুনটাইম_কনফিগ
  • প্রবেশ_পয়েন্ট
  • Gcp_project
  • Gcloud_project
  • গুগল_ক্লাউড_প্রজেক্ট
  • ফাংশন_ট্রিগার_ টাইপ
  • FUNCTION_NAME
  • ফাংশন_মেমরি_এমবি
  • ফাংশন_টাইমআউট_সেক
  • ফাংশন_ পরিচয়
  • ফাংশন_গ্রিওন
  • ফাংশন_টারেট
  • ফাংশন_সাইনচার_ টাইপ
  • কে_সার্ভিস
  • K_revision
  • পোর্ট
  • কে_কনফিগারেশন

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

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

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

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

একটি গোপন তৈরি করতে, Firebase সিএলআই ব্যবহার করুন।

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

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

    firebase functions:secrets:set SECRET_NAME

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

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

  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 সিএলআই ব্যবহার করুন। এইভাবে গোপনীয়তা পরিচালনা করার সময়, মনে রাখবেন যে কিছু সিএলআই পরিবর্তনের জন্য আপনাকে সম্পর্কিত ফাংশনগুলি সংশোধন এবং/অথবা পুনরায় নিয়োগের প্রয়োজন। বিশেষভাবে:

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

সিক্রেট ম্যানেজমেন্টের জন্য 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 কমান্ডগুলির জন্য, আপনি একটি নির্দিষ্ট সংস্করণ পরিচালনা করতে al চ্ছিক সংস্করণ প্যারামিটার সরবরাহ করতে পারেন। যেমন:

functions:secrets:access SECRET_NAME[@VERSION]

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

কীভাবে গোপনীয়তা বিল করা হয়

Secret Manager বিনা ব্যয়ে 6 টি সক্রিয় গোপন সংস্করণগুলির অনুমতি দেয়। এর অর্থ হ'ল কোনও ব্যয় ছাড়াই আপনার ফায়ারবেস প্রকল্পে প্রতি মাসে 6 টি গোপনীয়তা থাকতে পারে।

ডিফল্টরূপে, Firebase সিএলআই স্বয়ংক্রিয়ভাবে অব্যবহৃত গোপন সংস্করণগুলি যেখানে উপযুক্ত সেখানে ধ্বংস করার চেষ্টা করে, যেমন আপনি যখন সিক্রেটের নতুন সংস্করণ সহ ফাংশনগুলি স্থাপন করেন। এছাড়াও, আপনি 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
গ্রহ = পৃথিবী

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

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

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

  $ 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 সাথে পরিবেশ কনফিগারেশন ব্যবহার করে থাকেন তবে আপনি আপনার বিদ্যমান কনফিগারেশনটিকে পরিবেশের ভেরিয়েবল হিসাবে ( ডোটেনভি ফর্ম্যাটে) স্থানান্তর করতে পারেন। Firebase সিএলআই একটি রফতানি কমান্ড dev করে local আপনার ডিরেক্টরিতে তালিকাভুক্ত প্রতিটি ওরফে বা prod কনফিগারেশনকে .env করে .firebaserc

স্থানান্তর করতে, 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 ব্যবহার করতে হবে।

,


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

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

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

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

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

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

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!')

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

$ 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() মিথ্যা কিনা তা পরীক্ষা করে দেখুন।

সিএলআই আচরণ কনফিগার করুন

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

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

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!')

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

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

Node.js

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

পাইথন

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

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

গোপন পরামিতি

টাইপ Secret প্যারামিটারগুলি, defineSecret() ব্যবহার করে সংজ্ঞায়িত, স্ট্রিং প্যারামিটারগুলি উপস্থাপন করে যা ক্লাউড সিক্রেট ম্যানেজারে একটি মান সংরক্ষণ করে। কোনও স্থানীয় .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 ইন্টারফেস (নোড.জেএস-ভিত্তিক প্রকল্পগুলিতে) বা 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 > file and write your project-specific environment variables there. The environment variables from .env and project-specific .env files (if they exist) will be included in all deployed functions.

For example, a project could include these three files containing slightly different values for development and production:

.env .env.dev .env.prod
PLANET=Earth

AUDIENCE=Humans

AUDIENCE=Dev Humans AUDIENCE=Prod Humans

Given the values in those separate files, the set of environment variables deployed with your functions will vary depending on your target project:

$ 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

Reserved environment variables

Some environment variable keys are reserved for internal use. Do not use any of these keys in your .env files:

  • All keys starting with X_GOOGLE_
  • All keys starting EXT_
  • All keys starting with FIREBASE_
  • Any key from the following list:
  • 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

Store and access sensitive configuration information

Environment variables stored in .env files can be used for function configuration, but you should not consider them a secure way to store sensitive information such as database credentials or API keys. This is especially important if you check your .env files into source control.

To help you store sensitive configuration information, Cloud Functions for Firebase integrates with Google Cloud Secret Manager . This encrypted service stores configuration values securely, while still allowing easy access from your functions when needed.

Create and use a secret

To create a secret, use the Firebase CLI.

To create and use a secret:

  1. From the root of your local project directory, run the following command:

    firebase functions:secrets:set SECRET_NAME

  2. Enter a value for SECRET_NAME .

    The CLI echoes a success message and warns that you must deploy functions for the change to take effect.

  3. Before deploying, make sure your functions code allows the function to access the secret using the runWith parameter:

    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. Deploy Cloud Functions :

    firebase deploy --only functions

    Now you'll be able to access it like any other environment variable. Conversely, if another function that does not specify the secret in runWith tries to access the secret, it receives an undefined value:

    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.
    

Once your function is deployed, it will have access to the secret value. Only functions that specifically include a secret in their runWith parameter will have access to that secret as an environment variable. This helps you make sure that secret values are only available where they're needed, reducing the risk of accidentally leaking a secret.

Managing secrets

Use the Firebase CLI to manage your secrets. While managing secrets this way, keep in mind that some CLI changes require you to modify and/or redeploy associated functions. বিশেষভাবে:

  • Whenever you set a new value for a secret, you must redeploy all functions that reference that secret for them to pick up the latest value.
  • If you delete a secret, make sure that none of your deployed functions references that secret. Functions that use a secret value that has been deleted will fail silently.

Here's a summary of the Firebase CLI commands for secret management:

# 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

For the access and destroy commands, you can provide the optional version parameter to manage a particular version. যেমন:

functions:secrets:access SECRET_NAME[@VERSION]

For more information about these operations, pass -h with the command to view CLI help.

How secrets are billed

Secret Manager allows 6 active secret versions at no cost. This means that you can have 6 secrets per month in a Firebase project at no cost.

By default, the Firebase CLI attempts to automatically destroy unused secret versions where appropriate, such as when you deploy functions with a new version of the secret. Also, you can actively clean up unused secrets using functions:secrets:destroy and functions:secrets:prune .

Secret Manager allows 10,000 unbilled monthly access operations on a secret. Function instances read only the secrets specified in their runWith parameter every time they cold start. If you have a lot of function instances reading a lot of secrets, your project may exceed this allowance, at which point you'll be charged $0.03 per 10,000 access operations.

For more information, see Secret Manager Pricing .

Emulator support

Environment configuration with dotenv is designed to interoperate with a local Cloud Functions emulator .

When using a local Cloud Functions emulator, you can override environment variables for your project by setting up a .env.local file. Contents of .env.local take precedence over .env and the project-specific .env file.

For example, a project could include these three files containing slightly different values for development and local testing:

.env .env.dev .env.local
PLANET=Earth

AUDIENCE=Humans

AUDIENCE=Dev Humans AUDIENCE=Local Humans

When started in the local context, the emulator loads the environment variables as shown:

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

Secrets and credentials in the Cloud Functions emulator

The Cloud Functions emulator supports the use of secrets to store and access sensitive configuration information . By default, the emulator will try to access your production secrets using application default credentials . In certain situations like CI environments, the emulator may fail to access secret values due to permission restrictions.

Similar to Cloud Functions emulator support for environment variables, you can override secrets values by setting up a .secret.local file. This makes it easy for you to test your functions locally, especially if you don't have access to the secret value.

Migrating from environment configuration

If you have been using environment configuration with functions.config , you can migrate your existing configuration as environment variables (in dotenv format). The Firebase CLI provides an export command that outputs the configuration of each alias or project listed in your directory's .firebaserc file (in the example below, local , dev , and prod ) as .env files.

To migrate, export your existing environment configurations using the firebase functions:config:export command:

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

Note that, in some cases, you will be prompted to enter a prefix to rename exported environment variable keys. This is because not all configurations can be automatically transformed since they may be invalid or may be a reserved environment variable key .

We recommend that you carefully review the contents of the generated .env files before you deploy your functions or check the .env files into source control. If any values are sensitive and should not be leaked, remove them from your .env files and store them securely in Secret Manager instead.

You'll also need to update your functions code. Any functions that use functions.config will now need to use process.env instead, as shown in Environment variables .