Zarządzaj funkcjami


Funkcje możesz wdrażać, usuwać i modyfikować za pomocą poleceń 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 wiersza poleceń Firebase:

firebase deploy --only functions

Domyślnie wiersz poleceń Firebase wdraża wszystkie funkcje w Twoim źródle 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 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 tego uniknąć, stosuj funkcje w grupach liczących co najwyżej 10 elementów.

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 kodzie źródłowym lub w kilku zestawach plików.

Usuwanie funkcji

Wcześniej wdrożone funkcje możesz usunąć na 2 sposoby:

  • wyraźnie w interfejsie wiersza poleceń Firebase za pomocą polecenia functions:delete.
  • w sposób jednoznaczny w konsoli Google Cloud.
  • Domyślnie, usuwając funkcję z ź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.

Zmiana nazwy, regionu lub aktywatora funkcji

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 funkcja jest idempotentna, ponieważ podczas zmiany będą działać jednocześnie nowa i stara wersja funkcji.

Zmiana 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 funkcję o nowej nazwie, a drugie usuwa wcześniej wdrożony wariant. Jeśli np. 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

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:

  1. Zmień nazwę funkcji i w razie potrzeby zmień jej region lub regiony.
  2. Wdróż przemianowaną funkcję, co spowoduje tymczasowe uruchomienie tego samego kodu w obu zestawach regionów.
  3. Usuń poprzednią funkcję.

Jeśli na przykład masz funkcję o nazwie webhook, która obecnie znajduje się 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óż, wykonując te czynności:

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 jest tylko jedna funkcja – webhookAsia, która działa w ramach 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. Możesz na przykład zmienić jeden typ zdarzenia Firebase Realtime Database lub Cloud Firestore na inny.

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

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

Zgodnie ze sprawdzoną metodą te opcje (z wyjątkiem wersji Node.js) powinny być ustawiane w obiekcie konfiguracji w kodzie funkcji. Ten obiekt RuntimeOptions jest źródłem informacji o opcjach czasu wykonywania funkcji i zastąpi opcje ustawione za pomocą dowolnej innej metody (np. w konsoli Google Cloud lub w interfejsie wiersza poleceń gcloud).

Jeśli Twój proces rozwoju obejmuje ręczne ustawianie opcji czasu wykonywania w konsoli Google Cloud lub interfejsie wiersza poleceń gcloud i nie chcesz, aby te wartości były zastępowane przy każdym wdrożeniu, ustaw opcję preserveExternalChanges na true. Gdy ta opcja jest ustawiona na true, Firebase scala opcje środowiska wykonawczego określone w kodzie z ustawieniami obecnie wdrożonej wersji funkcji z tym priorytetem:

  1. Opcja jest ustawiona w kodzie funkcji: zastąp zmiany zewnętrzne.
  2. Opcja jest ustawiona na RESET_VALUE w kodzie funkcji: zastąpij zmiany zewnętrzne wartością domyślną.
  3. 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.

Ustawianie wersji Node.js

Pakiet SDK Firebase dla usługi Cloud Functions umożliwia wybranie ś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 ustawić w polu engines w pliku package.json, który został utworzony w katalogu functions/ podczas inicjalizacji. Aby na przykład używać tylko wersji 18, w pliku package.json zmodyfikuj ten wiersz:

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

  1. Upewnij się, że Twój projekt jest objęty abonamentem Blaze.
  2. Upewnij się, że używasz interfejsu wiersza poleceń Firebase w wersji 11.18.0 lub nowszej.
  3. Zmień wartość engines w pliku package.json, który został utworzony katalogu functions/ podczas inicjowania. Jeśli na przykład przechodzisz z wersji 16 na wersję 18, wpis powinien wyglądać tak: "engines": {"node": "18"}
  4. Opcjonalnie możesz przetestować zmiany za pomocą Firebase Local Emulator Suite.
  5. ponownie wdrożyć 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 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 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. Na przykład ta funkcja ustawia minimalną liczbę instancji na 5, aby utrzymać je w stanie 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, 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 ś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ę instancji funkcji

Aby ustawić maksymalną liczbę instancji w kodzie źródłowym funkcji, użyj funkcji runWith . Ta metoda przyjmuje obiekt JSON zgodny z interfejsem RuntimeOptions, który definiuje wartości dla maxInstances. Na przykład ta funkcja ustawia limit 100 instansji, 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 zostaną dodano do kolejki 30 sekund, a następnie został odrzucony 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ć alokację pamięci i limit czasu w kodzie źródłowym funkcji, użyj parametru runWith, który został wprowadzony w pakiecie SDK Firebase w wersji Cloud Functions 2.0.0. Ta opcja czasu wykonywania akceptuje obiekt JSON zgodny z interfejsem 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 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 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 konsoli Google Cloud:

  1. W konsoli Google Google Cloud w menu po lewej stronie wybierz Cloud Functions.
  2. Wybierz funkcję, klikając jej nazwę na liście funkcji.
  3. W górnym menu kliknij ikonę Edytuj.
  4. W menu Przydzielona pamięć wybierz przydział pamięci.
  5. Kliknij Więcej, aby wyświetlić opcje zaawansowane, i wpisz liczbę sekund w polu tekstowym Limit czasu.
  6. Kliknij Zapisz, aby zaktualizować funkcję.