Połącz swoją aplikację z emulatorem Cloud Functions

Przed połączeniem aplikacji z emulatorem Cloud Functions upewnij się, że rozumiesz ogólny przepływ pracy w pakiecie Firebase Local Emulator Suite , zainstaluj i skonfiguruj pakiet Local Emulator Suite oraz przejrzyj jego polecenia CLI .

Wybierz projekt Firebase

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

Aby wybrać projekt do użycia, przed uruchomieniem emulatorów, w CLI uruchom firebase use w swoim katalogu roboczym. Możesz też przekazać flagę --project do każdego polecenia emulatora.

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

Typ projektu Cechy Używaj z emulatorami
Prawdziwy

Prawdziwy projekt Firebase to taki, który utworzyłeś i skonfigurowałeś (najprawdopodobniej za pomocą konsoli Firebase).

Prawdziwe projekty mają aktywne zasoby, takie jak instancje baz danych, zasobniki pamięci, funkcje lub inne zasoby skonfigurowane dla tego projektu Firebase.

Pracując z prawdziwymi projektami Firebase, możesz uruchomić emulatory dla dowolnego lub wszystkich obsługiwanych produktów.

W przypadku wszystkich produktów, których nie emulujesz, Twoje aplikacje i kod będą wchodzić w interakcję z aktywnym zasobem (instancją bazy danych, zasobnikiem pamięci, funkcją itp.).

Próbny

Projekt demonstracyjny Firebase nie ma prawdziwej konfiguracji Firebase ani aktywnych zasobów. Dostęp do tych projektów można zwykle uzyskać za pośrednictwem ćwiczeń z programowania lub innych samouczków.

Identyfikatory projektów demonstracyjnych mają przedrostek demo- .

Podczas pracy z projektami demonstracyjnymi Firebase Twoje aplikacje i kod wchodzą w interakcję wyłącznie z emulatorami. Jeśli aplikacja podejmie próbę interakcji z zasobem, dla którego nie działa emulator, wykonanie kodu zakończy się niepowodzeniem.

W miarę możliwości zalecamy korzystanie z projektów demonstracyjnych. Korzyści obejmują:

  • Łatwiejsza konfiguracja, ponieważ możesz uruchomić emulatory bez tworzenia projektu Firebase
  • Większe bezpieczeństwo, ponieważ jeśli Twój kod przypadkowo wywoła nieemulowane zasoby (produkcyjne), nie ma szans na zmianę danych, wykorzystanie i rozliczenie
  • Lepsza obsługa w trybie offline, ponieważ nie ma potrzeby dostępu do Internetu, aby pobrać konfigurację SDK.

Instrumentuj swoją aplikację, aby komunikowała się z emulatorami

Instrumentuj swoją aplikację pod kątem funkcji wywoływalnych

Jeśli Twoje działania prototypowe i testowe obejmują wywoływalne funkcje zaplecza , skonfiguruj interakcję z emulatorem Cloud Functions for Firebase w następujący sposób:

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);
Szybki
Functions.functions().useFunctionsEmulator(origin: "http://127.0.0.1:5001")

Web modular API

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

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

Web namespaced API

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

Instrumentuj swoją aplikację pod kątem emulacji funkcji HTTPS

Każda funkcja HTTPS w Twoim kodzie będzie obsługiwana z lokalnego emulatora przy użyciu następującego 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

Instrumentuj aplikację pod kątem emulacji funkcji wyzwalanych w tle

Emulator Cloud Functions obsługuje funkcje uruchamiane w tle z następujących źródeł:

  • Emulator bazy danych czasu rzeczywistego
  • Emulator Cloud Firestore
  • Emulator uwierzytelniania
  • Emulator Pub/Sub

Aby wyzwalać zdarzenia w tle, zmodyfikuj zasoby zaplecza za pomocą interfejsu użytkownika pakietu Emulator Suite lub łącząc aplikację lub kod testowy z emulatorami za pomocą zestawu SDK dla swojej platformy.

Testuj procedury obsługi zdarzeń niestandardowych emitowanych przez rozszerzenia

W przypadku funkcji, które zaimplementowałeś do obsługi niestandardowych zdarzeń Firebase Extensions za pomocą Cloud Functions v2, emulator Cloud Functions łączy się w parę z emulatorem Eventarc, aby obsługiwać wyzwalacze Eventarc .

Aby przetestować niestandardowe procedury obsługi zdarzeń dla rozszerzeń emitujących zdarzenia, należy zainstalować emulatory Cloud Functions i Eventarc.

Środowisko wykonawcze Cloud Functions ustawia zmienną środowiskową EVENTARC_EMULATOR na localhost:9299 w bieżącym procesie, jeśli działa emulator Eventarc. Zestawy SDK Firebase Admin automatycznie łączą się z emulatorem Eventarc, gdy ustawiona jest zmienna środowiskowa EVENTARC_EMULATOR . Możesz zmodyfikować port domyślny, jak opisano w sekcji Konfigurowanie pakietu emulatorów lokalnych .

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

Możesz sprawdzić dzienniki funkcji w interfejsie użytkownika pakietu emulatora, aby uzyskać szczegółowe informacje na temat wykonywania procedury obsługi.

Skonfiguruj lokalne środowisko testowe

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

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

