अपने एनवायरमेंट को कॉन्फ़िगर करना


अक्सर आपको अपने फ़ंक्शन के लिए अतिरिक्त कॉन्फ़िगरेशन की ज़रूरत पड़ेगी, जैसे कि तीसरे पक्ष की एपीआई कुंजियां या ट्यून करने लायक सेटिंग. Cloud Functions के लिए Firebase SDK टूल, पहले से मौजूद एनवायरमेंट कॉन्फ़िगरेशन की सुविधा देता है. इससे, आपके प्रोजेक्ट के लिए इस तरह के डेटा को स्टोर और फिर से पाना आसान हो जाता है.

इनमें से कोई एक विकल्प चुना जा सकता है:

  • पैरामीटर वाला कॉन्फ़िगरेशन (ज़्यादातर स्थितियों के लिए सुझाया गया). इससे पूरी तरह टाइप किया गया एनवायरमेंट मिलता है ऐसे पैरामीटर के साथ कॉन्फ़िगरेशन जिनका डिप्लॉयमेंट के समय उनकी पुष्टि की जाती है. ये पैरामीटर, गड़बड़ियों को रोकता है और डीबग करने की प्रक्रिया को आसान बनाता है.
  • एनवायरमेंट वैरिएबल का फ़ाइल-आधारित कॉन्फ़िगरेशन. इस तरीके से, एनवायरमेंट वैरिएबल लोड करने के लिए, मैन्युअल रूप से dotenv फ़ाइल बनाई जाती है.

ज़्यादातर इस्तेमाल के उदाहरणों के लिए, पैरामीटर वाले कॉन्फ़िगरेशन का सुझाव दिया जाता है. यह तरीका कॉन्फ़िगरेशन वैल्यू, रनटाइम और डिप्लॉयमेंट के समय, दोनों में उपलब्ध होती है. साथ ही, जब तक सभी पैरामीटर की वैल्यू मान्य न हो, तब तक डिप्लॉयमेंट पर रोक लगा दी जाती है. इसके उलट, डिप्लॉय करने के समय, एनवायरमेंट वैरिएबल वाला कॉन्फ़िगरेशन उपलब्ध नहीं होता.

पैरामीटर वाला कॉन्फ़िगरेशन

Cloud Functions for Firebase, आपके कोडबेस में कॉन्फ़िगरेशन पैरामीटर को तय करने के लिए, एक इंटरफ़ेस उपलब्ध कराता है. इन पैरामीटर का मान है डिप्लॉयमेंट और रनटाइम सेट करते समय, फ़ंक्शन डिप्लॉयमेंट के दौरान दोनों समय उपलब्ध होता है के विकल्प दिखते हैं. इसका मतलब है कि जब तक सभी पैरामीटर की वैल्यू मान्य नहीं होगी, तब तक सीएलआई डिप्लॉयमेंट को ब्लॉक कर देगा.

अपने कोड में पैरामीटर तय करने के लिए, यह मॉडल अपनाएं:

const functions = require('firebase-functions/v1');
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 = functions.runWith({ minInstances: minInstancesConfig}).https.onRequest(
  (req, res) => {
    res.send(`${welcomeMessage.value()}! I am a function.`);
  }
);

पैरामीटर वाले कॉन्फ़िगरेशन वैरिएबल के साथ फ़ंक्शन को डिप्लॉय करते समय, Firebase CLI सबसे पहले स्थानीय .env फ़ाइलों से उनकी वैल्यू लोड करने की कोशिश करता है. अगर उन्हें उन फ़ाइलों में मौजूद नहीं हैं और कोई default सेट नहीं है, तो सीएलआई और फिर उनकी वैल्यू को आपकी 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(). यह कॉलबैक, प्रोडक्शन में किसी भी फ़ंक्शन के चलने से पहले चलता है. हालांकि, को परिनियोजन समय के दौरान कॉल नहीं किया जाता, इसलिए यह पैरामीटर ऐक्सेस करने का एक सुरक्षित स्थान है वैल्यू.

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

  const apiKey = defineSecret('GOOGLE_API_KEY');

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

सीएलआई के व्यवहार को कॉन्फ़िगर करना

पैरामीटर को Options ऑब्जेक्ट की मदद से कॉन्फ़िगर किया जा सकता है. यह ऑब्जेक्ट यह कंट्रोल करता है कि सीएलआई, वैल्यू के लिए कैसे प्रॉम्प्ट करेगा. यहां दिए गए उदाहरण में, फ़ोन नंबर के फ़ॉर्मैट की पुष्टि करने, चुनने के लिए आसान विकल्प देने, और Firebase प्रोजेक्ट से चुनने के लिए विकल्प अपने-आप भरने के विकल्प सेट किए गए हैं:

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

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

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

