अपने ऐप्लिकेशन को Cloud Functions एम्युलेटर से कनेक्ट करें

अपने ऐप्लिकेशन को Cloud Functions एमुलेटर से कनेक्ट करने से पहले, पक्का करें कि आपने Firebase Local Emulator Suite के पूरे वर्कफ़्लो को समझ लिया हो. साथ ही, आपने Local Emulator Suite को इंस्टॉल और कॉन्फ़िगर कर लिया हो और इसके सीएलआई कमांड की समीक्षा कर ली हो.

कोई Firebase प्रोजेक्ट चुनना

Firebase Local Emulator Suite, किसी एक Firebase प्रोजेक्ट के लिए प्रॉडक्ट को एमुलेट करता है.

इस्तेमाल करने के लिए प्रोजेक्ट चुनने के लिए, एमुलेटर शुरू करने से पहले, अपनी वर्किंग डायरेक्ट्री में सीएलआई में firebase use चलाएं. इसके अलावा, हर एमुलेटर कमांड के लिए --project फ़्लैग पास किया जा सकता है.

Local Emulator Suite, असल Firebase प्रोजेक्ट और डेमो प्रोजेक्ट को एमुलेट करता है.

प्रोजेक्ट का टाइप सुविधाएं एम्युलेटर के साथ इस्तेमाल करना
रीयल

असल Firebase प्रोजेक्ट वह होता है जिसे आपने बनाया और कॉन्फ़िगर किया है. ऐसा ज़्यादातर मामलों में, Firebase कंसोल के ज़रिए किया जाता है.

असल प्रोजेक्ट में लाइव रिसॉर्स होते हैं. जैसे, डेटाबेस इंस्टेंस, स्टोरेज बकेट, फ़ंक्शन या कोई भी ऐसा रिसॉर्स जिसे आपने उस Firebase प्रोजेक्ट के लिए सेट अप किया है.

असल Firebase प्रोजेक्ट के साथ काम करते समय, किसी भी या सभी काम करने वाले प्रॉडक्ट के लिए इम्युलेटर चलाए जा सकते हैं.

जिन प्रॉडक्ट को एमुलेट नहीं किया जा रहा है उनके लिए, आपके ऐप्लिकेशन और कोड, लाइव रिसॉर्स (डेटाबेस इंस्टेंस, स्टोरेज बकेट, फ़ंक्शन वगैरह) के साथ इंटरैक्ट करेंगे.

डेमो

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

डेमो प्रोजेक्ट के प्रोजेक्ट आईडी में demo- प्रीफ़िक्स होता है.

डेमो Firebase प्रोजेक्ट के साथ काम करते समय, आपके ऐप्लिकेशन और कोड, सिर्फ़ एमुलेटर के साथ इंटरैक्ट करते हैं. अगर आपका ऐप्लिकेशन किसी ऐसे संसाधन के साथ इंटरैक्ट करने की कोशिश करता है जिसका कोई एमुलेटर नहीं चल रहा है, तो वह कोड काम नहीं करेगा.

हमारा सुझाव है कि जहां भी हो सके वहां डेमो प्रोजेक्ट का इस्तेमाल करें. इसके ये फ़ायदे हैं:

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

एमुलेटर से बात करने के लिए, अपने ऐप्लिकेशन को इंस्ट्रूमेंट करना

कॉल किए जा सकने वाले फ़ंक्शन के लिए अपने ऐप्लिकेशन को इंस्ट्रूमेंट करना

अगर आपके प्रोटोटाइप और टेस्ट गतिविधियों में कॉल किए जा सकने वाले बैकएंड फ़ंक्शन शामिल हैं, तो Cloud Functions for Firebase एमुलेटर के साथ इंटरैक्शन को इस तरह कॉन्फ़िगर करें:

Kotlin+KTX
// 10.0.2.2 is the special IP address to connect to the 'localhost' of
// the host computer from an Android emulator.
val functions = Firebase.functions
functions.useEmulator("10.0.2.2", 5001)
Java
// 10.0.2.2 is the special IP address to connect to the 'localhost' of
// the host computer from an Android emulator.
FirebaseFunctions functions = FirebaseFunctions.getInstance();
functions.useEmulator("10.0.2.2", 5001);
Swift
Functions.functions().useFunctionsEmulator(origin: "http://127.0.0.1:5001")

Web

import { getApp } from "firebase/app";
import { getFunctions, connectFunctionsEmulator } from "firebase/functions";

const functions = getFunctions(getApp());
connectFunctionsEmulator(functions, "127.0.0.1", 5001);

Web

firebase.functions().useEmulator("127.0.0.1", 5001);

एचटीटीपीएस फ़ंक्शन के इम्यूलेशन के लिए, अपने ऐप्लिकेशन को इंस्ट्रूमेंट करना

