Łączenie aplikacji z emulatorem Cloud Functions

Zanim połączysz aplikację z emulatorem Cloud Functions, poznaj ogólny przepływ pracy Firebase Local Emulator Suite oraz zainstaluj i skonfiguruj Local Emulator Suite oraz przejrzyj jego polecenia interfejsu wiersza poleceń.

Wybieranie projektu Firebase

Funkcja Firebase Local Emulator Suite emuluje produkty z jednego projektu Firebase.

Aby wybrać projekt do użycia, przed uruchomieniem emulatorów uruchom interfejs wiersza poleceń firebase use w katalogu roboczym. Możesz też przekazać parametr --project do każdego polecenia emulatora.

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

Typ projektu Funkcje Używanie z emulatorami
Real

Prawdziwy projekt Firebase to projekt utworzony i skonfigurowany przez Ciebie (najprawdopodobniej za pomocą konsoli Firebase).

Rzeczywiste projekty mają aktywne zasoby, takie jak instancje bazy danych, zasobniki na dane, funkcje lub inne zasoby skonfigurowane dla danego projektu Firebase.

Podczas pracy z prawdziwymi projektami Firebase możesz uruchomić emulatory dowolnej lub wszystkich obsługiwanych usług.

W przypadku usług, których nie emulujesz, aplikacje i kod będą współdziałać z aktywnym zasobem (instancją bazy danych, zasobnikiem na dane, funkcją itp.).

Wersja demonstracyjna

Projekt demonstracyjny Firebase nie ma rzeczywistej konfiguracji Firebase ani aktywnych zasobów. Dostęp do tych projektów uzyskuje się zwykle w ramach ćwiczeń z programowania lub innych samouczków.

Identyfikatory projektów demonstracyjnych mają prefiks demo-.

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

Zalecamy, aby w miarę możliwości korzystać z 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 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, ich użycia ani rozliczenia.
  • Lepsza obsługa offline – nie musisz łączyć się z internetem, aby pobrać konfigurację pakietu SDK.

Dostosuj aplikację do emulatorów

Instrumentowanie aplikacji pod kątem wywoływalnych funkcji

Jeśli w prototypie i testach występują wyzwalane funkcje zaplecza, skonfiguruj interakcję z emulatorem Cloud Functions for Firebase w ten 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);
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);

Dostosuj aplikację do emulacji funkcji HTTPS

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

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

Na przykład prosta funkcja helloWorld z domyślnym portem i regionem hosta jest obsługiwana w tym miejscu:

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

Dostosuj aplikację do emulacji funkcji kolejki zadań

Na podstawie definicji wyzwalaczy emulator automatycznie konfiguruje kolejki zadań emulowanych, a pakiet Admin SDK przekierowuje oczekujące żądania do emulatora, jeśli wykryje, że działa on za pomocą zmiennej środowiska CLOUD_TASKS_EMULATOR_HOST.

Pamiętaj, że system wysyłania używany w produkcji jest bardziej złożony niż ten zaimplementowany w emulatorze, więc nie należy oczekiwać, że emulowane działanie będzie dokładnie odzwierciedlać środowisko produkcyjne. Parametry w emulatorze określają górną granicę szybkości, z jaką zadania są wysyłane i powtarzane.

Emulacja 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
  • Emulator usługi Authentication
  • Emulator usługi Pub/Sub
  • Emulator alertów Firebase

Aby aktywować zdarzenia w tle, zmodyfikuj zasoby backendu za pomocą Emulator Suite UI albo połącz aplikację lub przetestuj kod z emulatorami, korzystając z pakietu SDK przeznaczonego na Twoją platformę.

testowanie obsługi zdarzeń niestandardowych emitowanych przez rozszerzenia.

W przypadku funkcji implementowanych do obsługi zdarzeń niestandardowych Firebase Extensions w wersji 2.0 Cloud Functions emuluje emulację Cloud Functions z emulacją Eventarc, aby obsługiwać aktywatorów Eventarc.

Aby przetestować obsługę zdarzeń niestandardowych w przypadku rozszerzeń, które emitują zdarzenia, musisz zainstalować emulatory Cloud Functions i Eventarc.

