Funkcje możesz wdrażać, usuwać i modyfikować za pomocą poleceń wiersza poleceń Firebase lub ustawiając opcje czasu wykonywania w kodzie źródłowym funkcji.
Wdrażanie funkcji
Aby wdrożyć funkcje, uruchom to polecenie wiersza poleceń Firebase:
firebase deploy --only functions
Domyślnie wiersz poleceń Firebase wdraża wszystkie funkcje w Twoim źródle w tym samym czasie. Jeśli Twój projekt zawiera więcej niż 5 funkcji, zalecamy użycie parametru --only
z określonymi nazwami funkcji, aby wdrożyć tylko zmodyfikowane przez Ciebie funkcje. Wdrażanie określonych funkcji w ten sposób przyspiesza proces wdrażania i pomaga uniknąć przekroczenia limitów wdrażania. Przykład:
firebase deploy --only functions:addMessage,functions:makeUppercase
Podczas wdrażania dużej liczby funkcji możesz przekroczyć standardowy limit i otrzymać komunikaty o błędach HTTP 429 lub 500. Aby tego uniknąć, stosuj funkcje w grupach liczących co najwyżej 10 elementów.
Pełną listę dostępnych poleceń znajdziesz w dokumentacji Firebase.
Domyślnie interfejs wiersza poleceń Firebase szuka kodu źródłowego w folderze functions/
. Jeśli wolisz, możesz uporządkować funkcje w kodzie źródłowym lub w kilku zestawach plików.
Usuwanie funkcji
Funkcję, która została już wdrożona, możesz usunąć na jeden z tych sposobów:
- wyraźnie w interfejsie wiersza poleceń Firebase za pomocą polecenia
functions:delete
. - wyraźnie w Google Cloud konsoli.
- Domyślnie, usuwając funkcję ze źródła przed wdrożeniem.
Przed usunięciem funkcji z produkcji musisz potwierdzić wszystkie operacje usuwania.
Wyraźne usuwanie funkcji w programie wierszowym Firebase obsługuje wiele argumentów, a także grupy funkcji. Umożliwia też określenie funkcji działającej w określonym 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
Przy domyślnym usuwaniu funkcji firebase deploy
analizuje kod źródłowy i usuwa z wersji produkcyjnej wszystkie funkcje, które zostały usunięte z pliku.
Zmiana nazwy, regionu lub aktywatora funkcji
Jeśli zmieniasz nazwy regionów lub ich inicjatory lub zmieniasz je w przypadku funkcji, które obsługują ruch produkcyjny, wykonaj czynności opisane w tym rozdziale, aby uniknąć utraty zdarzeń podczas modyfikacji. Zanim wykonasz te czynności, upewnij się, że funkcja jest idempotentna, ponieważ podczas zmiany będą działać jednocześnie nowa i stara wersja funkcji.
Zmiana nazwy funkcji
Aby zmienić nazwę funkcji, utwórz nową wersję funkcji w źródle i uruchom 2 osobne polecenia wdrożenia. Pierwsze polecenie wdraża funkcję o nowej nazwie, a drugie usuwa wcześniej wdrożony wariant. Jeśli np. masz funkcję Node.js o nazwie webhook
, którą chcesz zmienić na webhookNew
, zmodyfikuj kod w ten sposób:
// before
const functions = require('firebase-functions/v1');
exports.webhook = functions.https.onRequest((req, res) => {
res.send("Hello");
});
// after
const functions = require('firebase-functions/v1');
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
Zmiana regionu lub regionów funkcji
Jeśli zmieniasz określone regiony w przypadku funkcji, która obsługuje ruch produkcyjny, możesz zapobiec utracie zdarzeń, wykonując te czynności w kolejności:
- Zmień nazwę funkcji i w razie potrzeby zmień jej region lub regiony.
- Wdróż przemianowaną funkcję, co spowoduje tymczasowe uruchomienie tego samego kodu w obu zestawach regionów.
- Usuń poprzednią funkcję.
Jeśli np. masz funkcję o nazwie webhook
, która znajduje się obecnie w domyślnym regionie funkcji us-central1
, i chcesz ją przenieść do regionu asia-northeast1
, musisz najpierw zmodyfikować kod źródłowy, aby zmienić nazwę funkcji i zaktualizować region.
// before
const functions = require('firebase-functions/v1');
exports.webhook = functions
.https.onRequest((req, res) => {
res.send("Hello");
});
// after
const functions = require('firebase-functions/v1');
exports.webhookAsia = functions
.region('asia-northeast1')
.https.onRequest((req, res) => {
res.send("Hello");
});
Następnie wdróż, wykonując te czynności:
firebase deploy --only functions:webhookAsia
Teraz są uruchomione 2 identyczne funkcje: webhook
w kontekście us-central1
i webhookAsia
w kontekście asia-northeast1
.
Następnie usuń webhook
:
firebase functions:delete webhook
Teraz jest tylko jedna funkcja – webhookAsia
, która działa w ramach asia-northeast1
.
Zmiana typu wyzwalacza funkcji
W miarę rozwijania wdrożenia Cloud Functions for Firebase może się okazać, że z różnych powodów trzeba zmienić typ wyzwalacza funkcji. Możesz na przykład zmienić jeden typ zdarzenia Firebase Realtime Database lub Cloud Firestore na inny.
Nie można zmienić typu zdarzenia funkcji, po prostu zmieniając kod źródłowy i uruchamiając firebase deploy
. Aby uniknąć błędów, zmień typ okna funkcji:
- Zmodyfikuj kod źródłowy, aby uwzględnić nową funkcję z wybranym typem wyzwalacza.
- Wdroż funkcję, co spowoduje tymczasowe uruchomienie zarówno starej, jak i nowej funkcji.
- Usuń starą funkcję z produkcji za pomocą interfejsu wiersza poleceń Firebase.
Jeśli np. masz funkcję Node.js o nazwie objectChanged
, która ma starszy typ zdarzenia onChange
, a chcesz ją zmienić na onFinalize
, najpierw zmień nazwę funkcji i zmodyfikuj ją, aby miała typ zdarzenia onFinalize
.
// before
const functions = require('firebase-functions/v1');
exports.objectChanged = functions.storage.object().onChange((object) => {
return console.log('File name is: ', object.name);
});
// after
const functions = require('firebase-functions/v1');
exports.objectFinalized = functions.storage.object().onFinalize((object) => {
return console.log('File name is: ', object.name);
});
Następnie utwórz nową funkcję, zanim usuniesz 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
Ustawianie opcji środowiska wykonawczego
Cloud Functions for Firebase umożliwia wybranie opcji czasu wykonywania, takich jak wersja środowiska wykonawczego Node.js i czas oczekiwania na wykonanie funkcji, alokacja pamięci oraz minimalna i maksymalna liczba wystąpień funkcji.
Zgodnie ze sprawdzoną metodą te opcje (z wyjątkiem wersji Node.js) powinny być ustawiane w obiekcie konfiguracji w kodzie funkcji. Ten obiekt RuntimeOptions
jest źródłem informacji o opcjach czasu wykonywania funkcji i zastąpi opcje ustawione za pomocą dowolnej innej metody (np. w konsoli Google Cloud lub w interfejsie wiersza poleceń gcloud).
Jeśli Twój proces rozwoju obejmuje ręczne ustawianie opcji czasu wykonywania w konsoli Google Cloud lub interfejsie wiersza poleceń gcloud i nie chcesz, aby te wartości były zastępowane przy każdym wdrożeniu, ustaw opcję preserveExternalChanges
na true
.
Gdy ta opcja jest ustawiona na true
, Firebase scala opcje środowiska wykonawczego określone w kodzie z ustawieniami obecnie wdrożonej wersji funkcji z tym priorytetem:
- Opcja jest ustawiona w kodzie funkcji: zastąpij zmiany zewnętrzne.
- Opcja jest ustawiona na
RESET_VALUE
w kodzie funkcji: zastąpij 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 w wdrożonej funkcji.
Nie zalecamy używania opcji preserveExternalChanges: true
w większości scenariuszy, ponieważ Twój kod nie będzie już pełnym źródłem informacji o opcjach środowiska wykonawczego funkcji. Jeśli go używasz, wyświetl pełną konfigurację funkcji w konsoli Google Cloud lub za pomocą interfejsu wiersza poleceń gcloud.
Ustawianie wersji Node.js
Pakiet SDK Firebase dla usługi Cloud Functions umożliwia wybranie środowiska wykonawczego Node.js. Możesz zdecydować, aby wszystkie funkcje w projekcie były wykonywane 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:
Wersję możesz ustawić w polu engines
w pliku package.json
, który został utworzony w katalogu functions/
podczas inicjalizacji.
Aby na przykład używać tylko wersji 18, w pliku package.json
zmodyfikuj ten wiersz:
"engines": {"node": "18"}
Jeśli używasz menedżera pakietów Yarn lub masz inne wymagania dotyczące pola engines
, możesz ustawić środowisko wykonawcze pakietu SDK Firebase dla Cloud Functions w firebase.json
:
{
"functions": {
"runtime": "nodejs18" // or nodejs14, nodejs16 or nodejs20
}
}
CLI używa wartości ustawionej w parasm firebase.json
zamiast wartości lub zakresu ustawionego oddzielnie w parasm package.json
.
Uaktualnianie środowiska wykonawczego Node.js
Aby uaktualnić środowisko wykonawcze Node.js:
- Upewnij się, że Twój projekt jest objęty abonamentem Blaze.
- Upewnij się, że używasz Firebase CLI w wersji 11.18.0 lub nowszej.
- Zmień wartość
engines
w plikupackage.json
utworzonym w katalogufunctions/
podczas inicjalizacji. Jeśli na przykład przechodzisz z wersji 16 na wersję 18, wpis powinien wyglądać tak:"engines": {"node": "18"}
- Opcjonalnie możesz przetestować zmiany za pomocą Firebase Local Emulator Suite.
- ponownie wdrożyć wszystkie funkcje.
Kontrolowanie zachowania przy skalowaniu
Domyślnie usługa Cloud Functions for Firebase skaluje liczbę uruchomionych instancji na podstawie liczby żądań przychodzących. W czasie zmniejszonego ruchu może zmniejszyć liczbę instancji do zera. Jeśli jednak Twoja aplikacja wymaga krótszego czasu oczekiwania 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 przychodzące żądania. Użyj tego ustawienia, aby kontrolować koszty lub ograniczyć liczbę połączeń z usługą wspierającą, np. z bazą danych.
Zmniejsz liczbę uruchomień „na zimno”
Aby ustawić minimalną liczbę instancji funkcji w źródle kodu, użyj metody runWith
. Ta metoda przyjmuje obiekt JSON zgodny z interfejsem RuntimeOptions
, który definiuje wartość minInstances
. Na przykład ta funkcja ustawia minimalną liczbę instancji na 5, aby utrzymać je w gotowości:
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
});
Podczas ustawiania wartości parametru minInstances
warto wziąć pod uwagę te kwestie:
- Jeśli Cloud Functions for Firebase zwiększy skalę aplikacji powyżej ustawienia
minInstances
, uruchomienie „na zimno” będzie się odbywać w przypadku każdego wystąpienia powyżej tego progu. - Uruchomienia „na zimno” mają największy wpływ na aplikacje z nieregularnym ruchem. Jeśli ruch w Twojej aplikacji jest nieregularny i ustawisz wartość
minInstances
na tyle wysoką, że zmniejszy się liczba zimnych uruchomień przy każdym wzroście natężenia ruchu, zauważysz znacznie mniejsze opóźnienie. W przypadku aplikacji o stałym natężeniu ruchu uruchomienia „na zimno” prawdopodobnie nie będą miały dużego wpływu na wydajność. Ustawienie minimalnej liczby instancji może być uzasadnione w środowiskach produkcyjnych, ale zazwyczaj nie zaleca się tego w środowiskach testowych. Aby zmniejszyć liczbę uruchomień „na zimno” w projekcie produkcyjnym, ale nie zmieniać skali w projekcie testowym, 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 });
Ograniczanie maksymalnej liczby instancji funkcji
Aby ustawić maksymalną liczbę instancji w kodzie źródłowym funkcji, użyj metody runWith
. Ta metoda przyjmuje obiekt JSON zgodny z interfejsem RuntimeOptions
, który definiuje wartości dla maxInstances
. Na przykład ta funkcja ustawia limit 100 instansji, aby nie przeciążać 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 zwiększona do limitu maxInstances
, nowe żądania są umieszczane w kolejce na 30 sekund, a następnie odrzucane z kodem odpowiedzi 429 Too Many Requests
, jeśli do tego czasu nie będzie dostępnej instancji.
Aby dowiedzieć się więcej o sprawdzonych metodach korzystania z ustawień maksymalnej liczby instancji, zapoznaj się z tymi sprawdzonymi metodami korzystania z maxInstances
.
Ustawianie czasu oczekiwania i przydziału pamięci
W niektórych przypadkach funkcje mogą mieć specjalne wymagania dotyczące długiego limitu czasu lub dużej alokacji pamięci. Te wartości możesz ustawić w konsoli Google Cloud lub w kodzie źródłowym funkcji (tylko w Firebase).
Aby ustawić alokację pamięci i limit czasu w kodzie źródłowym funkcji, użyj parametru runWith
, który został wprowadzony w pakiecie SDK Firebase w wersji Cloud Functions 2.0.0. Ta opcja czasu wykonywania akceptuje obiekt JSON zgodny z interfejsem RuntimeOptions
, który definiuje wartości timeoutSeconds
i memory
.
Ta funkcja wykorzystuje 1 GB pamięci i wygasa 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 timeoutSeconds
to 540
, czyli 9 minut.
Ilość pamięci przyznanej funkcji odpowiada procesowi przydzielonemu funkcji, jak pokazano na tej liście prawidłowych wartości funkcji memory
:
128MB
– 200 MHz256MB
– 400 MHz512MB
– 800 MHz1GB
— 1,4 GHz2GB
– 2,4 GHz4GB
– 4,8 GHz8GB
– 4,8 GHz
Aby ustawić alokację pamięci i limit czasu w konsoli Google Cloud:
- W konsoli Google Google Cloud wybierz Cloud Functions z menu po lewej stronie.
- Wybierz funkcję, klikając jej nazwę na liście funkcji.
- W menu u góry kliknij ikonę Edytuj.
- W menu Przydzielona pamięć wybierz przydział pamięci.
- Kliknij Więcej, aby wyświetlić opcje zaawansowane, i wpisz liczbę sekund w polu tekstowym Limit czasu.
- Aby zaktualizować funkcję, kliknij Zapisz.