Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

Управление развертыванием функций и параметрами времени выполнения

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

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

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

$ firebase deploy --only functions

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

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

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

Смотрите ссылку Firebase CLI для полного списка доступных команд.

По умолчанию Firebase CLI выглядит в functions/ папку для исходного кода. Вы можете указать другую папку, добавив следующие строки в firebase.json :

"functions": {
  "source": "another-folder"
}

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

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

  • явно в Firebase CLI с functions:delete
  • явно с помощью контекстного меню в списке функций в консоли Firebase
  • неявно путем удаления функции из index.js до развертывания.

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

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

# 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 разбирает index.js и выводит из производства каких - либо функций , которые были удалены из файла.

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

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

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

Чтобы переименовать функцию, создать новую переименованную версию функции в index.js , а затем запустить две отдельных команды развертывания. Первая команда развертывает функцию с новым именем, а вторая команда удаляет ранее развернутую версию. Например, если у вас есть функция под названием webhook , что вы хотели бы изменить в webhookNew , пересмотреть код следующим образом :

// 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");
});

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

# 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

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

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

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

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

// 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");
    });

Затем разверните, запустив:

$ firebase deploy --only functions:webhookAsia

В настоящее время существуют две идентичные функции , работающие: webhook работает в us-central1 и webhookAsia работает в asia-northeast1 .

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

$ firebase functions:delete webhook

В настоящее время существует только одна функция - webhookAsia , которая работает в asia-northeast1 .

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

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

  • Переход от унаследованного хранения onChange события в onFinalize , onDelete , onArchive и onMetadataUpdate . (Подробнее об этом в бета - версии v1 или v2 обновления руководства ).
  • Переход от одного типа Firebase в реальном времени базы данных или облако Firestore события к другому, например , как родовой onWrite события в гранулированном onCreate событие.

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

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

Например, если у вас есть функция objectChanged , которая имеет устаревшую onChange типа события, и вы хотели бы изменить его onFinalize , первым название функции и редактировать его иметь 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);
});

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

# 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

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

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

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

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

  • Node.js 14
  • Node.js 12
  • Node.js 10
  • Node.js 8 (устаревшее 8 июня 2020 г.) Развертывание функций к Node.js 8 среды выполнения отключенной в Firebase CLI 15 декабря 2020. Выполнение уже развернутые функций остановится на каком - то момент в будущем; если вы установили функцию во время выполнения Node.js 8, мы рекомендуем вам обновить до Node.js 14 выполнения .

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

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

  "engines": {"node": "14"}

engines поле обязательно; он должен указать один из поддерживаемых версий Node.js для того , чтобы развернуть и функции Run. В настоящее время firebase init functions устанавливает это поле в 14 .

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

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

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

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

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

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

Уменьшите количество холодных пусков

Чтобы установить минимальное количество экземпляров для функции в исходном коде, используйте runWith параметр. Этот вариант выполнения принимает объект JSON , соответствующий RuntimeOptions интерфейс, который определяет значение для minInstances . Например, эта функция устанавливает минимум 5 экземпляров для сохранения тепла:

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 :

  • Если Облако функции для 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 .

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

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

Для заданного распределения памяти и тайм - аут в функции исходного кода, используйте runWith параметр , введенный в Firebase SDK для облачных функций 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
  • 256MB
  • 512MB
  • 1GB
  • 2GB
  • 4GB
  • 8GB

Чтобы установить выделение памяти и тайм-аут в Google Cloud Console:

  1. В Google Google Cloud Console выберите Облако функцию из меню слева.
  2. Выберите функцию, щелкнув ее имя в списке функций.
  3. Нажмите на иконку Редактировать в верхнем меню.
  4. Выберите выделение памяти из выпадающего меню маркированы памяти , выделенной.
  5. Нажмите кнопку Дополнительно , чтобы отобразить дополнительные параметры и введите количество секунд в текстовое поле Время ожидания.
  6. Нажмите кнопку Сохранить , чтобы обновить эту функцию.