Управление функциями


Вы можете развертывать, удалять и изменять функции с помощью команд Firebase CLI или путем установки параметров выполнения в исходном коде функций.

Развертывание функций

Чтобы развернуть функции, выполните следующую команду Firebase CLI:

firebase deploy --only functions

По умолчанию Firebase CLI развёртывает все функции из исходного кода одновременно. Если ваш проект содержит более 5 функций, мы рекомендуем использовать флаг --only с указанием имён функций, чтобы развернуть только те функции, которые вы отредактировали. Развёртывание отдельных функций таким способом ускоряет процесс развёртывания и помогает избежать превышения квот развёртывания. Например:

firebase deploy --only functions:addMessage,functions:makeUppercase

При развертывании большого количества функций вы можете превысить стандартную квоту и получить сообщения об ошибках HTTP 429 или 500. Чтобы решить эту проблему, развертывайте функции группами по 10 или менее.

Полный список доступных команд смотрите в справочнике Firebase CLI .

По умолчанию Firebase CLI ищет исходный код в папке functions/ . При желании вы можете организовать функции в кодовые базы или несколько наборов файлов.

Очистка артефактов развертывания

В рамках развертывания функций образы контейнеров генерируются и сохраняются в Artifact Registry . Эти образы не требуются для запуска развернутых функций; Cloud Functions извлекает и сохраняет копию образа при первоначальном развертывании, но сохранённые артефакты не требуются для работы функции во время выполнения.

Хотя эти образы контейнеров часто имеют небольшой размер, со временем они могут накапливаться и увеличивать расходы на хранение. Вы можете сохранить их на некоторое время, если планируете проверять созданные артефакты или проводить сканирование контейнеров на уязвимости.

Для управления расходами на хранение Firebase CLI 14.0.0 и выше позволяет настраивать политику очистки Artifact Registry для репозиториев, в которых хранятся артефакты развертывания после каждого развертывания функции.

Вы можете вручную настроить или отредактировать политику очистки с помощью functions:artifacts:setpolicy :

firebase functions:artifacts:setpolicy

По умолчанию эта команда настраивает Artifact Registry на автоматическое удаление образов контейнеров старше 1 дня. Это обеспечивает разумный баланс между минимизацией затрат на хранение и возможностью проверки последних сборок.

Вы можете настроить период хранения с помощью параметра --days :

firebase functions:artifacts:setpolicy --days 7  # Delete images older than 7 days

Если вы развертываете функции в нескольких регионах, вы можете настроить политику очистки для определенного местоположения с помощью параметра --location :

$ firebase functions:artifacts:setpolicy --location europe-west1

Отказаться от очистки артефактов

Если вы предпочитаете управлять очисткой изображений вручную или не хотите удалять изображения, вы можете полностью отказаться от политик очистки:

$ firebase functions:artifacts:setpolicy --none

Эта команда удаляет любую существующую политику очистки, настроенную Firebase CLI, и не позволяет Firebase настраивать политику очистки после развертывания функций.

Удалить функции

Удалить ранее развернутые функции можно следующими способами:

  • явно в Firebase CLI с помощью functions:delete
  • явно в консоли Google Cloud .
  • неявно, путем удаления функции из источника перед развертыванием.

Все операции по удалению запрашивают подтверждение перед удалением функции из производства.

Явное удаление функций в Firebase CLI поддерживает несколько аргументов и группы функций, а также позволяет указать функцию, работающую в определённом регионе. Кроме того, можно переопределить запрос подтверждения.

# 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

При неявном удалении функций firebase deploy анализирует ваш исходный код и удаляет из производства все функции, которые были удалены из файла.

Изменить имя, регион или триггер функции

Если вы переименовываете или изменяете регионы или триггеры для функций, обрабатывающих производственный трафик, следуйте инструкциям в этом разделе, чтобы избежать потери событий во время изменения. Прежде чем выполнять эти шаги, убедитесь, что ваша функция является идемпотентной , поскольку во время изменения обе версии функции будут выполняться одновременно.