आपके कोड में मौजूद हर एचटीटीपीएस फ़ंक्शन, स्थानीय एमुलेटर से इस यूआरएल फ़ॉर्मैट का इस्तेमाल करके दिखाया जाएगा:

http://$HOST:$PORT/$PROJECT/$REGION/$NAME

उदाहरण के लिए, डिफ़ॉल्ट होस्ट पोर्ट और क्षेत्र के साथ एक साधारण helloWorld फ़ंक्शन यहां दिखाया जाएगा:

https://localhost:5001/$PROJECT/us-central1/helloWorld

टास्क की सूची के फ़ंक्शन को एमुलेट करने के लिए, अपने ऐप्लिकेशन को इंस्ट्रूमेंट करना

एमुलेटर, ट्रिगर की परिभाषाओं के आधार पर, एमुलेट किए गए टास्क की सूचियों को अपने-आप सेट अप करता है. अगर एडमिन SDK टूल को पता चलता है कि वह CLOUD_TASKS_EMULATOR_HOST एनवायरमेंट वैरिएबल के ज़रिए चल रहा है, तो वह सूची में शामिल अनुरोधों को एमुलेटर पर रीराउंड करता है.

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

बैकग्राउंड में ट्रिगर होने वाले फ़ंक्शन को एमुलेट करने के लिए, अपने ऐप्लिकेशन को इंस्ट्रूमेंट करना

Cloud Functions एमुलेटर, इन सोर्स से बैकग्राउंड में ट्रिगर होने वाले फ़ंक्शन के साथ काम करता है:

  • Realtime Database एम्युलेटर
  • Cloud Firestore एम्युलेटर
  • Authentication एम्युलेटर
  • Pub/Sub एम्युलेटर
  • Firebase सूचना एमुलेटर

बैकग्राउंड इवेंट ट्रिगर करने के लिए, Emulator Suite UI का इस्तेमाल करके बैक-एंड संसाधनों में बदलाव करें. इसके अलावा, अपने प्लैटफ़ॉर्म के लिए SDK टूल का इस्तेमाल करके, अपने ऐप्लिकेशन या टेस्ट कोड को एमुलेटर से कनेक्ट करें.

एक्सटेंशन से उत्सर्जित कस्टम इवेंट के लिए हैंडलर की जांच करना

Cloud Functions v2 के साथ Firebase Extensions कस्टम इवेंट मैनेज करने के लिए लागू किए गए फ़ंक्शन के लिए, Cloud Functions एमुलेटर, Eventarc ट्रिगर के साथ काम करने के लिए, Eventarc एमुलेटर के साथ जोड़ा जाता है.

इवेंट उत्सर्जित करने वाले एक्सटेंशन के लिए कस्टम इवेंट हैंडलर की जांच करने के लिए, आपको Cloud Functions और Eventarc इम्युलेटर इंस्टॉल करने होंगे.

अगर Eventarc एमुलेटर चल रहा है, तो Cloud Functions रनटाइम, मौजूदा प्रोसेस में EVENTARC_EMULATOR एनवायरमेंट वैरिएबल को localhost:9299 पर सेट करता है. EVENTARC_EMULATOR एनवायरमेंट वैरिएबल सेट होने पर, Firebase Admin SDK अपने-आप Eventarc एमुलेटर से कनेक्ट हो जाते हैं. Local Emulator Suite कॉन्फ़िगर करें में बताए गए तरीके से, डिफ़ॉल्ट पोर्ट में बदलाव किया जा सकता है.

जब एनवायरमेंट वैरिएबल सही तरीके से कॉन्फ़िगर किए जाते हैं, तो Firebase Admin SDK Eventarc एमुलेटर को इवेंट अपने-आप भेजता है. इसके बाद, Eventarc एमुलेटर, रजिस्टर किए गए किसी भी हैंडलर को ट्रिगर करने के लिए, Cloud Functions एमुलेटर को कॉलबैक करता है.

हैंडलर के चालू होने की जानकारी के लिए, Emulator Suite UI में फ़ंक्शन लॉग देखे जा सकते हैं.

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

अगर आपके फ़ंक्शन, dotenv पर आधारित एनवायरमेंट कॉन्फ़िगरेशन पर निर्भर हैं, तो अपने स्थानीय टेस्टिंग एनवायरमेंट में उस व्यवहार को एमुलेट किया जा सकता है.

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

Cloud Functions की जांच करने के लिए कौनसे अन्य टूल मौजूद हैं?

