Вы можете развертывать, удалять и изменять функции с помощью команд CLI Firebase или путем настройки параметров среды выполнения в исходном коде функций.
Развертывание функций
Чтобы развернуть функции, выполните следующую команду Firebase CLI:
firebase deploy --only functions
По умолчанию интерфейс командной строки Firebase развертывает все функции в источнике одновременно. Если в вашем проекте больше пяти функций, рекомендуем использовать флаг --only с названиями определенных функций, чтобы развернуть только те, которые вы изменили. Развертывание определенных функций таким образом ускоряет процесс развертывания и помогает избежать превышения квот на развертывание. Пример:
firebase deploy --only functions:addMessage,functions:makeUppercase
При развертывании большого количества функций вы можете превысить стандартную квоту и получить сообщения об ошибках HTTP 429 или 500. Чтобы решить эту проблему, развертывайте функции группами по 10 или менее.
Полный список доступных команд приведен в справочнике по CLI Firebase.
По умолчанию CLI Firebase ищет исходный код в папке functions/. При желании вы можете организовать функции в базах кода или нескольких наборах файлов.
Удалить функции
Удалить ранее развернутые функции можно следующими способами:
- явно в интерфейсе командной строки Firebase с помощью
functions:delete; - явно в консоли Google Cloud.
- неявно, удалив функцию из источника перед развертыванием.
При удалении функции из рабочей среды всегда запрашивается подтверждение.
Явное удаление функций в CLI Firebase поддерживает несколько аргументов, а также группы функций и позволяет указать функцию, выполняемую в определенном регионе. Вы также можете переопределить запрос подтверждения.
Удаляет все функции, соответствующие указанному названию, во всех регионах:
firebase functions:delete FUNCTION-1_NAME
Удаляет указанную функцию, выполняемую в регионе, отличном от региона по умолчанию:
firebase functions:delete FUNCTION-1_NAME --region REGION_NAME
Удаляет несколько функций:
firebase functions:delete FUNCTION-1_NAME FUNCTION-2_NAME
Удаляет указанную группу функций:
firebase functions:delete GROUP_NAME
Обход запроса подтверждения:
firebase functions:delete FUNCTION-1_NAME --force
При неявном удалении функций firebase deploy анализирует исходный код и удаляет из рабочей среды все функции, которые были удалены из файла.
Как изменить название, регион или триггер функции
Если вы переименовываете или меняете регионы или триггер для функций, которые обрабатывают рабочий трафик, следуйте инструкциям в этом разделе, чтобы избежать потери событий во время модификации. Прежде чем выполнять описанные ниже действия, убедитесь, что ваша функция идемпотентна, поскольку во время изменения будут одновременно выполняться и новая, и старая версии функции.
Как переименовать функцию
Чтобы переименовать функцию, создайте в источнике ее новую версию с другим названием, а затем выполните две отдельные команды развертывания. Первая команда развертывает функцию с новым названием, а вторая удаляет ранее развернутую версию. Например, если у вас есть функция Node.js с названием webhook, которое вы хотите изменить на webhookNew, измените код следующим образом:
// 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");
});
Затем выполните следующие команды, чтобы развернуть новую функцию:
# 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
Как изменить регион или регионы функции
Если вы меняете регионы для функции, которая обрабатывает рабочий трафик, то, чтобы избежать потери событий, выполните следующие действия:
- Переименуйте функцию и измените ее регион или регионы.
- Разверните переименованную функцию, чтобы временно запустить один и тот же код в обоих наборах регионов.
- Удалить предыдущую функцию.
Например, если у вас есть функция webhook, которая в настоящее время развернута в us-central1, и вы хотите перенести ее в asia-northeast1, сначала нужно изменить исходный код, чтобы переименовать функцию и изменить регион.
// 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");
});
Затем выполните развертывание, запустив:
firebase deploy --only functions:webhookAsia
Теперь у вас есть две одинаковые функции: webhook в us-central1 и webhookAsia в asia-northeast1.
Затем удалите webhook:
firebase functions:delete webhook
Теперь есть только одна функция – webhookAsia, которая выполняется в asia-northeast1.
Как изменить тип триггера функции
По мере развития развертывания Cloud Functions for Firebase вам может потребоваться изменить тип триггера функции по разным причинам. Например, вы можете изменить тип события Firebase Realtime Database или Cloud Firestore.
Изменить тип события функции, просто изменив исходный код и запустив firebase deploy, нельзя. Чтобы избежать ошибок, измените тип триггера функции, выполнив следующие действия:
- Измените исходный код, чтобы добавить новую функцию с нужным типом триггера.
- Разверните функцию. В результате будут временно запущены и старая, и новая функции.
- Явно удалите старую функцию из рабочей среды с помощью интерфейса командной строки Firebase.
Например, если у вас есть функция Node.js с названием objectChanged, которая использует устаревший тип события onChange, и вы хотите изменить его на onFinalize, сначала переименуйте функцию и измените ее, чтобы она использовала тип события 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);
});
Затем выполните следующие команды, чтобы сначала создать новую функцию, а потом удалить старую:
# 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
Как задать настройки среды выполнения
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 можно найти в расписании.
Чтобы задать версию Node.js, выполните следующие действия:
Вы можете указать версию в поле engines файла package.json, который был создан в каталоге functions/ во время инициализации.
Например, чтобы использовать только версию 20, измените эту строку в файле package.json:
"engines": {"node": "22"}
Если вы используете менеджер пакетов Yarn или у вас есть другие требования к полю engines, вы можете задать среду выполнения для SDK Firebase для Cloud Functions в файле firebase.json:
{
"functions": {
"runtime": "nodejs22"
}
}
CLI использует значение, заданное в firebase.json, а не значение или диапазон, заданные отдельно в package.json.
Обновите среду выполнения Node.js
Чтобы обновить среду выполнения Node.js:
- Убедитесь, что в вашем проекте используется тарифный план Blaze.
- Убедитесь, что вы используете Firebase CLI версии 11.18.0 или более поздней.
- Измените значение
enginesв файлеpackage.json, который был создан в каталогеfunctions/во время инициализации. Например, если вы переходите с версии 16 на версию 18, запись должна выглядеть так:"engines": {"node": "18"}. - При желании вы можете протестировать изменения с помощью Firebase Local Emulator Suite.
- Повторно разверните все функции.
Выберите систему модулей Node.js
По умолчанию в Node.js используется система модулей CommonJS (CJS), но текущие версии Node.js также поддерживают модули ECMAScript (ESM). Cloud Functions поддерживает оба варианта.
По умолчанию ваши функции используют CommonJS. Это означает, что импорт и экспорт выглядят следующим образом:
const functions = require("firebase-functions/v1");
exports.helloWorld = functions.https.onRequest(async (req, res) => res.send("Hello from Firebase!"));
Чтобы использовать ESM, задайте поле "type": "module" в файле package.json:
{
...
"type": "module",
...
}
После этого используйте синтаксис ESM import и export:
import functions from "firebase-functions/v1";
export const helloWorld = functions.https.onRequest(async (req, res) => res.send("Hello from Firebase!"));
Обе системы модулей полностью поддерживаются. Вы можете выбрать тот, который лучше всего подходит для вашего проекта. Подробную информацию можно найти в документации Node.js по модулям.
Управлять поведением при масштабировании.
По умолчанию Cloud Functions for Firebase масштабирует количество запущенных экземпляров в зависимости от количества входящих запросов, потенциально уменьшая масштаб до нуля экземпляров в периоды снижения трафика. Однако если вашему приложению требуется уменьшенная задержка и вы хотите ограничить количество холодных запусков, вы можете изменить этот режим работы по умолчанию, указав минимальное количество экземпляров контейнера, которые должны быть теплыми и готовыми к обслуживанию запросов.
Аналогичным образом можно задать максимальное количество экземпляров, чтобы ограничить масштабирование в ответ на входящие запросы. Используйте эту настройку, чтобы контролировать расходы или ограничить количество подключений к вспомогательному сервису, например к базе данных.
Уменьшите количество холодных запусков
Чтобы задать минимальное количество экземпляров для функции в исходном коде, используйте метод runWith. Этот метод принимает объект JSON, соответствующий интерфейсу RuntimeOptions, который определяет значение для minInstances. Например, эта функция задает минимальное количество экземпляров, которые нужно поддерживать в активном состоянии:
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
});
При настройке значения minInstances необходимо учитывать следующее:
- Если Cloud Functions for Firebase масштабирует ваше приложение выше значения
minInstances, вы столкнетесь с холодным запуском для каждого экземпляра выше этого порога. - Холодный запуск сильнее всего влияет на приложения с резкими скачками трафика. Если трафик вашего приложения неравномерен и вы установите значение
minInstances, достаточно высокое, чтобы уменьшить количество холодных запусков при каждом увеличении трафика, вы увидите значительное снижение задержки. Если у приложения постоянный трафик, холодный запуск вряд ли сильно повлияет на эффективность. Задавать минимальное количество экземпляров имеет смысл для рабочих сред, но обычно не рекомендуется для тестовых сред. Чтобы в тестовом проекте выполнялась полная остановка, а в рабочем – сокращалось количество холодных запусков, можно задать значение
minInstancesна основе переменной среды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 });
Ограничьте максимальное количество экземпляров функции
Чтобы задать максимальное количество экземпляров в исходном коде функции, используйте метод runWith. Этот метод принимает объект JSON, соответствующий интерфейсу RuntimeOptions, который определяет значения для maxInstances. Например, эта функция устанавливает ограничение в 100 экземпляров, чтобы не перегружать гипотетическую устаревшую базу данных:
exports.mirrorOrdersToLegacyDatabase = functions
.runWith({
// Legacy database only supports 100 simultaneous connections
maxInstances: 100,
})
.firestore.document("orders/{orderId}")
.onWrite((change, context) => {
// Connect to legacy database
});
Если HTTP-функция масштабируется до предела maxInstances, новые запросы ставятся в очередь на 30 секунд, а затем отклоняются с кодом ответа 429 Too Many Requests, если к тому времени нет доступных экземпляров.
Подробнее о том, как использовать maxInstances…
Как настроить сервисный аккаунт
Сервисный аккаунт по умолчанию для функций первого поколения, PROJECT_ID@
Вы можете переопределить сервисный аккаунт по умолчанию и ограничить функцию только необходимыми ресурсами. Для этого создайте специальный сервисный аккаунт и назначьте его нужной функции с помощью метода .runWith().
Этот метод принимает объект с параметрами конфигурации, включая свойство serviceAccount.
const functions = require("firebase-functions/v1");
exports.helloWorld = functions
.runWith({
// This function doesn't access other Firebase project resources, so it uses a limited service account.
serviceAccount:
"my-limited-access-sa@", // or prefer the full form: "my-limited-access-sa@my-project.iam.gserviceaccount.com"
})
.https.onRequest((request, response) => {
response.send("Hello from Firebase!");
});
Как задать время ожидания и распределение памяти
В некоторых случаях для функций могут потребоваться особые требования к длительному времени ожидания или большому объему выделенной памяти. Эти значения можно задать в консоли Google Cloud или в исходном коде функции (только для Firebase).
Чтобы задать распределение памяти и время ожидания в исходном коде функций, используйте параметр runWith, представленный в Firebase SDK для Cloud Functions 2.0.0. Этот параметр принимает объект JSON, соответствующий интерфейсу RuntimeOptions, который определяет значения для timeoutSeconds и memory.
Например, эта функция хранилища использует 1 ГБ памяти и завершается по тайм-ауту через 300 секунд:
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
});
Максимальное значение для timeoutSeconds – 540, или 9 минут.
Объем памяти, выделяемый функции, соответствует ЦП, выделенному для функции, как описано в этом списке допустимых значений для memory:
128MB– 200 МГц256MB– 400 МГц512MB– 800 МГц;1GB– 1,4 ГГц2GB– 2,4 ГГц4GB– 4,8 ГГц8GB– 4,8 ГГц
Чтобы задать распределение памяти и время ожидания в консоли Google Cloud, выполните следующие действия:
- В консоли Google Cloud выберите Cloud Functions в меню слева.
- Выберите функцию, нажав на ее название в списке.
- Нажмите на значок Изменить в верхнем меню.
- Выберите объем памяти в раскрывающемся меню Выделенная память.
- Нажмите Ещё, чтобы открыть дополнительные настройки, и введите количество секунд в текстовом поле Тайм-аут.
- Нажмите Сохранить, чтобы обновить функцию.