const selectedOption = defineString('PARITY', {input: {select: {options:
[{value: "odd"}, {value: "even"}]}}})

const storageBucket = defineString('BUCKET', {input: {resource: {type:
"storage.googleapis.com/Bucket"}}, description: "This will automatically
populate the selector field with the deploying Cloud Projects
storage buckets"})

पैरामीटर के टाइप

पैरामीटर वाले कॉन्फ़िगरेशन से, पैरामीटर वैल्यू को बेहतर तरीके से टाइप किया जा सकता है और साथ ही, Cloud Secret Manager की ओर से गोपनीय जानकारी भी हासिल की जा सकती है. इस तरह के कोड काम करते हैं:

  • गोपनीय
  • स्ट्रिंग
  • बूलियन
  • पूर्णांक
  • फ़्लोट

पैरामीटर वैल्यू और एक्सप्रेशन

Firebase, डिप्लॉय करने के समय और फ़ंक्शन के चालू होने के दौरान, दोनों ही समय आपके पैरामीटर का आकलन करता है. इन दोहरे एनवायरमेंट की वजह से, ज़्यादा सावधानी बरतनी चाहिए पैरामीटर वैल्यू की तुलना करना और उनका इस्तेमाल करते समय, अपने लिए रनटाइम के विकल्प सेट करना फ़ंक्शन.

किसी पैरामीटर को रनटाइम विकल्प के रूप में अपने फ़ंक्शन में पास करने के लिए, उसे सीधे पास करें:

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

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

इसके अलावा, अगर आपको यह जानना है कि कौनसा विकल्प चुनना है, तो पैरामीटर की तुलना करने के लिए, वैल्यू की जांच करने के बजाय, पहले से मौजूद तुलना करने वाले टूल का इस्तेमाल करें:

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

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

सिर्फ़ रनटाइम के दौरान इस्तेमाल किए जाने वाले पैरामीटर और पैरामीटर एक्सप्रेशन ये हो सकते हैं अपने value फ़ंक्शन से ऐक्सेस किया गया:

const functions = require('firebase-functions/v1');
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 = functions.https.onRequest(
 (req, res) => {
    res.send(`${welcomeMessage.value()}! I am a function.`);
  }
);

पहले से मौजूद पैरामीटर

Cloud Functions SDK टूल, पहले से तय किए गए तीन पैरामीटर देता है. ये पैरामीटर यहां से उपलब्ध होते हैं firebase-functions/params सबपैकेज:

  • projectID — वह Cloud प्रोजेक्ट जिसमें फ़ंक्शन चल रहा है.
  • databaseURL — इससे जुड़े रीयल टाइम डेटाबेस इंस्टेंस का यूआरएल (अगर Firebase प्रोजेक्ट पर चालू है).
  • storageBucket — फ़ंक्शन से जुड़ा Cloud Storage बकेट (अगर Firebase प्रोजेक्ट पर चालू है).

ये फ़ंक्शन, उपयोगकर्ता की सेट की गई स्ट्रिंग की तरह काम करते हैं पैरामीटर का इस्तेमाल नहीं करेगा, क्योंकि उनकी वैल्यू हमेशा के साथ काम करते हैं, तो उनकी वैल्यू को डिप्लॉय करने पर या डिप्लॉयमेंट पर .env फ़ाइलों में सेव किया गया.

सीक्रेट पैरामीटर

defineSecret() का इस्तेमाल करके तय किए गए Secret टाइप के पैरामीटर, स्ट्रिंग पैरामीटर दिखाते हैं. इनकी वैल्यू, Cloud Secret Manager में सेव होती है. इसके बजाय लोकल .env फ़ाइल से जांच करके फ़ाइल में नई वैल्यू लिखने के लिए, अगर वह मौजूद नहीं है, सीक्रेट पैरामीटर मौजूद हैं. साथ ही, Cloud Secret Manager में उसकी मौजूदगी की जांच की जाती है, और डिप्लॉयमेंट के दौरान नए सीक्रेट की वैल्यू के लिए इंटरैक्टिव प्रॉम्प्ट.

इस तरह से तय किए गए गुप्त पैरामीटर, उन अलग-अलग फ़ंक्शन से बंधे होने चाहिए जिनके पास उनका ऐक्सेस होना चाहिए:

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

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

सीक्रेट की वैल्यू तब तक छिपी रहती हैं, जब तक फ़ंक्शन पूरा नहीं होता, इसलिए आप आपके फ़ंक्शन को कॉन्फ़िगर करते समय उनका इस्तेमाल नहीं कर सकता.

एनवायरमेंट वैरिएबल

Cloud Functions for Firebase, .env फ़ाइल में बताए गए एनवायरमेंट वैरिएबल को आपके ऐप्लिकेशन के रनटाइम में लोड करने के लिए, dotenv फ़ाइल फ़ॉर्मैट का इस्तेमाल करता है. डिप्लॉय होने के बाद, एनवायरमेंट वैरिएबल को process.env इंटरफ़ेस से पढ़ा जा सकता है.

अपने एनवायरमेंट को इस तरह कॉन्फ़िगर करने के लिए, अपने प्रोजेक्ट में .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.
    # ...
    

कस्टम एनवायरमेंट वैरिएबल डिप्लॉय होने के बाद, आपका फ़ंक्शन कोड, process.env सिंटैक्स की मदद से उन्हें ऐक्सेस कर सकता है:

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

एनवायरमेंट वैरिएबल के कई सेट डिप्लॉय करना

अगर आपको अपने Firebase प्रोजेक्ट के लिए, एनवायरमेंट वैरिएबल का कोई दूसरा सेट चाहिए, तो एक .env.<project or alias> फ़ाइल बनाएं और उसमें अपने प्रोजेक्ट के हिसाब से एनवायरमेंट वैरिएबल लिखें. जैसे, स्टेजिंग बनाम प्रोडक्शन. एनवायरमेंट वैरिएबल से .env और प्रोजेक्ट के हिसाब से .env फ़ाइलें (अगर वे मौजूद हैं) डिप्लॉय किए गए सभी फ़ंक्शन में शामिल किया जाएगा.

उदाहरण के लिए, एक प्रोजेक्ट में ये तीन फ़ाइलें शामिल हो सकती हैं, जिनमें डेवलपमेंट और प्रोडक्शन के लिए अलग-अलग वैल्यू हो सकती हैं:

.env .env.dev .env.prod
PLANET=पृथ्वी

AUDIENCE=Humans

AUDIENCE=Dev Humans AUDIENCE=Prod Humans

उन अलग-अलग फ़ाइलों में मान दिए जाने पर, एनवायरमेंट वैरिएबल का सेट आपके फ़ंक्शन के साथ डिप्लॉय किए जाने वाले ये एलिमेंट, आपके टारगेट प्रोजेक्ट के आधार पर अलग-अलग होंगे:

$ 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_IDENTITY
  • फ़ंक्शन_क्षेत्र
  • FUNCTION_TARGET
  • FUNCTION_SIGNATURE_TYPE
  • के_सेवा
  • के_रिविज़न
  • पोर्ट
  • K_CONFIGURATION

कॉन्फ़िगरेशन की संवेदनशील जानकारी सेव और ऐक्सेस करना

.env फ़ाइलों में स्टोर किए गए एनवायरमेंट वैरिएबल का इस्तेमाल, फ़ंक्शन के लिए किया जा सकता है कॉन्फ़िगरेशन के बारे में बताया गया है, लेकिन आपको उन्हें संवेदनशील जानकारी को स्टोर करने का सुरक्षित तरीका नहीं मानना चाहिए जानकारी, जैसे कि डेटाबेस क्रेडेंशियल या एपीआई पासकोड. यह खास तौर पर तब ज़रूरी होता है, जब सोर्स कंट्रोल में अपनी .env फ़ाइलों की जांच की जाती है.

कॉन्फ़िगरेशन की संवेदनशील जानकारी सेव करने में आपकी मदद करने के लिए, Cloud Functions for Firebase Google Cloud के साथ इंटिग्रेट करता है Secret Manager. एन्क्रिप्ट (सुरक्षित) की गई यह सेवा, कॉन्फ़िगरेशन वैल्यू को सुरक्षित तरीके से सेव करती है. हालांकि साथ ही, ज़रूरत पड़ने पर आपके फ़ंक्शन से आसानी से ऐक्सेस दे सकेगा.

सीक्रेट बनाना और उसका इस्तेमाल करना

सीक्रेट बनाने के लिए, Firebase सीएलआई का इस्तेमाल करें.

सीक्रेट बनाने और इस्तेमाल करने के लिए:

  1. अपनी लोकल प्रोजेक्ट डायरेक्ट्री के रूट से, यह कमांड चलाएं:

    firebase functions:secrets:set SECRET_NAME

  2. SECRET_NAME के लिए कोई वैल्यू डालें.

    सीएलआई ने सफल होने का मैसेज दिखाया है और चेतावनी दी है कि आपको फ़ंक्शन डिप्लॉय करने होंगे बदलाव को लागू करने के लिए.

  3. डिप्लॉय करने से पहले, पक्का करें कि आपके फ़ंक्शन कोड में, runWith पैरामीटर का इस्तेमाल करके, फ़ंक्शन को गुप्त जानकारी ऐक्सेस करने की अनुमति दी गई हो:

    exports.processPayment = functions
      // Make the secret available to this function
      .runWith({ secrets: ["SECRET_NAME"] })
      .onCall((data, context) => {
        const myBillingService = initializeBillingService(
          // reference the secret value
          process.env.SECRET_NAME
        );
        // Process the payment
      });
  4. Cloud Functions डिप्लॉय करें:

    firebase deploy --only functions

अब इसे किसी भी दूसरे एनवायरमेंट वैरिएबल की तरह ऐक्सेस किया जा सकेगा. इसके उलट, अगर कोई ऐसा फ़ंक्शन है जो runWith सीक्रेट को ऐक्सेस करने की कोशिश करता है, तो इसे ऐसी वैल्यू मिलती है जो तय नहीं है:

  exports.anotherEndpoint = functions.https.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
  });