Cloud Functions एमुलेटर के साथ, प्रोटोटाइप और जांच करने वाले अन्य टूल भी काम करते हैं:

  • Cloud Functions शेल, जो इंटरैक्टिव और बार-बार इस्तेमाल होने वाले फ़ंक्शन के प्रोटोटाइप बनाने और उन्हें डेवलप करने की सुविधा देता है. डेवलपमेंट के लिए, शेल में REPL-स्टाइल इंटरफ़ेस के साथ Cloud Functions एमुलेटर का इस्तेमाल किया जाता है. Cloud Firestore या Realtime Database एमुलेटर के साथ कोई इंटिग्रेशन नहीं दिया जाता. शेल का इस्तेमाल करके, डेटा को मॉक किया जा सकता है और फ़ंक्शन कॉल किए जा सकते हैं. इससे उन प्रॉडक्ट के साथ इंटरैक्शन को सिम्युलेट किया जा सकता है जिनके साथ फ़िलहाल Local Emulator Suite काम नहीं करता: Analytics, रिमोट कॉन्फ़िगरेशन, और Crashlytics.
  • Cloud Functions के लिए Firebase Test SDK टूल, फ़ंक्शन डेवलप करने के लिए mocha फ़्रेमवर्क वाला Node.js. असल में, Cloud Functions Test SDK, Cloud Functions शेल के ऊपर ऑटोमेशन की सुविधा देता है.

Cloud Functions शेल और Cloud Functions Test SDK के बारे में ज़्यादा जानने के लिए, इंटरैक्टिव तरीके से फ़ंक्शन की जांच करना और Cloud Functions की यूनिट टेस्टिंग लेख पढ़ें.

Cloud Functions एमुलेटर, प्रोडक्शन से कैसे अलग है

ज़्यादातर मामलों में, Cloud Functions एमुलेटर, प्रोडक्शन एनवायरमेंट के काफ़ी करीब होता है. हमने इस बात पर काफ़ी काम किया है कि Node रनटाइम में मौजूद सभी चीज़ें, प्रोडक्शन के ज़्यादा से ज़्यादा करीब हों. हालांकि, एमुलेटर, पूरी तरह से कंटेनर वाले प्रोडक्शन एनवायरमेंट की नकल नहीं करता. इसलिए, आपका फ़ंक्शन कोड सही तरीके से काम करेगा, लेकिन आपके एनवायरमेंट के अन्य पहलू (जैसे, लोकल फ़ाइलें, फ़ंक्शन क्रैश होने के बाद का व्यवहार वगैरह) अलग-अलग होंगे.

Cloud IAM

Firebase Emulator Suite, रन करने के लिए IAM से जुड़े किसी भी व्यवहार को दोहराने या उसका पालन करने की कोशिश नहीं करता. एमुलेटर, Firebase के दिए गए सुरक्षा नियमों का पालन करते हैं. हालांकि, जिन स्थितियों में आम तौर पर IAM का इस्तेमाल किया जाता है, जैसे कि सेवा खाते को कॉल करने वाले Cloud Functions को सेट करने के लिए और इस तरह अनुमतियां देने के लिए, एमुलेटर को कॉन्फ़िगर नहीं किया जा सकता. साथ ही, यह सीधे तौर पर किसी लोकल स्क्रिप्ट को चलाने की तरह, आपकी डेवलपर मशीन पर दुनिया भर में उपलब्ध खाते का इस्तेमाल करेगा.

मेमोरी और प्रोसेसर से जुड़ी पाबंदियां

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

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

लोकल और प्रोडक्शन एनवायरमेंट में अंतर के लिए प्लान बनाना

एमुलेटर आपकी लोकल मशीन पर चलता है. इसलिए, ऐप्लिकेशन और पहले से मौजूद प्रोग्राम और सुविधाओं के लिए, यह आपके लोकल एनवायरमेंट पर निर्भर करता है.

ध्यान रखें कि Cloud Functions डेवलपमेंट के लिए आपका लोकल एनवायरमेंट, Google के प्रोडक्शन एनवायरमेंट से अलग हो सकता है:

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

  • इसी तरह, पहले से मौजूद सुविधाएं (जैसे, ls, mkdir जैसे शेल कमांड) प्रोडक्शन में उपलब्ध वर्शन से अलग हो सकती हैं. ऐसा खास तौर पर तब होता है, जब डेवलपमेंट किसी ऐसे एनवायरमेंट में किया जा रहा हो जो Linux के बजाय macOS जैसे किसी दूसरे ऑपरेटिंग सिस्टम पर काम करता हो. इस समस्या को हल करने के लिए, नेटिव कमांड के बजाय सिर्फ़ Node के विकल्पों का इस्तेमाल करें. इसके अलावा, डिप्लॉयमेंट के साथ बंडल करने के लिए, Linux बाइनरी बनाएं.

फिर से प्रयास कर रहा है

Cloud Functions एमुलेटर, फ़ंक्शन के काम न करने पर, उन्हें फिर से चलाने की सुविधा नहीं देता.

आगे क्या करना है?