Вы можете развертывать, удалять и изменять функции с помощью команд 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
Изменить регион или регионы функции
Если вы изменяете указанные регионы для функции, обрабатывающей производственный трафик, вы можете предотвратить потерю событий, выполнив следующие действия в указанном порядке:
- Переименуйте функцию и измените ее область или области по желанию.
- Разверните переименованную функцию, что приведет к временному запуску одного и того же кода в обоих наборах регионов.
- Удалить предыдущую функцию.
Например, если у вас есть функция, запускаемая 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 locations для получения дополнительной информации.
Питон
# 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
. Чтобы избежать ошибок, измените тип триггера функции с помощью этой процедуры:
- Измените исходный код, включив новую функцию с желаемым типом триггера.
- Разверните функцию, что приведет к временному запуску как старой, так и новой функций.
- Явно удалите старую функцию из производства с помощью 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 CLI).
Если ваш рабочий процесс разработки включает ручную настройку параметров среды выполнения через консоль Google Cloud или gcloud CLI и вы не хотите, чтобы эти значения переопределялись при каждом развертывании, установите для параметра preserveExternalChanges
значение true
. Если для этого параметра установлено значение true
, Firebase объединяет параметры среды выполнения, заданные в вашем коде, с настройками текущей развернутой версии вашей функции со следующим приоритетом:
- В коде функций установлена опция: переопределять внешние изменения.
- В коде функций параметру присвоено значение
RESET_VALUE
: переопределять внешние изменения значением по умолчанию. - Параметр не задан в коде функции, но задан в текущей развернутой функции: используйте параметр, указанный в развернутой функции.
Использование параметра preserveExternalChanges: true
не рекомендуется для большинства сценариев, поскольку ваш код больше не будет полным источником истины для параметров времени выполнения для ваших функций. Если вы его используете, проверьте консоль Google Cloud или используйте gcloud CLI для просмотра полной конфигурации функции.
Установить версию 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:
Вы можете установить версию в поле engines
в файле package.json
, который был создан в вашем каталоге functions/
во время инициализации. Например, чтобы использовать только версию 18, отредактируйте эту строку в package.json
:
"engines": {"node": "20"}
Если вы используете менеджер пакетов Yarn или у вас есть другие особые требования к области engines
, вы можете вместо этого установить среду выполнения для Firebase SDK для Cloud Functions в firebase.json
:
{
"functions": {
"runtime": "nodejs18" // or nodejs20
}
}
CLI использует значение, заданное в firebase.json
в качестве приоритета по сравнению с любым значением или диапазоном, которые вы задаете отдельно в package.json
.
Обновите среду выполнения Node.js
Чтобы обновить среду выполнения Node.js:
- Убедитесь, что ваш проект включен в тарифный план Blaze .
- Убедитесь, что вы используете Firebase CLI v11.18.0 или более позднюю версию.
- Измените значение
engines
в файлеpackage.json
, который был создан в вашем каталогеfunctions/
во время инициализации. Например, если вы обновляетесь с версии 18 до версии 20, запись должна выглядеть так:"engines": {"node": "20"}
- При желании протестируйте свои изменения с помощью Firebase Local Emulator Suite .
- Перераспределить все функции.
Установить версию Python
Firebase SDK for Cloud Functions версии 12.0.0 и выше позволяет выбирать среду выполнения Python. Установите версию среды выполнения в firebase.json
, как показано:
{
"functions": {
"runtime": "python310" // or python311
}
}
Управление поведением масштабирования
По умолчанию Cloud Functions for Firebase масштабирует количество запущенных экземпляров на основе количества входящих запросов, потенциально уменьшая количество экземпляров до нуля в периоды снижения трафика. Однако, если вашему приложению требуется уменьшенная задержка и вы хотите ограничить количество холодных запусков, вы можете изменить это поведение по умолчанию, указав минимальное количество экземпляров контейнера, которые будут поддерживаться в тепле и готовыми обслуживать запросы.
Аналогично, вы можете установить максимальное число, чтобы ограничить масштабирование экземпляров в ответ на входящие запросы. Используйте эту настройку как способ контролировать свои расходы или ограничить количество подключений к резервной службе, например, к базе данных.
Используя эти настройки вместе с настройкой параллелизма для каждого экземпляра (новая во 2-м поколении), вы можете контролировать и настраивать поведение масштабирования для ваших функций. Характер вашего приложения и функции определит, какие настройки наиболее экономичны и приведут к лучшей производительности.
Для некоторых приложений с низким трафиком оптимальным вариантом будет более низкий ЦП без многопараллелизма. Для других, где холодный запуск является критической проблемой, установка высокого параллелизма и минимального количества экземпляров означает, что набор экземпляров всегда поддерживается в тепле для обработки больших скачков трафика.
Для приложений меньшего масштаба, которые получают очень мало трафика, установка низкого максимального количества экземпляров с высоким параллелизмом означает, что приложение может обрабатывать всплески трафика без чрезмерных затрат. Однако имейте в виду, что если установить слишком низкое максимальное количество экземпляров, запросы могут быть сброшены при достижении потолка.
Разрешить одновременные запросы
В 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 использует 1GiB памяти и тайм-аут через 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 :
- В консоли Google Cloud выберите Cloud Functions for Firebase в левом меню.
- Выберите функцию, щелкнув ее название в списке функций.
- Нажмите значок «Изменить» в верхнем меню.
- Выберите распределение памяти из раскрывающегося меню с надписью Выделенная память .
- Нажмите «Дополнительно» , чтобы отобразить дополнительные параметры, и введите количество секунд в текстовом поле «Время ожидания» .
- Нажмите «Сохранить» , чтобы обновить функцию.
Переопределить настройки ЦП по умолчанию
До 2 ГБ выделенной памяти каждая функция в Cloud Functions for Firebase (2-е поколение) по умолчанию использует один ЦП, а затем увеличивает до 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")
Для функций, интенсивно использующих ЦП, 2-е поколение обеспечивает гибкость настройки дополнительного ЦП. Вы можете повысить ЦП на основе каждой функции, как показано:
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