लागू होने के बाद, आपके फ़ंक्शन को सीक्रेट वैल्यू का ऐक्सेस मिल जाएगा. 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 निर्देशों के लिए, किसी खास वर्शन को मैनेज करने के लिए, वैकल्पिक वर्शन पैरामीटर दिया जा सकता है. उदाहरण के लिए:

functions:secrets:access SECRET_NAME[@VERSION]

इन संक्रियाओं के बारे में ज़्यादा जानकारी के लिए, -h को आदेश के साथ पास करें सीएलआई सहायता देखें.

सीक्रेट की बिलिंग कैसे की जाती है

Secret Manager में, बिना किसी शुल्क के छह सक्रिय गुप्त वर्शन इस्तेमाल किए जा सकते हैं. इसका मतलब है कि आपके पास Firebase प्रोजेक्ट में हर महीने बिना किसी शुल्क के छह सीक्रेट हो सकते हैं.

डिफ़ॉल्ट रूप से, 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
PLANET=पृथ्वी

AUDIENCE=Humans

ऑडियंस=देव इंसान 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 सीएलआई, एक्सपोर्ट कमांड देता है जो कॉन्फ़िगरेशन को आउटपुट करता है आपकी डायरेक्ट्री की .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 का इस्तेमाल करना होगा, जैसा कि यहां दिखाया गया है 2nd gen पर अपग्रेड करें.

