Możesz wdrażać, usuwać i modyfikować funkcje 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 w źródle jednocześnie. Jeśli 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 zmodyfikowane. 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 rozwiązać ten problem, wdrażaj funkcje w grupach liczących maksymalnie 10 funkcji.
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 uporządkować funkcje w bazach kodu lub wielu zestawach plików.
Usuwanie funkcji
Wcześniej wdrożone funkcje możesz usunąć na te sposoby:
- wyraźnie w interfejsie wiersza poleceń Firebase za pomocą
functions:delete - wyraźnie w konsoli Google Cloud.
- niejawnie przez usunięcie funkcji ze źródła przed wdrożeniem.
Wszystkie operacje usuwania wymagają potwierdzenia, zanim funkcja zostanie usunięta ze środowiska produkcyjnego.
Jawne usuwanie funkcji w interfejsie wiersza poleceń Firebase obsługuje wiele argumentów, a także grupy funkcji, i umożliwia określenie funkcji działającej w konkretnym regionie. Możesz też zastąpić prośbę o potwierdzenie.
Usuwa wszystkie funkcje o określonej nazwie we wszystkich regionach:
firebase functions:delete FUNCTION-1_NAME
Usuwa określoną funkcję działającą w regionie innym niż domyślny:
firebase functions:delete FUNCTION-1_NAME --region REGION_NAME
Usuwa więcej niż 1 funkcję:
firebase functions:delete FUNCTION-1_NAME FUNCTION-2_NAME
Usuwa określoną grupę funkcji:
firebase functions:delete GROUP_NAME
Pomija prośbę o potwierdzenie:
firebase functions:delete FUNCTION-1_NAME --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 nazwy lub regiony albo aktywatory 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 wprowadzania zmian zarówno nowa, jak i stara wersja funkcji będą działać jednocześnie.
Zmienianie nazwy funkcji
Aby zmienić nazwę funkcji, utwórz w źródle nową wersję funkcji o zmienionej nazwie, a następnie uruchom 2 osobne polecenia wdrażania. Pierwsze polecenie wdraża funkcję nazwaną o nowej nazwie, 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 funkcji, która obsługuje ruch produkcyjny, możesz zapobiec utracie zdarzeń, wykonując te czynności w podanej kolejności:
- Zmień nazwę funkcji i jej region lub regiony zgodnie z potrzebami.
- Wdróż funkcję o zmienionej 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 jest obecnie wdrożona w regionie us-central1, i chcesz ją przenieść do regionu 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óż, uruchamiając:
firebase deploy --only functions:webhookAsia
Teraz działają 2 identyczne funkcje: webhook w regionie us-central1 i webhookAsia w regionie asia-northeast1.
Następnie usuń webhook:
firebase functions:delete webhook
Teraz jest tylko jedna funkcja – webhookAsia, która działa w regionie asia-northeast1.
Zmienianie typu aktywatora funkcji
W miarę rozwoju wdrożenia Cloud Functions for Firebase z różnych powodów może być konieczna zmiana typu aktywatora funkcji. Możesz na przykład zmienić typ zdarzenia Firebase Realtime Database lub Cloud Firestore na inny.
Nie można zmienić typu zdarzenia funkcji przez samą zmianę kodu źródłowego i uruchomienie polecenia firebase deploy. Aby uniknąć błędów, zmień typ aktywatora funkcji, wykonując te czynności:
- Zmodyfikuj kod źródłowy, aby uwzględnić nową funkcję z odpowiednim typem aktywatora.
- Wdróż funkcję, co spowoduje tymczasowe uruchomienie zarówno starej, jak i nowej funkcji.
- Jawnie usuń starą funkcję z produkcji 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 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 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 wybór opcji środowiska wykonawczego, takich jak wersja środowiska wykonawczego Node.js, limit czasu dla poszczególnych funkcji, alokacja pamięci oraz minimalna i maksymalna liczba instancji funkcji.
Zgodnie ze sprawdzonymi metodami te opcje (z wyjątkiem wersji Node.js) powinny być ustawione w obiekcie konfiguracji w kodzie funkcji. Ten obiekt RuntimeOptions jest źródłem informacji o opcjach środowiska wykonawczego funkcji i zastępuje opcje ustawione za pomocą dowolnej innej metody (np. konsoli Google Cloud lub gcloud CLI).
Jeśli Twój proces programowania obejmuje ręczne ustawianie opcji środowiska wykonawczego za pomocą 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. Jeśli ta opcja jest ustawiona na true, Firebase scala opcje środowiska wykonawczego ustawione w kodzie z ustawieniami obecnie wdrożonej wersji funkcji z następującym priorytetem:
- Opcja jest ustawiona w kodzie funkcji: zastąp zmiany zewnętrzne.
- W kodzie funkcji opcja jest ustawiona na
RESET_VALUE: zastąp zmiany zewnętrzne wartością domyślną. - Opcja nie jest ustawiona w kodzie funkcji, ale jest ustawiona we wdrożonej funkcji: użyj opcji określonej we wdrożonej funkcji.
W większości przypadków nie zalecamy korzystania z opcji preserveExternalChanges: true, ponieważ kod nie będzie już jedynym źródłem informacji o opcjach środowiska wykonawczego funkcji. Jeśli go używasz, sprawdź konsolę Google Cloud lub użyj gcloud CLI, 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 22
- Node.js 20
- Node.js 18 (wycofane)
Ważne informacje o bieżącej pomocy dotyczącej 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, zmodyfikuj ten wiersz w pliku package.json:
"engines": {"node": "22"}
Jeśli używasz systemu zarządzania pakietami 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": "nodejs22"
}
}
Interfejs wiersza poleceń używa wartości ustawionej w firebase.json, a nie wartości lub zakresu ustawionego osobno w 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 interfejsu wiersza poleceń Firebase w wersji 11.18.0 lub nowszej.
- Zmień wartość
enginesw plikupackage.json, który został utworzony w katalogufunctions/podczas inicjowania. Jeśli na przykład uaktualniasz wersję 16 do wersji 18, wpis powinien wyglądać tak:"engines": {"node": "18"} - Opcjonalnie możesz przetestować zmiany za pomocą Firebase Local Emulator Suite.
- Ponownie wdróż wszystkie funkcje.
Wybieranie systemu modułów Node.js
Domyślnym systemem modułów w Node.js jest CommonJS (CJS), ale obecne wersje Node.js obsługują też moduły ECMAScript (ESM). Cloud Functions obsługuje obie te opcje.
Domyślnie funkcje używają CommonJS. Oznacza to, że import i eksport wyglądają tak:
const functions = require("firebase-functions/v1");
exports.helloWorld = functions.https.onRequest(async (req, res) => res.send("Hello from Firebase!"));
Aby zamiast tego używać ESM, ustaw pole "type": "module" w pliku package.json:
{
...
"type": "module",
...
}
Po ustawieniu tej opcji użyj składni ESM import i export:
import functions from "firebase-functions/v1";
export const helloWorld = functions.https.onRequest(async (req, res) => res.send("Hello from Firebase!"));
Oba systemy modułów są w pełni obsługiwane. Możesz wybrać opcję, która najlepiej pasuje do Twojego projektu. Więcej informacji znajdziesz w dokumentacji Node.js dotyczącej modułów.
Zarządzanie skalowaniem
Domyślnie Cloud Functions for Firebase skaluje liczbę działających instancji na podstawie liczby żądań przychodzących, potencjalnie skalując w dół do zera instancji w okresach mniejszego ruchu. Jeśli jednak Twoja aplikacja wymaga krótszego czasu oczekiwania i chcesz ograniczyć liczbę uruchomień „na zimno”, możesz zmienić to działanie domyślne, 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ą pomocniczą, np. bazą danych.
Zmniejszanie liczby 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 definiuje wartość minInstances. Na przykład ta funkcja ustawia minimalną liczbę instancji, które mają być utrzymywane w stanie gotowości, na 5:
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 minInstances:
- Jeśli Cloud Functions for Firebase przeskaluje aplikację powyżej ustawienia
minInstances, każda instancja powyżej tego progu będzie uruchamiana „na zimno”. - Uruchomienia „na zimno” mają największy wpływ na aplikacje, w których ruch jest nieregularny. Jeśli ruch w aplikacji jest nieregularny i ustawisz wartość
minInstancesna tyle wysoką, że zimne uruchomienia będą ograniczone przy każdym wzroście ruchu, zauważysz znaczne zmniejszenie opóźnienia. W przypadku aplikacji o stałym ruchu uruchomienia „na zimno” raczej nie będą miały poważnego wpływu na wydajność. Ustawienie minimalnej liczby instancji może mieć sens w środowiskach produkcyjnych, ale zwykle należy go unikać w środowiskach testowych. Aby skalować do zera w projekcie testowym, ale nadal ograniczać uruchomienia „na zimno” w projekcie produkcyjnym, możesz ustawić
minInstancesna 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 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 przeciążyć 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ą 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ępna żadna instancja.
Więcej informacji o sprawdzonych metodach korzystania z ustawień maksymalnej liczby instancji znajdziesz w artykule o sprawdzonych metodach korzystania z maxInstances.
Ustawianie konta usługi
Domyślne konto usługi dla funkcji 1 generacji, PROJECT_ID@
Możesz zastąpić domyślne konto usługi i ograniczyć funkcję do dokładnie tych zasobów, których potrzebuje. Możesz to zrobić, tworząc niestandardowe konto usługi i przypisując je do odpowiedniej funkcji za pomocą metody .runWith().
Ta metoda przyjmuje obiekt z opcjami konfiguracji, w tym właściwość serviceAccount.
const functions = require("firebase-functions/v1");
exports.helloWorld = functions
.runWith({
// This function doesn't access other Firebase project resources, so it uses a limited service account.
serviceAccount:
"my-limited-access-sa@", // or prefer the full form: "my-limited-access-sa@my-project.iam.gserviceaccount.com"
})
.https.onRequest((request, response) => {
response.send("Hello from Firebase!");
});
Ustawianie czasu oczekiwania i alokacji pamięci
W niektórych przypadkach funkcje mogą mieć specjalne wymagania dotyczące długiego limitu czasu lub dużej ilości przydzielonej pamięci. Możesz ustawić te wartości w konsoli Google Cloud lub w kodzie źródłowym funkcji (tylko Firebase).
Aby ustawić alokację 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 akceptuje obiekt JSON zgodny z interfejsem RuntimeOptions, który definiuje wartości dla timeoutSeconds i memory.
Na przykład ta funkcja pamięci masowej 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ść parametru timeoutSeconds to 540, czyli 9 minut.
Ilość pamięci przyznanej funkcji odpowiada procesorowi przydzielonemu do tej funkcji, jak opisano na tej liście prawidłowych wartości dla 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 Cloud wybierz Cloud Functions z menu po lewej stronie.
- Wybierz funkcję, klikając jej nazwę na liście funkcji.
- W górnym menu kliknij ikonę Edytuj.
- Wybierz alokację pamięci z menu Przydzielona pamięć.
- Kliknij Więcej, aby wyświetlić opcje zaawansowane, i wpisz liczbę sekund w polu tekstowym Limit czasu.
- Kliknij Zapisz, aby zaktualizować funkcję.