Łączenie aplikacji z emulatorem Cloud Functions

Zanim połączysz aplikację z emulatorem Cloud Functions, upewnij się, że rozumiesz ogólny przepływ pracy Firebase Local Emulator Suite, zainstaluj i skonfiguruj Local Emulator Suite oraz zapoznaj się z jego poleceniami CLI.

Wybieranie projektu w Firebase

Firebase Local Emulator Suite emuluje produkty dla pojedynczego projektu w Firebase.

Aby wybrać projekt, którego chcesz używać, przed uruchomieniem emulatorów wpisz w CLI polecenie firebase use w katalogu roboczym. Możesz też przekazać flagę --project do każdego polecenia emulatora.

Local Emulator Suite obsługuje emulację rzeczywistych projektów Firebase i demonstracyjnych projektów.

Typ projektu Funkcje Użycie z emulatorami
Rzeczywisty

Rzeczywisty projekt w Firebase to projekt, który został utworzony i skonfigurowany (najprawdopodobniej w Firebase konsoli).

Rzeczywiste projekty mają aktywne zasoby, takie jak instancje bazy danych, zasobniki pamięci buckets, funkcje lub inne zasoby skonfigurowane w tym projekcie Firebase project.

Podczas pracy z rzeczywistymi projektami Firebase możesz uruchamiać emulatory dla dowolnej lub wszystkich obsługiwanych usług.

W przypadku usług, które nie są emulowane, Twoje aplikacje i kod będą wchodzić w interakcje z aktywnym zasobem (instancją bazy danych, zasobnikiem pamięci, funkcją itp.).

Demonstracyjny

Demonstracyjny projekt w Firebase nie ma rzeczywistej konfiguracji Firebase ani aktywnych zasobów. Dostęp do tych projektów jest zwykle uzyskiwany za pomocą warsztatów programistycznych lub innych samouczków.

Identyfikatory projektów demonstracyjnych mają prefiks demo-.

Podczas pracy z demonstracyjnymi projektami Firebase Twoje aplikacje i kod wchodzą w interakcje z emulatorami tylko. Jeśli aplikacja spróbuje wejść w interakcję z zasobem dla którego nie jest uruchomiony emulator, kod zakończy się niepowodzeniem.

Jeśli to możliwe, zalecamy używanie projektów demonstracyjnych. W ten sposób możesz zapewnić im dostęp do tych korzyści:

  • Łatwiejsza konfiguracja, ponieważ możesz uruchamiać emulatory bez tworzenia projektu w Firebase.
  • Większe bezpieczeństwo, ponieważ jeśli Twój kod przypadkowo wywoła nieemulowane (produkcyjne) zasoby, nie będzie możliwości zmiany danych, użycia ani rozliczenia.
  • Lepsza obsługa offline, ponieważ nie musisz uzyskiwać dostępu do internetu, aby pobrać konfigurację pakietu SDK.

Instrumentowanie aplikacji do komunikacji z emulatorami

Instrumentowanie aplikacji pod kątem funkcji wywoływalnych

Jeśli prototypowanie i testowanie obejmuje wywoływane funkcje backendu, skonfiguruj interakcję z Cloud Functions for Firebase emulatorem w ten sposób:

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);

Instrumentowanie aplikacji pod kątem emulacji funkcji HTTPS

Każda funkcja HTTPS w Twoim kodzie będzie obsługiwana przez emulator lokalny przy użyciu tego formatu adresu URL:

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

Na przykład prosta funkcja helloWorld z domyślnym portem hosta i regionem będzie obsługiwana pod adresem:

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

Instrumentowanie aplikacji pod kątem emulacji funkcji kolejki zadań

Emulator automatycznie konfiguruje emulowane kolejki zadań na podstawie definicji aktywatorów, a pakiet Admin SDK przekierowuje żądania w kolejce do emulatora, jeśli wykryje, że jest on uruchomiony za pomocą zmiennej środowiskowej CLOUD_TASKS_EMULATOR_HOST.

Pamiętaj, że system wysyłania używany w środowisku produkcyjnym jest bardziej złożony niż ten zaimplementowany w emulatorze, więc nie należy oczekiwać, że emulowane zachowanie będzie dokładnie odzwierciedlać środowiska produkcyjne. Parametry w emulatorze określają górne granice szybkości, z jaką zadania są wysyłane i ponawiane.