Переименовать функцию

Чтобы переименовать функцию, создайте новую переименованную версию функции в исходном коде, а затем выполните две отдельные команды развёртывания. Первая команда развёртывает функцию с новым именем, а вторая удаляет ранее развёрнутую версию. Например, если у вас есть HTTP-перехват, который вы хотите переименовать, измените код следующим образом:

Node.js

// before
const {onRequest}  = require('firebase-functions/v2/https');

exports.webhook = onRequest((req, res) => {
    res.send("Hello");
});

// after
const {onRequest}  = require('firebase-functions/v2/https');

exports.webhookNew = onRequest((req, res) => {
    res.send("Hello");
});

Питон

# before
from firebase_functions import https_fn

@https_fn.on_request()
def webhook(req: https_fn.Request) -> https_fn.Response:
    return https_fn.Response("Hello world!")

# after
from firebase_functions import https_fn

@https_fn.on_request()
def webhook_new(req: https_fn.Request) -> https_fn.Response:
    return https_fn.Response("Hello world!")

Затем выполните следующие команды для развертывания новой функции:

# Deploy new function
firebase deploy --only functions:webhookNew

# Wait until deployment is done; now both functions are running

# Delete webhook
firebase functions:delete webhook

Изменить регион или регионы функции

Если вы изменяете указанные регионы для функции, обрабатывающей производственный трафик, вы можете предотвратить потерю событий, выполнив следующие действия в указанном порядке:

  1. Переименуйте функцию и измените ее область или области по желанию.
  2. Разверните переименованную функцию, что приведет к временному запуску одного и того же кода в обоих наборах регионов.
  3. Удалить предыдущую функцию.

Например, если у вас есть функция, запускаемая Cloud Firestore , которая в настоящее время находится в области функций по умолчанию us-central1 , и вы хотите перенести ее в asia-northeast1 , вам необходимо сначала изменить исходный код, чтобы переименовать функцию и изменить область.

Node.js

// before
exports.firestoreTrigger = onDocumentCreated(
  "my-collection/{docId}",
  (event) => {},
);

// after
exports.firestoreTriggerAsia = onDocumentCreated(
  {
    document: "my-collection/{docId}",
    region: "asia-northeast1",
  },
  (event) => {},
);

В обновлённом коде необходимо указать правильный фильтр событий (в данном случае document ) и регион. Подробнее см. в разделе «Расположения Cloud Functions .

Питон

# Before
@firestore_fn.on_document_created("my-collection/{docId}")
def firestore_trigger(event):
    pass

# After
@firestore_fn.on_document_created("my-collection/{docId}",
                                  region="asia-northeast1")
def firestore_trigger_asia(event):
    pass

Затем выполните развертывание, выполнив:

firebase deploy --only functions:firestoreTriggerAsia

Теперь запущены две идентичные функции: firestoreTrigger работает в us-central1 , а firestoreTriggerAsia работает в asia-northeast1 .

Затем удалите firestoreTrigger :

firebase functions:delete firestoreTrigger

Теперь есть только одна функция — firestoreTriggerAsia , которая работает в asia-northeast1 .

Изменить тип триггера функции

По мере развития развертывания Cloud Functions for Firebase вам может потребоваться изменить тип триггера функции по разным причинам. Например, вам может потребоваться перейти с одного типа событий Firebase Realtime Database или Cloud Firestore на другой.

Невозможно изменить тип события функции, просто изменив исходный код и запустив firebase deploy . Чтобы избежать ошибок, измените тип триггера функции следующим образом:

  1. Измените исходный код, включив новую функцию с желаемым типом триггера.
  2. Развертывание функции, приводящее к временному запуску как старой, так и новой функций.
  3. Явно удалите старую функцию из производства с помощью Firebase CLI.

Например, если у вас была функция, которая срабатывала при удалении объекта, но затем вы включили управление версиями объектов и вместо этого хотели бы подписаться на событие архива, сначала переименуйте функцию и отредактируйте ее, указав новый тип триггера.

