अक्सर, आपको अपने फ़ंक्शन के लिए ज़्यादा कॉन्फ़िगरेशन की ज़रूरत होगी. जैसे, तीसरे पक्ष की एपीआई कुंजियां या ट्यून की जा सकने वाली सेटिंग. 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 Project’s
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 प्रोजेक्ट पर चालू है).
ये सभी मामलों में, उपयोगकर्ता के तय किए गए स्ट्रिंग पैरामीटर की तरह काम करते हैं. हालांकि, इनकी वैल्यू Firebase CLI को हमेशा पता होती है. इसलिए, डिप्लॉयमेंट के दौरान इनकी वैल्यू के लिए कभी भी कहा नहीं जाएगा और न ही इन्हें .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
फ़ाइल बनाएं, मनमुताबिक वैरिएबल जोड़ें, और डिप्लॉय करें:
अपनी
functions/
डायरेक्ट्री में.env
फ़ाइल बनाएं:# Directory layout: # my-project/ # firebase.json # functions/ # .env # package.json # index.js
बदलाव करने के लिए
.env
फ़ाइल खोलें और अपनी पसंद की कुंजियां जोड़ें. उदाहरण के लिए:PLANET=Earth AUDIENCE=Humans
फ़ंक्शन डिप्लॉय करें और पुष्टि करें कि एनवायरमेंट वैरिएबल लोड किए गए हैं:
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=Earth
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_TIMEOUT_SEC
- FUNCTION_IDENTITY
- FUNCTION_REGION
- FUNCTION_TARGET
- FUNCTION_SIGNATURE_TYPE
- K_SERVICE
- K_REVISION
- पोर्ट
- K_CONFIGURATION
कॉन्फ़िगरेशन की संवेदनशील जानकारी सेव और ऐक्सेस करना
.env
फ़ाइलों में सेव किए गए एनवायरमेंट वैरिएबल का इस्तेमाल, फ़ंक्शन के कॉन्फ़िगरेशन के लिए किया जा सकता है. हालांकि, आपको उन्हें डेटाबेस क्रेडेंशियल या एपीआई पासकोड जैसी संवेदनशील जानकारी को सेव करने का सुरक्षित तरीका नहीं मानना चाहिए. यह खास तौर पर तब ज़रूरी होता है, जब सोर्स कंट्रोल में .env
फ़ाइलों की जांच की जाती है.
कॉन्फ़िगरेशन की संवेदनशील जानकारी को सेव करने में आपकी मदद करने के लिए, Cloud Functions for Firebase Google Cloud के साथ इंटिग्रेट होता है Secret Manager. एन्क्रिप्ट की गई यह सेवा, कॉन्फ़िगरेशन वैल्यू को सुरक्षित तरीके से सेव करती है. साथ ही, ज़रूरत पड़ने पर, आपके फ़ंक्शन से आसानी से ऐक्सेस की जा सकती है.
सीक्रेट बनाना और उसका इस्तेमाल करना
सीक्रेट बनाने के लिए, Firebase सीएलआई का इस्तेमाल करें.
गुप्त पासकोड बनाने और उसका इस्तेमाल करने के लिए:
अपनी लोकल प्रोजेक्ट डायरेक्ट्री के रूट से, यह कमांड चलाएं:
firebase functions:secrets:set SECRET_NAME
SECRET_NAME के लिए कोई वैल्यू डालें.
सीएलआई, 'कार्रवाई पूरी हो गई' मैसेज दिखाता है और चेतावनी देता है कि बदलाव लागू होने के लिए, आपको फ़ंक्शन डिप्लॉय करने होंगे.
डिप्लॉय करने से पहले, पक्का करें कि आपके फ़ंक्शन कोड में,
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 });
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 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
|
PLANET=Earth
AUDIENCE=Humans |
AUDIENCE=Dev Humans | AUDIENCE=Local Humans |
स्थानीय संदर्भ में शुरू होने पर, एमुलेटर, एनवायरमेंट वैरिएबल को इस तरह लोड करता है:
$ 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
का इस्तेमाल करना होगा. इस बारे में ज़्यादा जानकारी के लिए, दूसरे जनरेशन पर अपग्रेड करें लेख पढ़ें.
एनवायरमेंट कॉन्फ़िगरेशन
सीएलआई की मदद से एनवायरमेंट कॉन्फ़िगरेशन सेट करना
एनवायरमेंट डेटा को सेव करने के लिए, Firebase CLI में firebase functions:config:set
कमांड का इस्तेमाल किया जा सकता है.
मिलते-जुलते कॉन्फ़िगरेशन को एक साथ ग्रुप करने के लिए, हर कुंजी को पीरियड का इस्तेमाल करके नेमस्पेस दिया जा सकता है. ध्यान रखें कि कुंजियों में सिर्फ़ छोटे अक्षर इस्तेमाल किए जा सकते हैं. बड़े अक्षरों का इस्तेमाल नहीं किया जा सकता.
उदाहरण के लिए, "कुछ सेवा" के लिए क्लाइंट आईडी और एपीआई पासकोड सेव करने के लिए, यह तरीका अपनाएं:
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 Runtime Configuration API पर आधारित है.
किसी फ़ंक्शन में एनवायरमेंट कॉन्फ़िगरेशन को ऐक्सेस करने के लिए, 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 Admin 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);