Funkcje możesz wdrażać, usuwać i modyfikować za pomocą Firebase poleceń interfejsu wiersza poleceń 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 Firebase wdraża wszystkie funkcje w źródle jednocześnie. Jeśli Twój projekt zawiera więcej niż 5 funkcji, zalecamy użycie flagi --only
z nazwami konkretnych funkcji, aby wdrożyć tylko te funkcje, które zostały przez Ciebie zmodyfikowane. Wdrażanie konkretnych 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 rozwiązać ten problem, wdrażaj funkcje w grupach liczących maksymalnie 10 elementów.
Pełną listę dostępnych poleceń znajdziesz w Firebasedokumentacji interfejsu CLI.
Domyślnie interfejs Firebase CLI szuka kodu źródłowego w folderze functions/
. Jeśli wolisz, możesz organizować funkcje w bazach kodu lub w kilku zestawach plików.
Usuwanie artefaktów wdrożenia
W ramach wdrażania funkcji generowane są obrazy kontenerów, które są przechowywane w Artifact Registry. Te obrazy nie są wymagane do działania wdrożonych funkcji. Cloud Functions pobiera i przechowuje kopię obrazu podczas początkowego wdrożenia, ale przechowywane artefakty nie są potrzebne do działania funkcji w czasie wykonywania.
Obrazy kontenerów są zwykle małe, ale z czasem mogą się gromadzić i zwiększać koszty przechowywania. Możesz je zachować przez pewien czas, jeśli planujesz sprawdzić utworzone artefakty lub przeprowadzić skanowanie kontenera pod kątem luk w zabezpieczeniach.
Aby pomóc w zarządzaniu kosztami przechowywania, Firebaseinterfejs CLI w wersji 14.0.0 i nowszych umożliwia skonfigurowanie Artifact Registryzasady czyszczenia w przypadku repozytoriów, w których po każdym wdrożeniu funkcji są przechowywane artefakty wdrożenia.
Zasady czyszczenia możesz skonfigurować lub edytować ręcznie za pomocą polecenia functions:artifacts:setpolicy
:
firebase functions:artifacts:setpolicy
Domyślnie to polecenie konfiguruje Artifact Registry tak, aby automatycznie usuwać obrazy kontenerów starsze niż 1 dzień. Zapewnia to rozsądną równowagę między minimalizacją kosztów przechowywania a możliwością sprawdzenia ostatnich kompilacji.
Okres przechowywania możesz dostosować za pomocą opcji --days
:
firebase functions:artifacts:setpolicy --days 7 # Delete images older than 7 days
Jeśli wdrażasz funkcje w wielu regionach, możesz skonfigurować zasady czyszczenia dla konkretnej lokalizacji za pomocą opcji --location
:
$ firebase functions:artifacts:setpolicy --location europe-west1
Rezygnacja z czyszczenia artefaktów
Jeśli wolisz ręcznie zarządzać czyszczeniem obrazów lub nie chcesz usuwać żadnych obrazów, możesz całkowicie zrezygnować z zasad czyszczenia:
$ firebase functions:artifacts:setpolicy --none
To polecenie usuwa wszystkie istniejące zasady czyszczenia, które zostały skonfigurowane przez interfejs Firebase, i uniemożliwia Firebase skonfigurowanie zasad czyszczenia po wdrożeniu funkcji.
Usuwanie funkcji
Wcześniej wdrożone funkcje możesz usunąć w ten sposób:
- wyraźnie w interfejsie wiersza poleceń Firebase za pomocą polecenia
functions:delete
. - wyraźnie w Google Cloudkonsoli.
- niejawnie, usuwając funkcję ze źródła przed wdrożeniem.
Wszystkie operacje usuwania wymagają potwierdzenia przed usunięciem funkcji z wersji produkcyjnej.
Jawne usuwanie funkcji w Firebase CLI obsługuje wiele argumentów, a także grupy funkcji i umożliwia określenie funkcji działającej w danym regionie. Możesz też pominąć 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 wersji produkcyjnej wszystkie funkcje, które zostały usunięte z pliku.
Modyfikowanie nazwy, regionu lub aktywatora funkcji
Jeśli zmieniasz nazwę lub region albo aktywator funkcji, które obsługują ruch produkcyjny, wykonaj czynności opisane w tej sekcji, 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.
Zmienianie nazwy funkcji
Aby zmienić nazwę funkcji, utwórz nową wersję funkcji ze zmienioną nazwą w źródle, a potem uruchom 2 osobne polecenia wdrażania. Pierwsze polecenie wdraża nowo nazwaną funkcję, a drugie usuwa wcześniej wdrożoną wersję. Jeśli na przykład 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
Zmienianie regionu lub regionów funkcji
Jeśli zmieniasz określone regiony w przypadku funkcji obsługującej ruch produkcyjny, możesz zapobiec utracie zdarzeń, wykonując te czynności w podanej kolejności:
- Zmień nazwę funkcji i w razie potrzeby zmień region lub regiony.
- Wdróż funkcję o nowej nazwie, co spowoduje tymczasowe uruchomienie 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 domyślnym regionie funkcji us-central1
, i chcesz ją przenieść do asia-northeast1
, musisz najpierw zmodyfikować kod źródłowy, aby zmienić nazwę funkcji i 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óż aplikację, uruchamiając to polecenie:
firebase deploy --only functions:webhookAsia
Teraz działają 2 identyczne funkcje: webhook
w us-central1
i webhookAsia
w asia-northeast1
.
Następnie usuń webhook
:
firebase functions:delete webhook
Teraz jest tylko jedna funkcja – webhookAsia
, która działa w asia-northeast1
.
Zmienianie typu wywołania funkcji
W miarę rozwoju wdrożenia Cloud Functions for Firebase możesz z różnych powodów potrzebować zmiany typu wyzwalacza funkcji. Możesz na przykład zmienić typ zdarzenia Firebase Realtime Database lub Cloud Firestore na inny.
Nie można zmienić typu zdarzenia funkcji, zmieniając tylko kod źródłowy i uruchamiając polecenie firebase deploy
. Aby uniknąć błędów, zmień typ reguły funkcji, wykonując te czynności:
- Zmodyfikuj kod źródłowy, aby uwzględnić nową funkcję z odpowiednim typem wyzwalacza.
- Wdróż funkcję, co spowoduje tymczasowe uruchomienie zarówno starej, jak i nowej funkcji.
- Usuń starą funkcję z wersji produkcyjnej za pomocą interfejsu wiersza poleceń Firebase.
Jeśli na przykład masz funkcję Node.js o nazwie objectChanged
, która ma starszy typ zdarzenia onChange
, i chcesz zmienić go na onFinalize
, najpierw zmień nazwę funkcji i edytuj 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 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
Ustawianie opcji środowiska wykonawczego
Cloud Functions for Firebase umożliwia wybieranie opcji środowiska wykonawczego, takich jak wersja środowiska wykonawczego Node.js, limit czasu poszczególnych funkcji, przydział pamięci oraz minimalna i maksymalna liczba instancji funkcji.
Zgodnie ze sprawdzoną metodą te opcje (z wyjątkiem wersji Node.js) należy ustawić w obiekcie konfiguracji w kodzie funkcji. Ten obiekt RuntimeOptions
jest źródłem informacji o opcjach środowiska wykonawczego funkcji i zastępuje opcje ustawione w inny sposób (np. w konsoli Google Cloud lub w interfejsie gcloud CLI).
Jeśli Twój proces programowania obejmuje ręczne ustawianie opcji środowiska wykonawczego za pomocą konsoli Google Cloud lub interfejsu gcloud CLI i nie chcesz, aby te wartości były zastępowane przy każdym wdrożeniu, ustaw opcję preserveExternalChanges
na true
.
Jeśli ta opcja jest ustawiona na true
, Firebase łączy opcje środowiska wykonawczego ustawione w kodzie z ustawieniami aktualnie wdrożonej wersji funkcji w tej kolejności:
- Opcja jest ustawiona w kodzie funkcji: zastępuje zmiany zewnętrzne.
- Opcja jest ustawiona na
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.
Używanie opcji preserveExternalChanges: true
jest niezalecane w większości przypadków, ponieważ kod nie będzie już pełnym źródłem informacji o opcjach środowiska wykonawczego funkcji. Jeśli go używasz, sprawdź konsolę Google Cloud lub użyj interfejsu wiersza poleceń gcloud, aby wyświetlić pełną konfigurację funkcji.
Ustawianie wersji 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
- Node.js 18 (wycofana)
Ważne informacje o bieżącym wsparciu dla tych wersji Node.js znajdziesz w harmonogramie pomocy.
Aby ustawić wersję Node.js:
Wersję możesz ustawić w polu engines
w pliku package.json
, który został utworzony w katalogu functions/
podczas inicjowania.
Jeśli na przykład chcesz używać tylko wersji 20, zmień ten wiersz w pliku package.json
:
"engines": {"node": "20"}
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": "nodejs20"
}
}
Interfejs CLI używa wartości ustawionej w firebase.json
zamiast dowolnej wartości lub zakresu ustawionego osobno w package.json
.
Uaktualnianie środowiska wykonawczego Node.js
Aby uaktualnić środowisko wykonawcze Node.js:
- Sprawdź, czy 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
, który został utworzony 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 Cloud Functions for Firebase skaluje liczbę uruchomionych instancji na podstawie liczby żądań przychodzących, co w okresach mniejszego ruchu może oznaczać zmniejszenie liczby 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 kodzie źródłowym, użyj metody runWith
. Ta metoda akceptuje obiekt JSON zgodny z interfejsem RuntimeOptions
, który określa wartość parametru minInstances
. Na przykład ta funkcja ustawia minimalną liczbę 5 instancji, które mają być utrzymywane 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
});
Oto kilka kwestii, które warto wziąć pod uwagę podczas ustawiania wartości parametru minInstances
:
- Jeśli Cloud Functions for Firebase skaluje aplikację powyżej ustawienia
minInstances
, każde wystąpienie powyżej tego progu będzie uruchamiane „na zimno”. - Uruchamianie „na zimno” ma największy wpływ na aplikacje z nieregularnym ruchem. Jeśli Twoja aplikacja ma skokowe natężenie ruchu, a ustawisz wartość
minInstances
na tyle wysoką, że zimne starty będą rzadsze przy każdym wzroście natężenia ruchu, zauważysz znaczne zmniejszenie opóźnienia. W przypadku aplikacji z ciągłym ruchem uruchomienia „na zimno” nie powinny mieć dużego wpływu na wydajność. Ustawienie minimalnej liczby instancji może być przydatne w środowiskach produkcyjnych, ale zwykle należy go unikać w środowiskach testowych. Aby w projekcie testowym skalować do zera, 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 });
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 określa wartości parametru maxInstances
. Na przykład ta funkcja ustawia limit 100 instancji, 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 przeskalowana do limitu maxInstances
, nowe żądania będą przez 30 sekund umieszczane w kolejce, a potem odrzucane z kodem odpowiedzi 429 Too Many Requests
, jeśli do tego czasu nie będzie dostępna żadna instancja.
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 czasu oczekiwania 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 limit czasu 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 przyjmuje obiekt JSON zgodny z interfejsem RuntimeOptions
, który określa wartości parametrów timeoutSeconds
i memory
.
Na przykład ta funkcja pamięci 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
});
Wartość maksymalna dla timeoutSeconds
to 540
, czyli 9 minut.
Ilość pamięci przyznanej funkcji odpowiada przydzielonemu jej procesorowi, co szczegółowo opisuje ta lista prawidłowych wartości parametru 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 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.
- Wybierz przydział pamięci z menu Przydzielona pamięć.
- Kliknij Więcej, aby wyświetlić opcje zaawansowane, a następnie wpisz liczbę sekund w polu tekstowym Limit czasu.
- Aby zaktualizować funkcję, kliknij Zapisz.