Node.js

// before
const {onObjectDeleted} = require("firebase-functions/v2/storage");

exports.objectDeleted = onObjectDeleted((event) => {
    // ...
});

// after
const {onObjectArchived} = require("firebase-functions/v2/storage");

exports.objectArchived = onObjectArchived((event) => {
    // ...
});

Питон

# before
from firebase_functions import storage_fn

@storage_fn.on_object_deleted()
def object_deleted(event):
  # ...

# after 
from firebase_functions import storage_fn

@storage_fn.on_object_archived()
def object_archived(event):
  # ...

Затем выполните следующие команды, чтобы сначала создать новую функцию, прежде чем удалять старую функцию:

# Create new function objectArchived
firebase deploy --only functions:objectArchived

# Wait until deployment is done; now both objectDeleted and objectArchived are running

# Delete objectDeleted
firebase functions:delete objectDeleted

Установить параметры выполнения

Cloud Functions for Firebase позволяет выбирать параметры среды выполнения, такие как версия среды выполнения Node.js, тайм-аут для каждой функции, выделение памяти и минимальное/максимальное количество экземпляров функции.

Рекомендуется задавать эти параметры (за исключением версии Node.js) в объекте конфигурации внутри кода функции. Этот объект RuntimeOptions является источником истинных параметров выполнения вашей функции и переопределяет параметры, заданные любым другим способом (например, через консоль Google Cloud или интерфейс командной строки gcloud).

Если ваш рабочий процесс разработки предполагает ручную настройку параметров среды выполнения через консоль Google Cloud или интерфейс командной строки gcloud, и вы не хотите, чтобы эти значения переопределялись при каждом развертывании, установите для параметра preserveExternalChanges значение true . Если этот параметр установлен в true , Firebase объединяет параметры среды выполнения, заданные в вашем коде, с настройками текущей развернутой версии вашей функции со следующим приоритетом:

  1. В коде функций установлена опция: переопределить внешние изменения.
  2. В коде функций параметру присвоено значение RESET_VALUE : переопределять внешние изменения значением по умолчанию.
  3. Параметр не задан в коде функции, но задан в текущей развернутой функции: используйте параметр, указанный в развернутой функции.

Использование параметра preserveExternalChanges: true не рекомендуется в большинстве случаев, поскольку ваш код больше не будет единственным источником информации о параметрах времени выполнения ваших функций. Если вы всё же используете его, проверьте консоль Google Cloud или используйте интерфейс командной строки gcloud для просмотра полной конфигурации функции.

Установить версию Node.js

Firebase SDK для Cloud Functions позволяет выбрать среду выполнения Node.js. Вы можете выбрать запуск всех функций проекта исключительно в среде выполнения, соответствующей одной из следующих поддерживаемых версий Node.js:

  • Node.js 22
  • Node.js 20
  • Node.js 18 (устарело)

Версии Node.js 14 и 16 были выведены из эксплуатации в начале 2025 года. Развёртывание с использованием этих версий отключено. Важную информацию о текущей поддержке этих версий Node.js см. в графике поддержки.

Чтобы установить версию Node.js:

Вы можете указать версию в поле engines файла package.json , созданного в каталоге functions/ во время инициализации. Например, чтобы использовать только версию 20, отредактируйте эту строку в package.json :

  "engines": {"node": "20"}

Если вы используете менеджер пакетов Yarn или у вас есть другие особые требования к области engines , вы можете вместо этого установить среду выполнения для Firebase SDK для Cloud Functions в firebase.json :

  {
    "functions": {
      "runtime": "nodejs20" // or nodejs22
    }
  }

CLI использует значение, заданное в firebase.json , в качестве приоритета перед любым значением или диапазоном, заданным отдельно в package.json .

Обновите среду выполнения Node.js