Jeśli emulowany jest emulator Eventarc, środowisko wykonawcze Cloud Functions ustawia zmienną środowiskową EVENTARC_EMULATOR na localhost:9299 w bieżącym procesie. Gdy skonfigurowana jest zmienna środowiskowa EVENTARC_EMULATOR, Firebase Admin SDK automatycznie łączy się z emulatorem Eventarc. Możesz zmienić domyślny port zgodnie z instrukcjami w sekcji Konfigurowanie Local Emulator Suite.

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

Szczegółowe informacje o wykonywaniu funkcji znajdziesz w logach funkcji w Emulator Suite UI.

Konfigurowanie lokalnego środowiska testowego

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

Korzystając z lokalnego emulatora Cloud Functions, możesz zastąpić zmienne środowiskowe w projekcie, konfigurując plik .env.local. Treści pliku .env.local mają pierwszeństwo przed plikiem .env i plikiem .env dotyczącym projektu.

Projekt może np. zawierać te 3 pliki zawierające nieco inne wartości na potrzeby testów programistycznych i lokalnych:

.env .env.dev .env.local
PLANET=Ziemia

AUDIENCE=Ludzie

AUDIENCE=Dev Humans AUDIENCE=Lokalni ludzie

Po uruchomieniu w kontekście lokalnym emulator wczytuje zmienne środowiskowe w następujący sposób:

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

Obiekty tajne i dane logowania w emulatorze Cloud Functions

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

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

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

Emulator Cloud Functions jest uzupełniony o inne narzędzia do tworzenia prototypów i testowania:

  • Powłoka Cloud Functions umożliwiająca tworzenie prototypów i programowanie interaktywnych funkcji iteracyjnych. W powłoce wykorzystywany jest emulator Cloud Functions z interfejsem w stylu REPL na potrzeby programowania. Nie ma integracji z emulatorami Cloud Firestore ani Realtime Database. Powłoka służy do przykładania danych i wykonywania wywołań funkcji, aby symulować interakcję z usługami, których Local Emulator Suite obecnie nie obsługuje: Analytics, Zdalna konfiguracja i Crashlytics.
  • Firebase Test SDK dla Cloud Functions – środowiska Node.js z platformą mokha do tworzenia funkcji. W efekcie pakiet SDK do testowania Cloud Functions zapewnia automatyzację na poziomie powłoki Cloud Functions.

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

Różnice między emulatorem Cloud Functions a wersją produkcyjną

W większości przypadków emulator Cloud Functions jest dość zbliżony do środowiska produkcyjnego. Dokładamy wszelkich starań, aby wszystko w środowisku wykonawczym węzła było jak najbardziej zbliżone do środowiska produkcyjnego. Emulator nie imituje jednak w pełni skonteneryzowanego środowiska produkcyjnego, więc o ile kod Twojej 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 odwzorowywać ani uwzględniać podczas działania żadnych zachowań związanych z IAM. Emulatory przestrzegają podanych reguł zabezpieczeń Firebase, jednak w sytuacjach, w których uprawnienia są zwykle używane, np. do ustawiania konta usługi Cloud Functions, a zatem uprawnień, emulatora nie można skonfigurować i używa on konta dostępnego globalnie na komputerze programisty, podobnie jak w przypadku bezpośredniego uruchomienia skryptu lokalnego.

Ograniczenia dotyczące pamięci i procesora

Emulator nie wymusza na Twoich funkcjach ograniczeń dotyczących pamięci ani procesora. Emulator obsługuje jednak funkcje z czasem oczekiwania za pomocą argumentu środowiska wykonawczego timeoutSeconds.

Czas wykonywania funkcji może się różnić od czasu rzeczywistego, gdy funkcje są uruchamiane w emulatorze. Po zaprojektowaniu i przetestowaniu funkcji w emulatorze zalecamy przeprowadzenie ograniczonych testów w środowisku produkcyjnym w celu potwierdzenia czasu wykonania.

Planowanie z uwzględnieniem różnic w środowiskach lokalnych i produkcyjnych

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

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

  • Aplikacje instalowane lokalnie w celu symulowania środowiska produkcyjnego (np. ImageMagick z tego samouczka) mogą działać inaczej niż produkcyjne, zwłaszcza jeśli potrzebujesz innych wersji lub tworzysz aplikacje 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ą różnić się 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 tylko dla Node.js lub budując binarne pliki wykonywalne systemu Linux, aby utworzyć pakiet z wdrożeniami.

Ponawiam próbę

Emulator Cloud Functions nie obsługuje ponownego próbowania funkcji w przypadku niepowodzenia.

Co dalej?