एनवायरमेंट का कॉन्फ़िगरेशन

सीएलआई की मदद से एनवायरमेंट कॉन्फ़िगरेशन सेट करना

आस-पास के डेटा को सेव करने के लिए, firebase functions:config:set का इस्तेमाल किया जा सकता है कमांड Firebase CLI में डालें. मिलते-जुलते कॉन्फ़िगरेशन को एक साथ ग्रुप करने के लिए, हर कुंजी को पीरियड का इस्तेमाल करके नेमस्पेस दिया जा सकता है. ध्यान रखें कि कुंजियों में सिर्फ़ छोटे अक्षर इस्तेमाल किए जा सकते हैं. बड़े अक्षरों का इस्तेमाल नहीं किया जा सकता.

उदाहरण के लिए, किसी दस्तावेज़ में Client-ID और API पासकोड "कुछ सेवा", तो आप चला सकते हैं:

firebase functions:config:set someservice.key="THE API KEY" someservice.id="THE CLIENT ID"

मौजूदा एनवायरमेंट कॉन्फ़िगरेशन को वापस पाना

अपने प्रोजेक्ट के लिए, एनवायरमेंट कॉन्फ़िगरेशन में फ़िलहाल क्या सेव है, यह देखने के लिए firebase functions:config:get का इस्तेमाल किया जा सकता है. इससे JSON कुछ ऐसा दिखेगा शामिल करें:

{
  "someservice": {
    "key":"THE API KEY",
    "id":"THE CLIENT ID"
  }
}

यह सुविधा इस पर आधारित है Google Cloud रनटाइम कॉन्फ़िगरेशन एपीआई.

किसी फ़ंक्शन में एनवायरमेंट कॉन्फ़िगरेशन को ऐक्सेस करने के लिए, functions.config का इस्तेमाल करना

