Check out what’s new from Firebase at Google I/O 2022. Learn more

Zarządzaj wdrażaniem funkcji i opcjami środowiska uruchomieniowego

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:

  1. Zmień nazwę funkcji i zmień jej region lub regiony zgodnie z potrzebami.
  2. Wdróż funkcję o zmienionej nazwie, co spowoduje tymczasowe uruchomienie tego samego kodu w obu zestawach regionów.
  3. 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 zdarzenia onFinalize , onDelete , onArchive i onMetadataUpdate . (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 zdarzenie onCreate .

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ę:

  1. Zmodyfikuj kod źródłowy, aby zawierał nową funkcję z żądanym typem wyzwalacza.
  2. Wdróż funkcję, co spowoduje tymczasowe uruchomienie zarówno starej, jak i nowej funkcji.
  3. 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:

  1. Upewnij się, że Twój projekt jest objęty planem cenowym Blaze .
  2. Upewnij się, że używasz Firebase CLI w wersji 9.17.0 lub nowszej.
  3. Zmień wartość engines w pliku package.json , który został utworzony w katalogu functions/ podczas inicjowania. Na przykład, jeśli aktualizujesz wersję 10 do wersji 16, wpis powinien wyglądać tak: "engines": {"node": "16"}
  4. Opcjonalnie przetestuj zmiany za pomocą pakietu Firebase Local Emulator Suite .
  5. 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 środowiskowej FIREBASE_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:

  1. W Google Google Cloud Console wybierz Cloud Functions z lewego menu.
  2. Wybierz funkcję, klikając jej nazwę na liście funkcji.
  3. Kliknij ikonę Edytuj w górnym menu.
  4. Wybierz przydział pamięci z menu rozwijanego oznaczonego Przydział pamięci .
  5. Kliknij Więcej , aby wyświetlić opcje zaawansowane, i wprowadź liczbę sekund w polu tekstowym Limit czasu .
  6. Kliknij Zapisz , aby zaktualizować funkcję.