Na przykład projekt może zawierać te trzy pliki zawierające nieco inne wartości do celów programowania i testowania lokalnego:

.env .env.dev .env.local
PLANETA=Ziemia

PUBLICZNOŚĆ=Ludzie

PUBLICZNOŚĆ=Ludzie deweloperzy PUBLICZNOŚĆ=Lokalni ludzie

Po uruchomieniu w kontekście lokalnym emulator ładuje zmienne środowiskowe, jak pokazano:

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

Klucze tajne i dane uwierzytelniające w emulatorze Cloud Functions

Emulator Cloud Functions obsługuje używanie kluczy tajnych do przechowywania poufnych informacji konfiguracyjnych i uzyskiwania do nich dostępu . Domyślnie emulator będzie próbował uzyskać dostęp do sekretów produkcyjnych przy użyciu domyślnych poświadczeń aplikacji . W niektórych sytuacjach, takich jak środowiska CI, emulator może nie uzyskać dostępu do tajnych wartości z powodu ograniczeń uprawnień.

Podobnie jak w przypadku obsługi emulatorów Cloud Functions dla zmiennych środowiskowych, możesz zastąpić wartości kluczy tajnych, konfigurując plik .secret.local . Ułatwia to lokalne testowanie funkcji, szczególnie jeśli nie masz dostępu do tajnej wartości.

Jakie inne narzędzia do testowania funkcji Cloud istnieją?

Emulator Cloud Functions uzupełniają inne narzędzia prototypowe i testowe:

  • Powłoka Cloud Functions, która umożliwia interaktywne, iteracyjne prototypowanie i rozwój funkcji. Powłoka wykorzystuje do programowania emulator Cloud Functions z interfejsem w stylu REPL. Nie zapewnia się integracji z emulatorami Cloud Firestore ani Realtime Database. Korzystając z powłoki, kpisz z danych i wykonujesz wywołania funkcji w celu symulacji interakcji z produktami, których obecnie nie obsługuje pakiet Local Emulator Suite: Analytics, Remote Config i Crashlytics.
  • Zestaw SDK Firebase Test dla funkcji w chmurze, framework Node.js z mocha do tworzenia funkcji. W rezultacie pakiet SDK Cloud Functions Test zapewnia automatyzację na powłoce Cloud Functions.

Więcej informacji na temat powłoki Cloud Functions i pakietu SDK Cloud Functions Test SDK znajdziesz w artykułach Testuj funkcje interaktywnie i Testowanie jednostkowe Cloud Functions .

Czym emulator Cloud Functions różni się od wersji produkcyjnej

W większości przypadków emulator Cloud Functions jest dość zbliżony do środowiska produkcyjnego. Włożyliśmy wiele pracy, aby zapewnić, że wszystko w środowisku wykonawczym Node jest jak najbardziej zbliżone do wersji produkcyjnej. Jednak emulator nie naśladuje w pełni skonteneryzowanego środowiska produkcyjnego, więc chociaż kod funkcji będzie wykonywany realistycznie, inne aspekty środowiska (tj. pliki lokalne, zachowanie po awarii funkcji itp.) będą się różnić.

IAM w chmurze

Pakiet emulatora Firebase nie próbuje replikować ani szanować żadnych zachowań związanych z uprawnieniami podczas działania. Emulatory są zgodne z dostarczonymi regułami bezpieczeństwa Firebase, ale w sytuacjach, w których normalnie byłyby używane uprawnienia IAM, na przykład w celu ustawienia konta usługi wywołującej Cloud Functions, a tym samym uprawnień, emulator nie jest konfigurowalny i będzie korzystał z konta dostępnego globalnie na komputerze programisty, podobnie do bezpośredniego uruchamiania lokalnego skryptu.

Ograniczenia dotyczące pamięci i procesora

Emulator nie wymusza ograniczeń pamięci ani procesora dla Twoich funkcji. Jednak emulator obsługuje funkcje przekroczenia limitu czasu za pośrednictwem argumentu wykonawczego timeoutSeconds .

Należy pamiętać, że czas wykonania funkcji może różnić się od czasu produkcji, gdy funkcje są uruchamiane w emulatorze. Zalecamy, aby po zaprojektowaniu i przetestowaniu funkcji za pomocą emulatora przeprowadzić ograniczone testy w środowisku produkcyjnym w celu potwierdzenia czasu wykonania.

Planowanie różnic w środowisku lokalnym i produkcyjnym

Ponieważ emulator działa na komputerze lokalnym, jego działanie zależy od lokalnego środowiska aplikacji oraz wbudowanych programów i narzędzi.

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

  • Aplikacje instalowane lokalnie w celu symulacji środowiska produkcyjnego (np. ImageMagick z tego samouczka ) mogą różnić się zachowaniem od wersji produkcyjnej, szczególnie jeśli potrzebujesz innych wersji lub programujesz 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 , mkdir ) mogą różnić się od wersji dostępnych w wersji produkcyjnej, zwłaszcza jeśli programujesz w środowisku innym niż Linux (np. macOS). Można rozwiązać ten problem, stosując alternatywy dla poleceń natywnych przeznaczone wyłącznie dla węzła lub budując pliki binarne systemu Linux w celu dołączenia do wdrożenia.

Ponawiam próbę

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

Co następne?