कुछ कॉन्फ़िगरेशन, रिज़र्व किए गए firebase नेमस्पेस के तहत अपने-आप उपलब्ध होते हैं. एनवायरमेंट कॉन्फ़िगरेशन की सुविधा, आपकी दौड़ने की प्रोसेस में उपलब्ध होती है functions.config() के ज़रिए फ़ंक्शन किया गया. ऊपर दिए गए कॉन्फ़िगरेशन का इस्तेमाल करने के लिए, आपका कोड कुछ ऐसा दिख सकता है:

const functions = require('firebase-functions/v1');
const request = require('request-promise');

exports.userCreated = functions.database.ref('/users/{id}').onWrite(event => {
  let email = event.data.child('email').val();

  return request({
    url: 'https://someservice.com/api/some/call',
    headers: {
      'X-Client-ID': functions.config().someservice.id,
      'Authorization': `Bearer ${functions.config().someservice.key}`
    },
    body: {email: email}
  });
});

किसी मॉड्यूल को शुरू करने के लिए, एनवायरमेंट कॉन्फ़िगरेशन का इस्तेमाल करना

कुछ Node मॉड्यूल, बिना किसी कॉन्फ़िगरेशन के इस्तेमाल के लिए तैयार होते हैं. अन्य मॉड्यूल को अतिरिक्त की ज़रूरत है सही तरीके से शुरू करने के लिए कॉन्फ़िगरेशन. हमारा सुझाव है कि आप इस कॉन्फ़िगरेशन को हार्ड कोड करने के बजाय, एनवायरमेंट कॉन्फ़िगरेशन वैरिएबल में स्टोर करें. इससे, आपको अपने कोड को ज़्यादा आसानी से इस्तेमाल करने में मदद मिलती है. साथ ही, अपने ऐप्लिकेशन को ओपन सोर्स किया जा सकता है या प्रोडक्शन और स्टैजिंग वर्शन के बीच आसानी से स्विच किया जा सकता है.

उदाहरण के लिए, Slack Node SDK मॉड्यूल का इस्तेमाल करने के लिए, यह लिखा जा सकता है:

const functions = require('firebase-functions/v1');
const IncomingWebhook = require('@slack/client').IncomingWebhook;
const webhook = new IncomingWebhook(functions.config().slack.url);

डिप्लॉय करने से पहले, slack.url एनवायरमेंट कॉन्फ़िगरेशन वैरिएबल सेट करें:

firebase functions:config:set slack.url=https://hooks.slack.com/services/XXX

अन्य एनवायरमेंट कमांड

  • firebase functions:config:unset key1 key2, कॉन्फ़िगरेशन से चुनी गई कुंजियों को हटा देता है
  • firebase functions:config:clone --from <fromProject> किसी अन्य प्रोजेक्ट के एनवायरमेंट का क्लोन बनाता है मौजूदा चालू प्रोजेक्ट.

एनवायरमेंट वैरिएबल की जानकारी अपने-आप भरी गई

ऐसे एनवायरमेंट वैरिएबल होते हैं जो और स्थानीय तौर पर एम्युलेट किए गए फ़ंक्शन में शामिल हैं. इनमें Google Cloud से पॉप्युलेट होने वाले वैरिएबल के साथ-साथ, Firebase के लिए खास तौर पर बनाया गया एनवायरमेंट वैरिएबल भी शामिल है:

process.env.FIREBASE_CONFIG: यह Firebase प्रोजेक्ट कॉन्फ़िगरेशन की नीचे दी गई जानकारी देता है:

{
  databaseURL: 'https://databaseName.firebaseio.com',
  storageBucket: 'projectId.appspot.com',
  projectId: 'projectId'
}

Firebase शुरू करने पर, यह कॉन्फ़िगरेशन अपने-आप लागू हो जाता है बिना आर्ग्युमेंट वाला एडमिन SDK टूल. अगर आपको JavaScript में फ़ंक्शन लिख रहे हैं, इस तरह शुरू करें:

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

अगर आपको TypeScript में फ़ंक्शन लिखा जा रहा है, तो इस तरह से शुरू करें:

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

अगर आपको सेवा खाते के क्रेडेंशियल का इस्तेमाल करके, डिफ़ॉल्ट प्रोजेक्ट कॉन्फ़िगरेशन के साथ Admin SDK टूल को शुरू करना है, तो क्रेडेंशियल को किसी फ़ाइल से लोड करें और उन्हें FIREBASE_CONFIG में इस तरह जोड़ें:

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

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