Чтобы обновить среду выполнения Node.js:

  1. Убедитесь, что ваш проект включен в тарифный план Blaze .
  2. Убедитесь, что вы используете Firebase CLI v11.18.0 или более позднюю версию.
  3. Измените значение параметра engines в файле package.json , созданном в каталоге functions/ во время инициализации. Например, при обновлении с версии 18 до версии 20 запись должна выглядеть так: "engines": {"node": "20"}
  4. При желании протестируйте свои изменения с помощью Firebase Local Emulator Suite .
  5. Перераспределить все функции.

Установить версию Python

Firebase SDK for Cloud Functions версии 12.0.0 и выше позволяет выбрать среду выполнения Python. Укажите версию среды выполнения в firebase.json , как показано ниже:

  {
    "functions": {
      "runtime": "python310" // or python311
    }
  }

Управление поведением масштабирования

По умолчанию Cloud Functions for Firebase масштабирует количество запущенных экземпляров в зависимости от количества входящих запросов, потенциально уменьшая их количество до нуля в периоды снижения трафика. Однако, если вашему приложению требуется снижение задержки и вы хотите ограничить количество холодных запусков, вы можете изменить это поведение по умолчанию, указав минимальное количество экземпляров контейнера, которые должны поддерживаться в состоянии готовности к обслуживанию запросов.

Аналогичным образом вы можете установить максимальное количество, чтобы ограничить масштабирование экземпляров в ответ на входящие запросы. Используйте этот параметр для контроля расходов или ограничения количества подключений к резервной службе, например, к базе данных.

Используя эти настройки вместе с настройкой параллелизма для каждого экземпляра (новинка второго поколения), вы можете контролировать и настраивать масштабирование ваших функций. Характер вашего приложения и функции определит, какие настройки будут наиболее экономичными и обеспечат максимальную производительность.

Для некоторых приложений с низким трафиком оптимальным вариантом будет вариант с пониженной загрузкой ЦП без многопоточности. Для других, где холодный запуск критически важен, установка высокой степени параллелизма и минимального количества экземпляров означает, что набор экземпляров всегда будет поддерживаться в «тепле» для обработки больших пиков трафика.

Для небольших приложений с небольшим трафиком установка низкого максимального количества экземпляров при высокой степени параллелизма означает, что приложение сможет обрабатывать пики трафика без чрезмерных затрат. Однако имейте в виду, что при слишком низком максимальном количестве экземпляров запросы могут отбрасываться при достижении предельного значения.

Разрешить одновременные запросы

В Cloud Functions for Firebase (1-го поколения) каждый экземпляр мог обрабатывать один запрос одновременно, поэтому масштабирование задавалось только настройками минимального и максимального количества экземпляров. Помимо управления количеством экземпляров, в Cloud Functions for Firebase (2-го поколения) можно управлять количеством запросов, которые каждый экземпляр может обрабатывать одновременно, с помощью параметра concurrency . Значение по умолчанию для параллелизма — 80, но вы можете задать любое целое число от 1 до 1000.

Функции с более высокими настройками параллелизма могут справляться с пиками трафика без холодного запуска, поскольку у каждого экземпляра, вероятно, есть некоторый запас. Если экземпляр настроен на обработку до 50 одновременных запросов, но в настоящее время обрабатывает только 25, он может обработать пик в 25 дополнительных запросов без необходимости запуска нового экземпляра для холодного запуска. Напротив, при настройке параллелизма всего 1 такой пик запросов может привести к 25 холодным запускам.

Этот упрощённый сценарий демонстрирует потенциальный рост эффективности за счёт параллельного выполнения. В реальности масштабирование для оптимизации эффективности и сокращения количества холодных запусков при параллельном выполнении более сложно. Параллелизм в Cloud Functions for Firebase 2-го поколения реализован на базе Cloud Run и соответствует правилам Cloud Run для автоматического масштабирования экземпляров контейнеров .

