Możesz wdrażać, usuwać i modyfikować funkcje za pomocą poleceń Firebase CLI lub ustawiając opcje środowiska wykonawczego w kodzie źródłowym funkcji.
Wdrażaj funkcje
Aby wdrożyć funkcje, uruchom to polecenie Firebase CLI:
firebase deploy --only functions
Domyślnie Firebase CLI wdraża jednocześnie wszystkie funkcje zawarte w index.js
. Jeśli projekt zawiera więcej niż 5 funkcji, zalecamy użycie flagi --only
z określonymi nazwami funkcji, aby wdrożyć tylko funkcje, które edytowałeś. Wdrażanie określonych funkcji w ten sposób przyspiesza proces wdrażania i pomaga uniknąć przekroczenia limitów wdrażania. Na przykład:
firebase deploy --only functions:addMessage,functions:makeUppercase
Wdrażając dużą liczbę funkcji, możesz przekroczyć standardowy przydział i otrzymać komunikaty o błędach HTTP 429 lub 500. Aby rozwiązać ten problem, wdrażaj funkcje w grupach po 10 lub mniej.
Zobacz dokumentację Firebase CLI , aby uzyskać pełną listę dostępnych poleceń.
Domyślnie Firebase CLI szuka kodu źródłowego w folderze functions/
. Jeśli wolisz, możesz organizować funkcje w bazach kodu lub wielu zestawach plików.
Usuń funkcje
Możesz usunąć wcześniej wdrożone funkcje w następujący sposób:
- jawnie w Firebase CLI z
functions:delete
- jawnie używając menu kontekstowego na liście funkcji w konsoli Firebase
- niejawnie , usuwając funkcję z
index.js
przed wdrożeniem.
Wszystkie operacje usuwania wymagają potwierdzenia przed usunięciem funkcji z produkcji.
Jawne usuwanie funkcji w interfejsie Firebase CLI obsługuje wiele argumentów, a także grupy funkcji i umożliwia określenie funkcji działającej w określonym regionie. Możesz także pominąć monit 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 usunięcia funkcji, firebase deploy
analizuje index.js
i usuwa z produkcji wszystkie funkcje, które zostały usunięte z pliku.
Zmodyfikuj nazwę funkcji, region lub wyzwalacz
Jeśli zmieniasz nazwy lub zmieniasz regiony lub wyzwalacze dla funkcji obsługujących ruch produkcyjny, wykonaj kroki opisane w tej sekcji, aby uniknąć utraty zdarzeń podczas modyfikacji. Przed wykonaniem tych kroków najpierw upewnij się, że funkcja jest idempotentna , ponieważ podczas zmiany zarówno nowa, jak i stara wersja funkcji będą działać w tym samym czasie.
Zmień nazwę funkcji
Aby zmienić nazwę funkcji, utwórz nową wersję funkcji o zmienionej nazwie w index.js
, a następnie uruchom dwie oddzielne komendy wdrażania. Pierwsze polecenie wdraża nowo nazwaną funkcję, a drugie polecenie usuwa poprzednio wdrożoną wersję. Na przykład, jeśli masz funkcję o nazwie webhook
, którą chcesz zmienić na webhookNew
, popraw kod w następujący 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 następujące 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 dla funkcji obsługującej ruch produkcyjny, możesz zapobiec utracie zdarzeń, wykonując następujące kroki w kolejności:
- Zmień nazwę funkcji i zmień 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ę.
Na przykład, jeśli masz funkcję o nazwie webhook
, która znajduje się obecnie w domyślnym regionie funkcji us-central1
i chcesz przenieść ją do asia-northeast1
, musisz najpierw zmodyfikować kod źródłowy, aby zmienić nazwę funkcji i poprawić 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óż, uruchamiając:
firebase deploy --only functions:webhookAsia
Teraz działają dwie identyczne funkcje: webhook
działa w us-central1
, a webhookAsia
działa w asia-northeast1
.
Następnie usuń webhook
:
firebase functions:delete webhook
Teraz jest tylko jedna funkcja - webhookAsia
, która działa w asia-northeast1
.
Zmień typ wyzwalacza funkcji
W miarę rozwoju wdrożenia Cloud Functions dla Firebase może być konieczna zmiana typu wyzwalacza funkcji z różnych powodów. Na przykład możesz chcieć:
- Zmień ze starszego zdarzenia
onChange
na zdarzeniaonFinalize
,onDelete
,onArchive
ionMetadataUpdate
. (Dowiedz się więcej na ten temat w przewodniku uaktualniania wersji beta do v1 lub v2 ). - Zmień jeden typ zdarzenia bazy danych czasu rzeczywistego Firebase lub zdarzenia Cloud Firestore na inny, taki jak ogólne zdarzenie
onWrite
na szczegółowe zdarzenieonCreate
.
Nie można zmienić typu zdarzenia funkcji przez samą zmianę kodu źródłowego i uruchomienie firebase deploy
. Aby uniknąć błędów, zmień typ wyzwalacza funkcji, wykonując tę procedurę:
- Zmodyfikuj kod źródłowy, aby zawierał nową funkcję z żądanym typem wyzwalacza.
- Wdróż funkcję, co spowoduje tymczasowe uruchomienie zarówno starej, jak i nowej funkcji.
- Jawnie usuń starą funkcję z produkcji za pomocą interfejsu wiersza polecenia Firebase.
Na przykład, jeśli masz funkcję objectChanged
, która ma starszy typ zdarzenia onChange
i chcesz ją zmienić na onFinalize
, najpierw zmień nazwę funkcji i edytuj ją tak, aby miała 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 następujące polecenia, aby najpierw utworzyć nową funkcję, zanim usuniesz starą funkcję:
# 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 czasu działania
Cloud Functions dla Firebase pozwala wybrać opcje środowiska wykonawczego, takie jak wersja środowiska wykonawczego Node.js i limit czasu dla poszczególnych funkcji, alokacja pamięci oraz minimalna/maksymalna liczba wystąpień funkcji.
Ustaw wersję Node.js
Pakiet Firebase SDK dla Cloud Functions w wersji 2.0.0 lub nowszej umożliwia wybór środowiska wykonawczego Node.js. Możesz wybrać uruchamianie wszystkich funkcji w projekcie wyłącznie w środowisku wykonawczym odpowiadającym jednej z obsługiwanych wersji Node.js:
- Node.js 16
- Node.js 14
- Node.js 12
- Node.js 10
- Node.js 8 (wycofane 8 czerwca 2020 r.) Wdrażanie funkcji w środowisku wykonawczym Node.js 8 zostało wyłączone w interfejsie wiersza polecenia Firebase 15 grudnia 2020 r. Wykonywanie już wdrożonych funkcji zostanie zatrzymane w pewnym momencie w przyszłości; Jeśli wdrożyłeś funkcje w środowisku wykonawczym Node.js 8, zalecamy uaktualnienie do środowiska wykonawczego Node.js 16 .
Aby ustawić wersję Node.js:
Ustaw wersję w polu engines
w pliku package.json
, który został utworzony w katalogu functions/
podczas inicjalizacji. Na przykład, aby używać tylko wersji 16, edytuj ten wiersz w package.json
:
"engines": {"node": "16"}
Pole engines
jest wymagane; musi określać jedną z obsługiwanych wersji Node.js, aby można było wdrażać i uruchamiać funkcje. Obecnie firebase init functions
ustawiają to pole na 16
.
Uaktualnij środowisko uruchomieniowe Node.js
Aby zaktualizować środowisko wykonawcze Node.js:
- Upewnij się, że Twój projekt jest objęty planem cenowym Blaze .
- Upewnij się, że używasz Firebase CLI w wersji 9.17.0 lub nowszej.
- Zmień wartość
engines
w plikupackage.json
, który został utworzony w katalogufunctions/
podczas inicjowania. Na przykład, jeśli aktualizujesz wersję 10 do wersji 16, wpis powinien wyglądać tak:"engines": {"node": "16"}
- Opcjonalnie przetestuj zmiany za pomocą pakietu Firebase Local Emulator Suite .
- Ponownie wdrażaj funkcje przy użyciu interfejsu Firebase CLI w wersji 9.17.0 lub nowszej.
Kontroluj zachowanie skalowania
Domyślnie Cloud Functions dla Firebase skaluje liczbę uruchomionych instancji na podstawie liczby przychodzących żądań, potencjalnie zmniejszając liczbę instancji do zera w przypadku mniejszego ruchu. Jeśli jednak aplikacja wymaga skróconego czasu oczekiwania i chcesz ograniczyć liczbę zimnych startów, możesz zmienić to domyślne zachowanie, określając minimalną liczbę wystąpień kontenera, które mają być utrzymywane w stanie ciepłym i gotowym do obsługi żądań.
Podobnie możesz ustawić maksymalną liczbę, aby ograniczyć skalowanie instancji w odpowiedzi na przychodzące żądania. Użyj tego ustawienia jako sposobu kontrolowania kosztów lub ograniczenia liczby połączeń z usługą zapasową, taką jak baza danych.
Zmniejsz liczbę zimnych startów
Aby ustawić minimalną liczbę wystąpień funkcji w kodzie źródłowym, użyj parametru runWith
. Ta opcja środowiska uruchomieniowego akceptuje obiekt JSON zgodny z interfejsem RuntimeOptions
, który definiuje wartość dla minInstances
. Na przykład ta funkcja ustawia co najmniej 5 instancji, aby utrzymać ciepło:
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 rzeczy, które należy wziąć pod uwagę podczas ustawiania wartości minInstances
:
- Jeśli Cloud Functions dla Firebase skaluje Twoją aplikację powyżej ustawienia
minInstances
, każda instancja powyżej tego progu będzie uruchamiana na zimno. - Zimne starty mają najpoważniejszy wpływ na aplikacje o dużym natężeniu ruchu. Jeśli w Twojej aplikacji występuje gwałtowny ruch i ustawisz wartość
minInstances
na tyle wysoką, że zimny start będzie redukowany przy każdym wzroście ruchu, zobaczysz znacznie skrócony czas oczekiwania. W przypadku aplikacji o stałym natężeniu ruchu zimny start prawdopodobnie nie wpłynie poważnie na wydajność. Ustawienie minimalnych instancji może mieć sens w środowiskach produkcyjnych, ale zwykle należy tego unikać w środowiskach testowych. Aby skalować do zera w projekcie testowym, ale nadal ograniczać zimne starty 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ę wystąpień funkcji
Aby ustawić maksymalną liczbę wystąpień w kodzie źródłowym funkcji, użyj parametru runWith
. Ta opcja środowiska uruchomieniowego 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 jest skalowana 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 do tego czasu żadna instancja nie jest dostępna.
Aby dowiedzieć się więcej o sprawdzonych metodach korzystania z ustawień maksymalnej liczby instancji, zapoznaj się z tymi sprawdzonymi metodami dotyczącymi używania maxInstances
.
Ustaw limit czasu i alokację pamięci
W niektórych przypadkach funkcje mogą mieć specjalne wymagania dotyczące długiej wartości limitu czasu lub dużej alokacji pamięci. Możesz ustawić te wartości w Google Cloud Console 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 Firebase SDK dla Cloud Functions 2.0.0. Ta opcja środowiska uruchomieniowego 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 wyłącza się 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ść timeoutSeconds
to 540
lub 9 minut. Ilość pamięci przyznanej funkcji odpowiada procesorowi przydzielonemu dla tej funkcji, jak wyszczególniono w poniższej liście prawidłowych wartości dla memory
:
-
128MB
— 200 MHz -
256MB
— 400 MHz -
512MB
— 800 MHz -
1GB
— 1,4 GHz -
2GB
— 2,4 GHz -
4GB
— 4,8 GHz -
8GB
— 4,8 GHz
Aby ustawić alokację pamięci i limit czasu w Google Cloud Console:
- W Google Google Cloud Console wybierz Cloud Functions z lewego menu.
- Wybierz funkcję, klikając jej nazwę na liście funkcji.
- Kliknij ikonę Edytuj w górnym menu.
- Wybierz przydział pamięci z menu rozwijanego oznaczonego Przydział pamięci .
- Kliknij Więcej , aby wyświetlić opcje zaawansowane, i wprowadź liczbę sekund w polu tekstowym Limit czasu .
- Kliknij Zapisz , aby zaktualizować funkcję.