Instrumentowanie aplikacji pod kątem emulacji funkcji wywoływanych w tle

Emulator Cloud Functions obsługuje funkcje wywoływane w tle z tych źródeł:

  • Realtime Database emulator
  • Cloud Firestore emulator
  • Authentication emulator
  • emulator Pub/Sub
  • emulatora alertów Firebase.

Aby wywołać zdarzenia w tle, zmodyfikuj zasoby backendu za pomocą Emulator Suite UI, lub połącz aplikację bądź kod testowy z emulatorami za pomocą pakietu SDK dla swojej platformy.

Testowanie modułów obsługi zdarzeń niestandardowych emitowanych przez rozszerzenia

W przypadku funkcji, które implementujesz do obsługi Firebase Extensions zdarzeń niestandardowych za pomocą Cloud Functions w wersji 2, emulator Cloud Functions jest sparowany z emulatorem Eventarc, aby obsługiwać aktywatory Eventarc.

Aby testować moduły obsługi zdarzeń niestandardowych w przypadku rozszerzeń, które emitują zdarzenia, musisz zainstalować emulatory Cloud Functions i Eventarc.

Jeśli emulator Eventarc jest uruchomiony, środowisko wykonawcze Cloud Functions ustawia zmienną środowiskową EVENTARC_EMULATOR na localhost:9299 w bieżącym procesie. Pakiety Firebase Admin SDK automatycznie łączą się z emulatorem Eventarc , gdy ustawiona jest zmienna środowiskowa EVENTARC_EMULATOR. Domyślny port możesz zmienić zgodnie z opisem w sekcji Konfigurowanie Local Emulator Suite.

Gdy zmienne środowiskowe są prawidłowo skonfigurowane, Firebase Admin SDK automatycznie wysyła zdarzenia do emulatora Eventarc. Z kolei emulator Eventarc wywołuje emulator Cloud Functions, aby wywołać zarejestrowane moduły obsługi.

Szczegółowe informacje o wykonywaniu modułów obsługi znajdziesz w logach funkcji w Emulator Suite UI w celu uzyskania szczegółowych informacji o wykonywaniu modułów obsługi.

Konfigurowanie lokalnego środowiska testowego

Jeśli Twoje funkcje korzystają z konfiguracji środowiska opartej na dotenv , możesz emulować to zachowanie w lokalnym środowisku testowym.

Gdy używasz lokalnego Cloud Functions emulatora, możesz zastąpić zmienne środowiskowe projektu, konfigurując plik .env.local. Zawartość pliku .env.local ma pierwszeństwo przed plikiem .env i plikiem .env specyficznym dla projektu.

Na przykład projekt może zawierać te 3 pliki z nieco innymi wartościami na potrzeby programowania i testowania lokalnego:

.env .env.dev .env.local
PLANET=Earth

AUDIENCE=Humans

AUDIENCE=Dev Humans AUDIENCE=Local Humans

Po uruchomieniu w kontekście lokalnym emulator wczytuje zmienne środowiskowe w ten sposób:

  $ firebase emulators:start
  i  emulators: Starting emulators: functions
  # Starts emulator with following environment variables:
  #  PLANET=Earth
  #  AUDIENCE=Local Humans

Utajnione informacje i dane logowania w emulatorze Cloud Functions

Emulator Cloud Functions obsługuje używanie utajnionych informacji do przechowywania poufnych informacji o konfiguracji i uzyskiwania do nich dostępu. Domyślnie emulator będzie próbował uzyskać dostęp do utajnionych informacji produkcyjnych za pomocą domyślnych danych logowania aplikacji. W niektórych sytuacjach, np. w środowiskach CI, emulator może nie mieć dostępu do wartości utajnionych informacji z powodu ograniczeń uprawnień.

Podobnie jak w przypadku obsługi zmiennych środowiskowych przez emulator Cloud Functions, możesz zastąpić wartości utajnionych informacji, konfigurując plik .secret.local. Ułatwia to testowanie funkcji lokalnie, zwłaszcza jeśli nie masz dostępu do wartości utajnionych informacji.

Jakie inne narzędzia do testowania Cloud Functions są dostępne?

