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

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

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

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

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

Local Emulator Suite, असली Firebase प्रोजेक्ट और डेमो प्रोजेक्ट के इम्यूलेशन के साथ काम करता है.

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

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

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

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

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

डेमो

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

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

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

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

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

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

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

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

Kotlin
// 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().useEmulator(withHost: "localhost", port: 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

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

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

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

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

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

  • Realtime Database एम्युलेटर
  • Cloud Firestore एम्युलेटर
  • Authentication एम्युलेटर
  • Pub/Sub एम्युलेटर
  • Firebase Alerts Emulator

बैकग्राउंड इवेंट ट्रिगर करने के लिए, 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 Emulator से कनेक्ट हो जाते हैं. कॉन्फ़िगर करें 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, Remote Config, और 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 एम्युलेटर, इस्तेमाल के ज़्यादातर उदाहरणों के लिए प्रोडक्शन एनवायरमेंट के काफ़ी करीब है. हमने यह पक्का करने के लिए काफ़ी काम किया है कि नोड रनटाइम में मौजूद हर चीज़, प्रोडक्शन के ज़्यादा से ज़्यादा करीब हो. हालांकि, एम्युलेटर, कंटेनर में मौजूद पूरे प्रोडक्शन एनवायरमेंट की नकल नहीं करता है. इसलिए, आपका फ़ंक्शन कोड असल में काम करेगा. हालांकि, आपके एनवायरमेंट के अन्य पहलू (जैसे कि लोकल फ़ाइलें, फ़ंक्शन क्रैश होने के बाद का व्यवहार वगैरह) अलग-अलग होंगे.

Cloud IAM

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

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

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

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

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

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

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

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

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

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

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

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