Funkcje możesz wdrażać, usuwać i modyfikować za pomocą poleceń interfejsu wiersza poleceń Firebase lub ustawiając opcje środowiska wykonawczego w kodzie źródłowym funkcji.
Wdrażanie funkcji
Aby wdrożyć funkcje, uruchom to polecenie interfejsu wiersza poleceń Firebase:
firebase deploy --only functions
Domyślnie interfejs wiersza poleceń Firebase wdraża wszystkie funkcje wewnątrz źródła jednocześnie. Jeśli Twój projekt zawiera więcej niż 5 funkcji, zalecamy użycie flagi --only
z określonymi nazwami funkcji do wdrożenia tylko tych funkcji, które zostały przez Ciebie edytowane. Wdrożenie określonych funkcji w ten sposób przyspiesza proces wdrażania i pozwala uniknąć przekroczenia limitów wdrożenia. Przykład:
firebase deploy --only functions:addMessage,functions:makeUppercase
W przypadku wdrażania dużej liczby funkcji może dojść do przekroczenia limitu standardowego i pojawienia się komunikatów o błędach HTTP 429 lub 500. Aby rozwiązać ten problem, wdróż funkcje w grupach liczących maksymalnie 10 osób.
Pełną listę dostępnych poleceń znajdziesz w dokumentacji interfejsu wiersza poleceń Firebase.
Domyślnie interfejs wiersza poleceń Firebase szuka kodu źródłowego w folderze functions/
. Jeśli wolisz, możesz porządkować funkcje w bazach kodu lub w wielu zbiorach plików.
Usuwanie funkcji
Wcześniej wdrożone funkcje możesz usunąć na 2 sposoby:
- jawnie w interfejsie wiersza poleceń Firebase z użyciem
functions:delete
- w kontekście w konsoli Google Cloud.
- domyślnie, usuwając funkcję ze źródła przed wdrożeniem.
Wszystkie operacje usuwania wymagają potwierdzenia przed usunięciem funkcji z środowiska produkcyjnego.
Bezpośrednie usuwanie funkcji w interfejsie wiersza poleceń Firebase obsługuje wiele argumentów, jak również grupy funkcji. Umożliwia ono określenie funkcji uruchomionej w konkretnym regionie. Możesz też zignorować prośbę o potwierdzenie.
# Delete all functions that match the specified name in all regions. firebase functions:delete myFunction
# Delete a specified function running in a specific region. firebase functions:delete myFunction --region us-east-1
# Delete more than one function firebase functions:delete myFunction myOtherFunction
# Delete a specified functions group. firebase functions:delete groupA
# Bypass the confirmation prompt. firebase functions:delete myFunction --force
W przypadku niejawnego usuwania funkcji firebase deploy
analizuje źródło i usuwa z produkcji wszystkie funkcje, które zostały usunięte z pliku.
Zmodyfikuj nazwę funkcji, region lub aktywator
Jeśli zmieniasz nazwy regionów lub aktywatorów funkcji, które obsługują ruch produkcyjny albo zmieniasz ich nazwy, wykonaj czynności opisane w tej sekcji, aby uniknąć utraty zdarzeń podczas modyfikacji. Zanim wykonasz te czynności, upewnij się, że Twoja funkcja jest idempotentna, ponieważ podczas zmiany zarówno nowa, jak i stara wersja funkcji będą uruchamiane w tym samym czasie.
Zmienianie nazwy funkcji
Aby zmienić nazwę funkcji, utwórz jej nową wersję ze zmienioną nazwą w źródle, a następnie uruchom 2 osobne polecenia wdrożeniowe. Pierwsze polecenie wdraża nową funkcję, a drugie usuwa wcześniej wdrożoną wersję. Jeśli np. masz funkcję Node.js o nazwie webhook
i chcesz zmienić ją na webhookNew
, zmień kod w ten sposób:
// before
const functions = require('firebase-functions');
exports.webhook = functions.https.onRequest((req, res) => {
res.send("Hello");
});
// after
const functions = require('firebase-functions');
exports.webhookNew = functions.https.onRequest((req, res) => {
res.send("Hello");
});
Następnie uruchom te polecenia, aby wdrożyć nową funkcję:
# Deploy new function called webhookNew firebase deploy --only functions:webhookNew # Wait until deployment is done; now both webhookNew and webhook are running # Delete webhook firebase functions:delete webhook
Zmień region lub regiony funkcji
Jeśli zmieniasz określone regiony funkcji, która obsługuje ruch produkcyjny, możesz zapobiec utracie zdarzeń, wykonując te czynności w następującej kolejności:
- Zmień nazwę funkcji oraz odpowiednio zmień jej region lub regiony.
- Wdróż funkcję ze zmienioną nazwą, co spowoduje tymczasowe uruchamianie tego samego kodu w obu zestawach regionów.
- Usuń poprzednią funkcję.
Jeśli na przykład masz funkcję o nazwie webhook
, która obecnie znajduje się w regionie funkcji domyślnych us-central1
, i chcesz ją przenieść do asia-northeast1
, musisz najpierw zmodyfikować kod źródłowy, aby zmienić nazwę funkcji i zmodyfikować region.
// before
const functions = require('firebase-functions');
exports.webhook = functions
.https.onRequest((req, res) => {
res.send("Hello");
});
// after
const functions = require('firebase-functions');
exports.webhookAsia = functions
.region('asia-northeast1')
.https.onRequest((req, res) => {
res.send("Hello");
});
Następnie wdróż konfigurację, uruchamiając polecenie:
firebase deploy --only functions:webhookAsia
Obecnie są uruchomione 2 identyczne funkcje: funkcja webhook
jest uruchomiona w us-central1
, a webhookAsia
działa w asia-northeast1
.
Następnie usuń webhook
:
firebase functions:delete webhook
Teraz istnieje tylko 1 funkcja webhookAsia
, która działa w asia-northeast1
.
Zmień typ aktywatora funkcji
W miarę opracowywania wdrożenia Cloud Functions dla Firebase może być konieczna zmiana typu aktywatora funkcji z różnych powodów. Możesz na przykład zmienić typ zdarzenia w Bazie danych czasu rzeczywistego Firebase lub Cloud Firestore na inny.
Nie można zmienić typu zdarzenia funkcji przez zmianę kodu źródłowego i uruchomienie polecenia firebase deploy
. Aby uniknąć błędów, zmień typ aktywatora funkcji, wykonując tę procedurę:
- Zmodyfikuj kod źródłowy, aby zawierał nową funkcję z wybranym typem aktywatora.
- wdrożyć funkcję, co spowoduje tymczasowe uruchomienie zarówno starej, jak i nowej funkcji;
- Użyj interfejsu wiersza poleceń Firebase, aby usunąć starą funkcję z wersji produkcyjnej.
Jeśli np. masz funkcję Node.js o nazwie objectChanged
, która korzysta ze starszego typu zdarzenia onChange
, i chcesz zmienić ją na onFinalize
, najpierw zmień nazwę funkcji i ustaw typ zdarzenia onFinalize
.
// before
const functions = require('firebase-functions');
exports.objectChanged = functions.storage.object().onChange((object) => {
return console.log('File name is: ', object.name);
});
// after
const functions = require('firebase-functions');
exports.objectFinalized = functions.storage.object().onFinalize((object) => {
return console.log('File name is: ', object.name);
});
Następnie uruchom te polecenia, aby najpierw utworzyć nową funkcję, a potem usunąć starą:
# Create new function objectFinalized firebase deploy --only functions:objectFinalized # Wait until deployment is done; now both objectChanged and objectFinalized are running # Delete objectChanged firebase functions:delete objectChanged
Ustaw opcje środowiska wykonawczego
Cloud Functions dla Firebase pozwala wybrać opcje środowiska wykonawczego, takie jak wersja środowiska wykonawczego Node.js, czas oczekiwania dla poszczególnych funkcji, przydział pamięci oraz minimalna i maksymalna liczba instancji funkcji.
Zalecaną metodą jest ustawienie tych opcji (z wyjątkiem wersji Node.js) w obiekcie konfiguracji w kodzie funkcji. Ten obiekt RuntimeOptions
jest źródłem danych dotyczących opcji środowiska wykonawczego Twojej funkcji i zastępuje opcje ustawione za pomocą dowolnej innej metody (np. w konsoli Google Cloud lub gcloud CLI).
Jeśli proces programowania obejmuje ręczne ustawianie opcji środowiska wykonawczego w konsoli Google Cloud lub gcloud CLI i nie chcesz, aby te wartości były zastępowane przy każdym wdrożeniu, ustaw opcję preserveExternalChanges
na true
.
Gdy ta opcja ma wartość true
, Firebase łączy opcje środowiska wykonawczego ustawione w kodzie z ustawieniami obecnie wdrożonej wersji Twojej funkcji z następującym priorytetem:
- Opcja jest ustawiona w kodzie funkcji: zastąp zmiany zewnętrzne.
- Opcja ma wartość
RESET_VALUE
w kodzie funkcji: zastąp zmiany zewnętrzne wartością domyślną. - Opcja nie jest ustawiona w kodzie funkcji, ale jest ustawiona w obecnie wdrożonej funkcji. Użyj opcji określonej we wdrożonej funkcji.
W większości przypadków korzystanie z opcji preserveExternalChanges: true
nie jest zalecane, ponieważ Twój kod nie będzie już pełnym źródłem wiarygodnych informacji w przypadku opcji środowiska wykonawczego dla Twoich funkcji. Jeśli już z niej korzystasz, sprawdź konsolę Google Cloud lub użyj gcloud CLI, aby wyświetlić pełną konfigurację funkcji.
Ustaw wersję Node.js
Pakiet SDK Firebase dla Cloud Functions umożliwia wybór środowiska wykonawczego Node.js. Możesz uruchamiać wszystkie funkcje w projekcie wyłącznie w środowisku wykonawczym odpowiadającym jednej z tych obsługiwanych wersji Node.js:
- Node.js 20 (wersja przedpremierowa)
- Node.js 18
- Node.js 16
- Node.js 14
Aby ustawić wersję Node.js:
Możesz ustawić wersję w polu engines
w pliku package.json
, który został utworzony w katalogu functions/
podczas inicjowania.
Aby na przykład użyć tylko wersji 18, zmień ten wiersz w pliku package.json
:
"engines": {"node": "18"}
Jeśli używasz menedżera pakietów Yarn lub masz inne wymagania dotyczące pola engines
, możesz zamiast tego ustawić środowisko wykonawcze pakietu SDK Firebase dla Cloud Functions w narzędziu firebase.json
:
{
"functions": {
"runtime": "nodejs18" // or nodejs14, nodejs16 or nodejs20
}
}
Interfejs wiersza poleceń używa wartości ustawionej w zasadzie firebase.json
w pierwszej kolejności z dowolnej wartości lub zakresu ustawionych oddzielnie w zasadzie package.json
.
Uaktualnij środowisko wykonawcze Node.js
Aby uaktualnić środowisko wykonawcze Node.js:
- Sprawdź, czy Twój projekt jest objęty abonamentem Blaze.
- Upewnij się, że używasz interfejsu wiersza poleceń Firebase w wersji 11.18.0 lub nowszej.
- Zmień wartość
engines
w plikupackage.json
utworzonym w katalogufunctions/
podczas inicjowania. Jeśli na przykład uaktualniasz wersję 16 do wersji 18, wpis powinien wyglądać tak:"engines": {"node": "18"}
- Opcjonalnie przetestuj zmiany za pomocą Pakietu emulatorów lokalnych Firebase.
- Wdróż ponownie wszystkie funkcje.
Sterowanie skalowaniem
Domyślnie Cloud Functions dla Firebase skaluje liczbę uruchomionych instancji na podstawie liczby żądań przychodzących, co może zmniejszyć liczbę instancji do zera w okresach mniejszego ruchu. Jeśli jednak aplikacja wymaga mniejszego opóźnienia i chcesz ograniczyć liczbę uruchomień „na zimno”, możesz zmienić to domyślne działanie, określając minimalną liczbę instancji kontenera, które mają być utrzymywane w gotowości do obsługi żądań.
Podobnie możesz ustawić maksymalną liczbę, aby ograniczyć skalowanie instancji w odpowiedzi na żądania przychodzące. To ustawienie służy do kontrolowania kosztów lub ograniczania liczby połączeń z usługą bazową, taką jak baza danych.
Zmniejsz liczbę uruchomień „na zimno”
Aby ustawić minimalną liczbę instancji dla funkcji w kodzie źródłowym, użyj metody runWith
. Ta metoda akceptuje obiekt JSON zgodny z interfejsem RuntimeOptions
, który określa wartość minInstances
. Na przykład ta funkcja ustawia co najmniej 5 instancji, które mają utrzymać się w gorące:
exports.getAutocompleteResponse = functions
.runWith({
// Keep 5 instances warm for this latency-critical function
minInstances: 5,
})
.https.onCall((data, context) => {
// Autocomplete a user's search term
});
Oto kilka kwestii, które należy wziąć pod uwagę podczas ustawiania wartości w polu minInstances
:
- Jeśli Cloud Functions dla Firebase skaluje Twoją aplikację powyżej ustawienia
minInstances
, w przypadku każdej instancji nastąpi uruchomienie „na zimno” powyżej tego progu. - Zimne uruchomienia mają najpoważniejszy wpływ na aplikacje o dużym natężeniu ruchu. Jeśli ruch w aplikacji jest duży i ustawisz wystarczająco wysoką wartość
minInstances
, aby przy każdym wzroście ruchu zimne uruchomienia były zmniejszone, czas oczekiwania będzie znacznie krótszy. W przypadku aplikacji o ciągłym ruchu uruchomienia „na zimno” nie powinny znacząco wpływać na wydajność. Ustawienie minimalnej liczby instancji może być przydatne w środowiskach produkcyjnych, ale zazwyczaj należy go unikać w środowiskach testowych. Aby w projekcie testowym skalować się do 0, ale nadal ograniczać uruchomienia „na zimno” w projekcie produkcyjnym, możesz ustawić
minInstances
na podstawie zmiennej środowiskowejFIREBASE_CONFIG
:// Get Firebase project id from `FIREBASE_CONFIG` environment variable const envProjectId = JSON.parse(process.env.FIREBASE_CONFIG).projectId; exports.renderProfilePage = functions .runWith({ // Keep 5 instances warm for this latency-critical function // in production only. Default to 0 for test projects. minInstances: envProjectId === "my-production-project" ? 5 : 0, }) .https.onRequest((req, res) => { // render some html });
Ogranicz maksymalną liczbę instancji funkcji
Aby ustawić maksymalną liczbę instancji w kodzie źródłowym funkcji, użyj metody runWith
. Ta metoda akceptuje obiekt JSON zgodny z interfejsem RuntimeOptions
, który definiuje wartości dla maxInstances
. Na przykład ta funkcja ustawia limit 100 instancji, aby nie przytłoczyć hipotetycznej starszej bazy danych:
exports.mirrorOrdersToLegacyDatabase = functions
.runWith({
// Legacy database only supports 100 simultaneous connections
maxInstances: 100,
})
.firestore.document("orders/{orderId}")
.onWrite((change, context) => {
// Connect to legacy database
});
Jeśli funkcja HTTP zostanie przeskalowana do limitu maxInstances
, nowe żądania są umieszczane w kolejce przez 30 sekund, a następnie odrzucane z kodem odpowiedzi 429 Too Many Requests
, jeśli w tym czasie nie będzie dostępne żadne wystąpienie.
Aby dowiedzieć się więcej o sprawdzonych metodach korzystania z ustawienia maksymalnej liczby instancji, zapoznaj się z tymi sprawdzonymi metodami korzystania z maxInstances
.
Ustaw limit czasu i przydział pamięci
W niektórych przypadkach funkcje mogą mieć specjalne wymagania dotyczące długiej wartości limitu czasu lub dużej ilości pamięci. Te wartości możesz ustawić w konsoli Google Cloud lub w kodzie źródłowym funkcji (tylko w Firebase).
Aby ustawić przydział pamięci i czas oczekiwania w kodzie źródłowym funkcji, użyj parametru runWith
wprowadzonego w pakiecie SDK Firebase dla Cloud Functions w wersji 2.0.0. Ta opcja środowiska wykonawczego akceptuje obiekt JSON zgodny z interfejsem RuntimeOptions
, który definiuje wartości dla timeoutSeconds
i memory
.
Na przykład ta funkcja przechowywania wykorzystuje 1 GB pamięci i przekracza limit czasu po 300 sekundach:
exports.convertLargeFile = functions
.runWith({
// Ensure the function has enough memory and time
// to process large files
timeoutSeconds: 300,
memory: "1GB",
})
.storage.object()
.onFinalize((object) => {
// Do some complicated things that take a lot of memory and time
});
Maksymalna wartość dla parametru timeoutSeconds
to 540
, czyli 9 minut.
Ilość pamięci przydzielonej funkcji odpowiada procesorowi przydzielonemu dla funkcji, zgodnie z tą listą prawidłowych wartości dla funkcji memory
:
128MB
– 200 MHz256MB
– 400 MHz512MB
– 800 MHz1GB
– 1,4 GHz2GB
– 2,4 GHz4GB
– 4,8 GHz8GB
– 4,8 GHz
Aby ustawić przydział pamięci i limit czasu w konsoli Google Cloud:
- W konsoli Google Cloud w menu po lewej stronie wybierz Cloud Functions.
- Wybierz funkcję, klikając jej nazwę na liście funkcji.
- W menu u góry kliknij ikonę Edytuj.
- Z menu Przydzielona pamięć wybierz przydział pamięci.
- Kliknij Więcej, aby wyświetlić opcje zaawansowane, i wpisz liczbę sekund w polu tekstowym Limit czasu.
- Kliknij Zapisz, aby zaktualizować funkcję.