अपने ऐप्लिकेशन को 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 में फ़ंक्शन लॉग देखे जा सकते हैं.

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

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

लोकल 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 टेस्ट SDK टूल. यह फ़ंक्शन डेवलपमेंट के लिए मोका फ़्रेमवर्क के साथ 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 एमुलेटर, फ़ंक्शन के काम न करने पर, उन्हें फिर से चलाने की सुविधा नहीं देता.

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