Join us in person and online for Firebase Summit on October 18, 2022. Learn how Firebase can help you accelerate app development, release your app with confidence, and scale with ease. Register now

Zarządzaj funkcjami

Zadbaj o dobrą organizację dzięki kolekcji Zapisuj i kategoryzuj treści zgodnie ze swoimi preferencjami.

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 interfejs 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.

Pełna lista dostępnych poleceń znajduje się w dokumentacji Firebase CLI .

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 w Google Cloud Console .
  • 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 wiersza polecenia Firebase 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ę, region lub wyzwalacz funkcji

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 dwa oddzielne polecenia 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ę ze środowiska produkcyjnego 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 minimalne/maksymalne wystąpienia 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 interfejsu 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 wystąpień 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 metody runWith . Ta metoda 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 Twoja aplikacja ma gwałtowny ruch i ustawisz wartość minInstances na tyle wysoką, że zimne uruchomienia są zmniejszane 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 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 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 Pamięć przydzielona .
  5. Kliknij Więcej , aby wyświetlić opcje zaawansowane, i wprowadź liczbę sekund w polu tekstowym Limit czasu .
  6. Kliknij Zapisz , aby zaktualizować funkcję.