Emulator Cloud Functions jest uzupełniany przez inne narzędzia do prototypowania i testowania:

  • Powłoka Cloud Functions, która umożliwia interaktywne, iteracyjne prototypowanie i programowanie funkcji. Powłoka używa emulatora Cloud Functions z interfejsem w stylu REPL do programowania. Nie jest zapewniona integracja z emulatorami Cloud Firestore ani Realtime Database. Za pomocą powłoki możesz symulować dane i wykonywać wywołania funkcji, aby symulować interakcje z usługami, których Local Emulator Suiteobecnie nie obsługuje: Analytics, Zdalna konfiguracja i Crashlytics.
  • Firebase Test SDK for Cloud Functions, czyli Node.js z frameworkiem mocha do programowania funkcji. W efekcie pakiet Cloud Functions Test SDK zapewnia automatyzację na podstawie powłoki Cloud Functions.

Więcej informacji o powłoce Cloud Functions i pakiecie Cloud Functions Test SDK znajdziesz w artykułach Testowanie funkcji interaktywnie i Testowanie jednostkowe Cloud Functions.

Różnice między emulatorem Cloud Functions a środowiskiem produkcyjnym

Emulator Cloud Functions jest dość zbliżony do środowiska produkcyjnego w większości przypadków. Dołożyliśmy wszelkich starań, aby wszystko w środowisku wykonawczym Node było jak najbardziej zbliżone do środowiska produkcyjnego. Emulator nie naśladuje jednak pełnego środowiska produkcyjnego w kontenerze, więc chociaż kod funkcji będzie wykonywany realistycznie, inne aspekty środowiska (np. pliki lokalne, zachowanie po awarii funkcji itp.) będą się różnić.

Cloud IAM

Pakiet emulatorów Firebase nie próbuje replikować ani respektować żadnych zachowań związanych z IAM. Emulatory przestrzegają podanych reguł zabezpieczeń Firebase, ale w sytuacjach, w których normalnie używany byłby IAM, np. do ustawienia konta usługi wywołującej Cloud Functions, a tym samym uprawnień, emulator nie jest konfigurowalny i będzie używać globalnie dostępnego konta na komputerze dewelopera, podobnie jak w przypadku bezpośredniego uruchamiania skryptu lokalnego.

Ograniczenia dotyczące pamięci i procesora

Emulator nie wymusza ograniczeń dotyczących pamięci ani procesora w przypadku Twoich funkcji. Emulator obsługuje jednak przekroczenie limitu czasu funkcji za pomocą argumentu środowiska wykonawczego timeoutSeconds.

Pamiętaj, że czas wykonywania funkcji może się różnić od czasu w środowisku produkcyjnym, gdy funkcje są uruchamiane w emulatorze. Zalecamy, aby po zaprojektowaniu i przetestowaniu funkcji za pomocą emulatora przeprowadzić ograniczone testy w środowisku produkcyjnym, aby potwierdzić czasy wykonywania.

Planowanie różnic między środowiskami lokalnymi i produkcyjnymi

Emulator działa na komputerze lokalnym, więc zależy od lokalnego środowiska aplikacji oraz wbudowanych programów i narzędzi.

Pamiętaj, że Twoje lokalne środowisko programistyczne dla Cloud Functions może różnić się od środowiska produkcyjnego Google:

  • Aplikacje instalowane lokalnie w celu symulowania środowiska produkcyjnego (np. ImageMagick z tego samouczka) mogą się różnić zachowaniem od środowiska produkcyjnego, zwłaszcza jeśli wymagają innej wersji lub są rozwijane w środowisku innym niż Linux. Rozważ wdrożenie własnej kopii binarnej brakującego programu wraz z wdrożeniem funkcji.

  • Podobnie wbudowane narzędzia (np. polecenia powłoki takie jak ls czy mkdir) mogą się różnić od wersji dostępnych w środowisku produkcyjnym, zwłaszcza jeśli programujesz w środowisku innym niż Linux (np. macOS). Możesz rozwiązać ten problem, używając alternatyw dla poleceń natywnych, które działają tylko w Node, lub tworząc pliki binarne Linuksa, które można dołączyć do wdrożenia.

Ponawiam próbę

Emulator Cloud Functions nie obsługuje ponawiania prób w przypadku niepowodzenia funkcji.

Co dalej?

  • Zestaw wyselekcjonowanych filmów i szczegółowych instrukcji z przykładami znajdziesz na playliście szkoleń na temat emulatorów Firebase.
  • Więcej informacji o emulatorze Cloud Functions for Firebase znajdziesz w artykule Uruchamianie funkcji lokalnie.