Funkcje możesz wdrażać, usuwać i modyfikować za pomocą poleceń interfejsu wiersza poleceń w 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
w tym samym czasie. Jeśli Twój projekt zawiera więcej niż 5 funkcji,
zalecamy użycie flagi --only
z konkretnymi nazwami funkcji
wdrażanie tylko tych funkcji,
edytowany przez Ciebie. Wdrażanie określonych funkcji
przyspieszy to proces wdrażania i pozwala uniknąć problemów
limity wdrożenia. Przykład:
firebase deploy --only functions:addMessage,functions:makeUppercase
W przypadku wdrażania dużej liczby funkcji może zostać przekroczona standardowy limit i otrzymywanie komunikatów o błędach HTTP 429 lub 500. Do rozwiązania W tym celu wdróż funkcje w grupach liczących nie więcej niż 10 osób.
Pełną listę dostępnych interfejsów znajdziesz w dokumentacji interfejsu wiersza poleceń Firebase. poleceń.
Domyślnie interfejs wiersza poleceń Firebase szuka w folderze functions/
kodu źródłowego. Jeśli wolisz, możesz uporzą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 sposób jednoznaczny w konsoli Google Cloud.
- domyślnie, usuwając funkcję ze źródła przed wdrożeniem.
Wszystkie operacje usuwania pojawi się prośba o potwierdzenie przed usunięciem funkcji z środowiska produkcyjnego.
Jawne usuwanie funkcji w interfejsie wiersza poleceń Firebase obsługuje wiele argumentów , a także funkcje grup i pozwala określić funkcję działającą 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 lub regiony albo aktywatory funkcji, które są obsługi ruchu produkcyjnego, wykonaj czynności opisane w tej sekcji, aby uniknąć utraty zdarzeń podczas modyfikacji. Zanim wykonasz te czynności, upewnij się, że Twoje funkcja jest idempotent, ponieważ zarówno nowa, jak i stara wersja Twojej funkcji będą uruchamiane w w tym samym czasie zmiany.
Zmienianie nazwy funkcji
Aby zmienić nazwę funkcji, utwórz w źródle nową wersję funkcji ze zmienioną nazwą
a potem uruchomić 2 osobne polecenia wdrożeniowe. Pierwsze polecenie wdraża
z nowo nazwaną funkcją, a drugie polecenie usuwa wcześniej wdrożoną funkcję
wersji. Jeśli na przykład masz funkcję w Node.js
o nazwie webhook
, które chcesz
na webhookNew
, zmień kod w następujący 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
Zmień region lub regiony funkcji
Jeśli zmieniasz określone regiony dla obsługującej ruch produkcyjny, możesz zapobiec utracie zdarzeń przez wykonując te kroki w 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 jest obecnie na
domyślny region funkcji us-central1
i chcesz go przenieść do
asia-northeast1
, musisz najpierw zmodyfikować kod źródłowy, aby zmienić nazwę
i zmieniać 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óż konfigurację, uruchamiając polecenie:
firebase deploy --only functions:webhookAsia
Uruchomione są teraz dwie identyczne funkcje: webhook
działa w us-central1
,
i webhookAsia
jest uruchomiony 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
Gdy będziesz rozwijać wdrożenie Cloud Functions for Firebase z czasem, możesz musisz zmienić typ aktywatora funkcji z różnych powodów. Przykład: możesz zmienić z jednego typu Firebase Realtime Database lub Cloud Firestore innego typu.
Nie można zmienić typu zdarzenia funkcji przez zmianę parametru
z kodem źródłowym i uruchomionym programem 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;
- Wyraźnie usuń starą funkcję z środowiska produkcyjnego za pomocą interfejsu wiersza poleceń Firebase.
Jeśli na przykład masz funkcję Node.js o nazwie objectChanged
, która korzysta ze starszej wersji
onChange
typ zdarzenia, które chcesz zmienić na onFinalize
, najpierw zmień nazwę
i zmodyfikuj ją, tak by korzystała z typu 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
Ustaw opcje środowiska wykonawczego
Cloud Functions for Firebase umożliwia wybór opcji środowiska wykonawczego, takich jak Node.js wersję środowiska wykonawczego, limit czasu dla poszczególnych funkcji, przydział pamięci oraz minimalną/maksymalną wartość w instancjach funkcji.
Zalecamy ustawienie tych opcji (oprócz wersji Node.js) na
do obiektu konfiguracji w kodzie funkcji. Ten
RuntimeOptions
jest źródłem danych dla opcji środowiska wykonawczego funkcji i będzie
opcji zastępowania ustawionych za pomocą dowolnej innej metody (np. w konsoli Google Cloud)
lub interfejsu wiersza poleceń gcloud).
Jeśli proces programowania obejmuje ręczne ustawienie opcji środowiska wykonawczego za pomocą
w konsoli Google Cloud lub w gcloud CLI, ale nie chcesz, by te wartości były
zastąpione przy każdym wdrożeniu, ustaw opcję preserveExternalChanges
na true
.
Gdy ta opcja ma wartość true
, Firebase łączy opcje środowiska wykonawczego ustawione w
z ustawieniami obecnie wdrożonej wersji Twojej funkcji
o następującym priorytecie:
- 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.
Nie zalecamy używania opcji preserveExternalChanges: true
.
dla większości scenariuszy, ponieważ
kod nie będzie już pełnym źródłem wiarygodnych opcji środowiska wykonawczego
funkcji. Jeżeli już go używasz, sprawdź konsolę Google Cloud lub użyj gcloud.
Interfejs wiersza poleceń wyświetlający pełną konfigurację funkcji.
Ustaw wersję Node.js
Pakiet SDK Firebase dla Cloud Functions umożliwia wybór środowiska wykonawczego Node.js. Możesz uruchomić wszystkie funkcje projektu wyłącznie w środowisku wykonawczym środowiska odpowiadającego 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 określić w polu engines
w narzędziu package.json
.
utworzony w katalogu functions/
podczas inicjowania.
Aby na przykład użyć tylko atrybutu
wersji 18, edytuj ten wiersz w pliku package.json
:
"engines": {"node": "18"}
Jeśli korzystasz z menedżera pakietów Yarn lub masz inne wymagania dotyczące
w polu engines
możesz określić środowisko wykonawcze pakietu SDK Firebase na platformę Cloud Functions
firebase.json
zamiast:
{
"functions": {
"runtime": "nodejs18" // or nodejs14, nodejs16 or nodejs20
}
}
Interfejs wiersza poleceń używa wartości określonej w zasadzie firebase.json
jako dowolnej wartości lub
ustawionym osobno w package.json
.
Uaktualnij środowisko wykonawcze Node.js
Aby uaktualnić środowisko wykonawcze Node.js:
- Upewnij się, że projekt jest Abonament Blaze
- Upewnij się, że używasz interfejsu wiersza poleceń Firebase w wersji 11.18.0 lub nowszej.
- Zmień wartość
engines
w plikupackage.json
, który został utworzony w katalogufunctions/
podczas inicjowania. Jeśli na przykład uaktualniasz z wersji 16 do wersji 18, wpis powinien wyglądać tak:"engines": {"node": "18"}
- Opcjonalnie przetestuj zmiany za pomocą Firebase Local Emulator Suite
- Wdróż ponownie wszystkie funkcje.
Sterowanie skalowaniem
Domyślnie Cloud Functions for Firebase skaluje liczbę uruchomionych instancji na podstawie liczby żądań przychodzących, potencjalnie skalować w dół do zera w czasach mniejszego ruchu. Jeśli jednak aplikacja wymaga ograniczenia i chcesz ograniczyć liczbę uruchomień „na zimno”, możesz zmienić to ustawienie. zachowanie domyślne, określając minimalną liczbę instancji kontenera, które mają i gotowe do obsługi żądań.
Podobnie możesz ustawić maksymalną liczbę, aby ograniczyć skalowanie instancji odpowiedzi na przychodzące żądania. Użyj tego ustawienia, aby kontrolować koszty lub ograniczyć liczbę połączeń z usługą bazową, taką jak w bazie danych.
Zmniejsz liczbę uruchomień „na zimno”
Aby ustawić minimalną liczbę instancji dla funkcji w kodzie źródłowym, użyj funkcji
runWith
. Ta metoda akceptuje obiekt JSON zgodny z
RuntimeOptions
który definiuje wartość dla minInstances
. Przykład:
ta funkcja ustawia co najmniej 5 instancji, które mają utrzymać się 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 należy wziąć pod uwagę podczas ustawiania wartości w polu minInstances
:
- Jeśli Cloud Functions for Firebase skaluje aplikację powyżej ustawienia
minInstances
, zainicjujesz uruchomienie „na zimno” w każdej instancji powyżej tego progu. - Zimne uruchomienia mają najpoważniejszy wpływ na aplikacje o dużym natężeniu ruchu. Jeśli
generuje duży ruch w aplikacji, a ustawiona wartość
minInstances
jest wystarczająco wysoka, uruchomienia „na zimno” przy każdym wzroście ruchu zmniejszają się, zauważysz znaczne i skrócenie czasu oczekiwania. W przypadku aplikacji ze stałym ruchem uruchomienia „na zimno” nie są które mogą znacznie wpłynąć na wydajność. Ustawienie minimalnej liczby instancji może być przydatne w środowiskach produkcyjnych, ale należy unikać w środowiskach testowych. Aby skalować do zera w i jednocześnie ograniczyć uruchomienia „na zimno” w projekcie produkcyjnym, można 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 funkcji
runWith
. Ta metoda akceptuje obiekt JSON zgodny z
RuntimeOptions
który definiuje
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 zostaną
w kolejce przez 30 sekund, a następnie odrzucona 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 ustawienia maksymalnej liczby instancji, zapoznaj się z artykułem
wyrzuć te
sprawdzone metody korzystania z platformy maxInstances
.
Ustaw limit czasu i przydział pamięci
W niektórych przypadkach funkcje mogą mieć specjalne wymagania dotyczące długiego czasu oczekiwania lub znaczną ilość pamięci. Te wartości możesz ustawić w Konsola 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 funkcji
runWith
wprowadzony w pakiecie SDK Firebase w wersji Cloud Functions 2.0.0. Ta opcja środowiska wykonawczego akceptuje
obiekt JSON zgodny z
RuntimeOptions
który definiuje wartości timeoutSeconds
i memory
.
Na przykład ta funkcja przechowywania wykorzystuje 1 GB pamięci i limit czasu wynosi po
300 sekund:
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 przyznanej funkcji odpowiada przydzielonemu procesorowi
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 Google wybierz Cloud Functions menu po lewej stronie.
- 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ę.