При экспериментах с более высокими настройками параллелизма в Cloud Functions for Firebase (2-го поколения) имейте в виду следующее:

  • Более высокие настройки параллелизма могут потребовать более высокой производительности ЦП и оперативной памяти для достижения практического предела. Например, функции, выполняющей интенсивную обработку изображений или видео, может не хватать ресурсов для обработки 1000 одновременных запросов, даже если её настройки ЦП и оперативной памяти максимальны.
  • Поскольку Cloud Functions for Firebase (2-го поколения) работает на базе Cloud Run , вы также можете обратиться к руководству Google Cloud по оптимизации параллелизма .
  • Обязательно тщательно протестируйте многопараллельность в тестовой среде, прежде чем переходить к многопараллельности в производственной среде.

Поддерживайте минимальное количество экземпляров в тепле

Вы можете задать минимальное количество экземпляров функции в исходном коде. Например, эта функция устанавливает минимум 5 экземпляров для поддержания заданного времени:

Node.js

const { onCall } = require("firebase-functions/v2/https");

exports.getAutocompleteResponse = onCall(
  {
    // Keep 5 instances warm for this latency-critical function
    minInstances: 5,
  },
  (event) => {
    // Autocomplete user’s search term
  }
);

Питон

@https_fn.on_call(min_instances=5)
def get_autocomplete_response(event: https_fn.CallableRequest) -> https_fn.Response:

Вот некоторые моменты, которые следует учитывать при установке минимального значения количества экземпляров:

  • Если Cloud Functions for Firebase масштабирует ваше приложение выше указанного вами значения, вы столкнетесь с холодным запуском для каждого экземпляра, превышающего этот порог.
  • Холодные запуски оказывают наиболее сильное влияние на приложения с резкими скачками трафика. Если у вашего приложения резкие скачки трафика и вы установите достаточно высокое значение, чтобы количество холодных запусков уменьшалось при каждом увеличении трафика, вы увидите значительное снижение задержки. Для приложений с постоянным трафиком холодные запуски, скорее всего, не окажут существенного влияния на производительность.
  • Установка минимального количества экземпляров может быть целесообразна в производственных средах, но обычно её следует избегать в тестовых. Чтобы масштабировать тестовый проект до нуля, но при этом сократить количество холодных запусков в производственном проекте, можно задать минимальное количество экземпляров в параметризованной конфигурации:

    Node.js

    const functions = require('firebase-functions/v1');
    const { defineInt, defineString } = require('firebase-functions/params');
    
    // Define some parameters
    const minInstancesConfig = defineInt('HELLO_WORLD_MININSTANCES');
    const welcomeMessage = defineString('WELCOME_MESSAGE');
    
    // To use configured parameters inside the config for a function, provide them 
    // directly. To use them at runtime, call .value() on them.
    export const helloWorld = functions.runWith({ minInstances: minInstancesConfig}).https.onRequest(
      (req, res) => {
        res.send(`${welcomeMessage.value()}! I am a function.`);
      }
    );
    

    Питон

    MIN_INSTANCES = params.IntParam("HELLO_WORLD_MININSTANCES")
    WELCOME_MESSAGE = params.StringParam("WELCOME_MESSAGE")
    
    @https_fn.on_request(min_instances=MIN_INSTANCES.value())
    def get_autocomplete_response(event: https_fn.Request) -> https_fn.Response:
        return https_fn.Response(f"{WELCOME_MESSAGE.value()} I'm a function.")
    

Ограничить максимальное количество экземпляров функции

Вы можете задать максимальное количество экземпляров в исходном коде функции. Например, эта функция устанавливает ограничение в 100 экземпляров, чтобы не перегружать гипотетическую устаревшую базу данных:

Node.js

const { onMessagePublished } = require("firebase-functions/v2/pubsub");

exports.mirrorevents = onMessagePublished(
  { topic: "topic-name", maxInstances: 100 },
  (event) => {
    // Connect to legacy database
  }
);

Питон

@pubsub_fn.on_message_published(topic="topic-name", max_instances=100)
def mirrorevents(event: pubsub_fn.CloudEvent):
#  Connect to legacy database

Если HTTP-функция масштабируется до максимального предела экземпляров, новые запросы помещаются в очередь на 30 секунд, а затем отклоняются с кодом ответа 429 Too Many Requests если к тому времени ни один экземпляр не будет доступен.

Чтобы узнать больше о передовых методах использования настроек максимального количества экземпляров, ознакомьтесь с этими передовыми методами настройки максимального количества экземпляров .

Установить тайм-аут и выделение памяти

В некоторых случаях ваши функции могут предъявлять особые требования к длительному тайм-ауту или выделению большого объёма памяти. Вы можете задать эти значения либо в консоли Google Cloud , либо в исходном коде функции (только Firebase).

Чтобы настроить выделение памяти и время ожидания в исходном коде функций, используйте глобальные параметры памяти и времени ожидания (в секундах), чтобы настроить виртуальную машину, на которой выполняются ваши функции. Например, эта функция Cloud Storage использует 1 ГиБ памяти и время ожидания истекает через 300 секунд:

Node.js

exports.convertLargeFile = onObjectFinalized({
  timeoutSeconds: 300,
  memory: "1GiB",
}, (event) => {
  // Do some complicated things that take a lot of memory and time
});

Питон

@storage_fn.on_object_finalized(timeout_sec=300, memory=options.MemoryOption.GB_1)
def convert_large_file(event: storage_fn.CloudEvent):
# Do some complicated things that take a lot of memory and time.

Максимальное значение тайм-аута составляет 540 секунд или 9 минут.

Чтобы настроить распределение памяти и время ожидания в консоли Google Cloud :

  1. В консоли Google Cloud выберите Cloud Functions for Firebase в левом меню.
  2. Выберите функцию, щелкнув ее имя в списке функций.
  3. Нажмите значок «Изменить» в верхнем меню.
  4. Выберите распределение памяти из раскрывающегося меню Выделенная память .
  5. Нажмите «Дополнительно» , чтобы отобразить расширенные параметры, и введите количество секунд в текстовое поле «Время ожидания» .
  6. Нажмите «Сохранить» , чтобы обновить функцию.

Переопределить настройки ЦП по умолчанию

При выделении до 2 ГБ памяти каждая функция в Cloud Functions for Firebase (2-го поколения) по умолчанию использует один ЦП, а затем увеличивается до двух ЦП для 4 и 8 ГБ. Обратите внимание, что это существенно отличается от поведения по умолчанию в 1-м поколении , что может привести к небольшому повышению затрат на функции с низким потреблением памяти, как показано в следующей таблице:

Выделенная ОЗУ Процессор по умолчанию версии 1 (дробный) Процессор версии 2 по умолчанию Повышение цены за мс
128 МБ 1/12 1 10,5x
256 МБ 1/6 1 5.3x
512 МБ 1/3 1 2.7x
1 ГБ 7/12 1 1,6x
2 ГБ 1 1 1x
4ГБ 2 2 1x
8 ГБ 2 2 1x
16 Гб н/д 4 н/д

Если вы предпочитаете поведение 1-го поколения для функций 2-го поколения, установите значения по умолчанию 1-го поколения как глобальную опцию:

Node.js

// Turn off Firebase defaults
setGlobalOptions({ cpu: 'gcf_gen1' });

Питон

# Use 1st gen behavior
set_global_options(cpu="gcf_gen1")

Для ресурсоёмких задач процессоры второго поколения обеспечивают гибкость настройки дополнительных процессоров. Вы можете увеличивать производительность процессора для каждой функции отдельно, как показано ниже:

Node.js

// Boost CPU in a function:
export const analyzeImage = onObjectFinalized({ cpu: 2 }, (event) => {
  // computer vision goes here
});

Питон

# Boost CPU in a function:
@storage_fn.on_object_finalized(cpu=2)
def analyze_image(event: storage_fn.CloudEvent):
# computer vision goes here