Часто вам потребуется дополнительная настройка ваших функций, например сторонние ключи API или настраиваемые параметры. В SDK Firebase для Cloud Functions есть встроенная конфигурация среды, которая упрощает хранение и получение таких данных для проекта.
Вы можете выбрать один из следующих вариантов:
- Параметризованная конфигурация (рекомендуется для большинства сценариев). Это обеспечивает строго типизированную конфигурацию среды с параметрами, которые проверяются во время развертывания, что предотвращает ошибки и упрощает отладку.
- Конфигурация переменных среды на основе файлов. При таком подходе вы вручную создаете файл dotenv для загрузки переменных среды.
В большинстве случаев рекомендуется использовать параметризованную конфигурацию. Этот подход делает значения конфигурации доступными как во время выполнения, так и во время развертывания, а развертывание блокируется, если все параметры не имеют допустимого значения. И наоборот, конфигурация с переменными среды недоступна во время развертывания.
Параметризованная конфигурация
Cloud Functions for Firebase предоставляет интерфейс для декларативного определения параметров конфигурации в базе кода. Значение этих параметров доступно как во время развертывания функции, при настройке параметров развертывания и среды выполнения, так и во время выполнения. Это означает, что CLI заблокирует развертывание, если не все параметры имеют допустимое значение.
Node.js
const { onRequest } = require('firebase-functions/v2/https');
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 = onRequest(
{ minInstances: minInstancesConfig },
(req, res) => {
res.send(`${welcomeMessage.value()}! I am a function.`);
}
);
Python
from firebase_functions import https_fn
from firebase_functions.params import IntParam, StringParam
MIN_INSTANCES = IntParam("HELLO_WORLD_MIN_INSTANCES")
WELCOME_MESSAGE = StringParam("WELCOME_MESSAGE")
# To use configured parameters inside the config for a function, provide them
# directly. To use them at runtime, call .value() on them.
@https_fn.on_request(min_instances=MIN_INSTANCES)
def hello_world(req):
return https_fn.Response(f'{WELCOME_MESSAGE.value()}! I am a function!')
При развертывании функции с параметризованными переменными конфигурации интерфейс командной строки Firebase сначала пытается загрузить их значения из локальных файлов .env. Если в этих файлах нет нужных значений и не задана переменная default, CLI запросит значения во время развертывания, а затем автоматически сохранит их в файле .env с именем .env.<project_ID> в каталоге functions/:
$ firebase deploy
i functions: preparing codebase default for deployment
? Enter a string value for ENVIRONMENT: prod
i functions: Writing new parameter values to disk: .env.projectId
…
$ firebase deploy
i functions: Loaded environment variables from .env.projectId
В зависимости от вашего рабочего процесса разработки может быть полезно добавить сгенерированный файл .env.<project_ID> в систему управления версиями.
Как использовать параметры в глобальной области действия
Во время развертывания код функций загружается и проверяется до того, как параметры получат фактические значения. Это означает, что получение значений параметров в глобальной области видимости приводит к сбою развертывания. Если вы хотите использовать параметр для инициализации глобального значения, используйте обратный вызов инициализации onInit(). Этот обратный вызов выполняется до запуска любых функций в рабочей среде, но не вызывается во время развертывания, поэтому это безопасное место для доступа к значению параметра.
Node.js
const { GoogleGenerativeAI } = require('@google/generative-ai');
const { defineSecret } = require('firebase-functions/params');
const { onInit } = require('firebase-functions/v2/core');
const apiKey = defineSecret('GOOGLE_API_KEY');
let genAI;
onInit(() => {
genAI = new GoogleGenerativeAI(apiKey.value());
})
Python
from firebase_functions.core import init
from firebase_functions.params import StringParam, PROJECT_ID
import firebase_admin
import vertexai
location = StringParam("LOCATION")
x = "hello"
@init
def initialize():
# Note: to write back to a global, you'll need to use the "global" keyword
# to avoid creating a new local with the same name.
global x
x = "world"
firebase_admin.initialize_app()
vertexai.init(PROJECT_ID.value, location.value)
Если вы используете параметры типа Secret, обратите внимание, что они доступны только в процессе функций, которые связали секрет. Если секрет привязан только к некоторым функциям, перед использованием secret.value() проверьте, не является ли он ложным.
Настройка поведения CLI
Параметры можно настроить с помощью объекта Options, который определяет, как CLI будет запрашивать значения. В примере ниже показано, как задать параметры для проверки формата номера телефона, добавить простой вариант выбора и автоматически заполнить вариант выбора из проекта Firebase.
Node.js
const { defineString } = require('firebase-functions/params');
const welcomeMessage = defineString('WELCOME_MESSAGE', {default: 'Hello World',
description: 'The greeting that is returned to the caller of this function'});
const onlyPhoneNumbers = defineString('PHONE_NUMBER', {
input: {
text: {
validationRegex: /\d{3}-\d{3}-\d{4}/,
validationErrorMessage: "Please enter
a phone number in the format XXX-YYY-ZZZZ"
},
},
});
const selectedOption = defineString('PARITY', {input: params.select(["odd", "even"])});
const memory = defineInt("MEMORY", {
description: "How much memory do you need?",
input: params.select({ "micro": 256, "chonky": 2048 }),
});
const extensions = defineList("EXTENSIONS", {
description: "Which file types should be processed?",
input: params.multiSelect(["jpg", "tiff", "png", "webp"]),
});
const storageBucket = defineString('BUCKET', {
description: "This will automatically
populate the selector field with the deploying Cloud Project’s
storage buckets",
input: params.PICK_STORAGE_BUCKET,
});
Python
from firebase_functions.params import (
StringParam,
ListParam,
TextInput,
SelectInput,
SelectOptions,
ResourceInput,
ResourceType,
)
MIN_INSTANCES = IntParam("HELLO_WORLD_MIN_INSTANCES")
WELCOME_MESSAGE = StringParam(
"WELCOME_MESSAGE",
default="Hello World",
description="The greeting that is returned to the caller of this function",
)
ONLY_PHONE_NUMBERS = StringParam(
"PHONE_NUMBER",
input=TextInput(
validation_regex="\d{3}-\d{3}-\d{4}",
validation_error_message="Please enter a phone number in the format XXX-YYY-XXX",
),
)
SELECT_OPTION = StringParam(
"PARITY",
input=SelectInput([SelectOptions(value="odd"), SelectOptions(value="even")]),
)
STORAGE_BUCKET = StringParam(
"BUCKET",
input=ResourceInput(type=ResourceType.STORAGE_BUCKET),
description="This will automatically populate the selector field with the deploying Cloud Project's storage buckets",
)
Типы параметров
Параметризованная конфигурация обеспечивает строгую типизацию значений параметров, а также поддерживает секреты из Cloud Secret Manager. Поддерживаются следующие типы:
- Секрет
- Строка
- Логическое значение
- Целое число
- Число с плавающей запятой
- List (Node.js)
- Секретный ключ JSON (Node.js)
Информацию о функциях для определения параметров можно найти в справочнике по пространству имен params.
Значения параметров и выражения
Firebase оценивает ваши параметры как во время развертывания, так и во время выполнения вашей функции. выполняется. Из-за этого нужно быть внимательнее при сравнении значений параметров и их использовании для настройки параметров среды выполнения для функций.
Чтобы передать параметр в функцию в качестве параметра среды выполнения, передайте его напрямую:
Node.js
const { onRequest } = require('firebase-functions/v2/https');
const { defineInt } = require('firebase-functions/params');
const minInstancesConfig = defineInt('HELLO_WORLD_MININSTANCES');
export const helloWorld = onRequest(
{ minInstances: minInstancesConfig },
(req, res) => {
//…
Python
from firebase_functions import https_fn
from firebase_functions.params import IntParam
MIN_INSTANCES = IntParam("HELLO_WORLD_MIN_INSTANCES")
@https_fn.on_request(min_instances=MIN_INSTANCES)
def hello_world(req):
...
Кроме того, если вам нужно сравнить значение с параметром, чтобы выбрать вариант, используйте встроенные компараторы, а не проверку значения:
Node.js
const { onRequest } = require('firebase-functions/v2/https');
const environment = params.defineString(‘ENVIRONMENT’, {default: 'dev'});
// use built-in comparators
const minInstancesConfig = environment.equals('PRODUCTION').thenElse(10, 1);
export const helloWorld = onRequest(
{ minInstances: minInstancesConfig },
(req, res) => {
//…
Python
from firebase_functions import https_fn
from firebase_functions.params import IntParam, StringParam
ENVIRONMENT = StringParam("ENVIRONMENT", default="dev")
MIN_INSTANCES = ENVIRONMENT.equals("PRODUCTION").then(10, 0)
@https_fn.on_request(min_instances=MIN_INSTANCES)
def hello_world(req):
...
К параметрам и выражениям параметров, которые используются только во время выполнения, можно обращаться с помощью функции value:
Node.js
const { onRequest } = require('firebase-functions/v2/https');
const { defineString } = require('firebase-functions/params');
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 = onRequest(
(req, res) => {
res.send(`${welcomeMessage.value()}! I am a function.`);
}
);
Python
from firebase_functions import https_fn
from firebase_functions.params import StringParam
WELCOME_MESSAGE = StringParam("WELCOME_MESSAGE")
@https_fn.on_request()
def hello_world(req):
return https_fn.Response(f'{WELCOME_MESSAGE.value()}! I am a function!')
Встроенные параметры
В Cloud Functions SDK есть три предопределенных параметра, доступных в подпакете firebase-functions/params:
Node.js
projectID– облачный проект, в котором выполняется функция.databaseURL– URL экземпляра Realtime Database, связанного с функцией (если он включен в проекте Firebase).storageBucket– сегмент Cloud Storage, связанный с функцией (если он включен в проекте Firebase).
Python
PROJECT_ID– облачный проект, в котором выполняется функция.DATABASE_URL– URL экземпляра Realtime Database, связанного с функцией (если он включен в проекте Firebase).STORAGE_BUCKET– сегмент Cloud Storage, связанный с функцией (если он включен в проекте Firebase).
Они во всех отношениях работают как пользовательские строковые параметры, за исключением того, что их значения всегда известны интерфейсу командной строки Firebase, поэтому они никогда не запрашиваются при развертывании и не сохраняются в файлах .env.
Параметры секрета
Параметры типа Secret, определенные с помощью defineSecret(), представляют собой строковые параметры, значение которых хранится в Cloud Secret Manager. Вместо того чтобы проверять локальный файл .env и записывать в него новое значение, если оно отсутствует, секретные параметры проверяют наличие в Cloud Secret Manager и в интерактивном режиме запрашивают значение нового секрета во время развертывания.
Секретные параметры должны быть привязаны к отдельным функциям, которые должны иметь к ним доступ:
Node.js
const { onRequest } = require('firebase-functions/v2/https');
const { defineSecret } = require('firebase-functions/params');
const discordApiKey = defineSecret('DISCORD_API_KEY');
export const postToDiscord = onRequest(
{ secrets: [discordApiKey] },
(req, res) => {
const apiKey = discordApiKey.value();
//…
Python
from firebase_functions import https_fn
from firebase_functions.params import SecretParam
DISCORD_API_KEY = SecretParam('DISCORD_API_KEY')
@https_fn.on_request(secrets=[DISCORD_API_KEY])
def post_to_discord(req):
api_key = DISCORD_API_KEY.value
Поскольку значения секретов скрыты до выполнения функции, вы не можете использовать их при настройке функции.
Структурированные секреты JSON
Если у вас есть несколько значений конфигурации, которые логически связаны (например, настройки стороннего сервиса), вы можете хранить их вместе в виде структурированного объекта JSON в одном секрете, используя defineJsonSecret(). Такой подход позволяет упорядочить конфигурацию и более эффективно использовать бесплатный план Cloud Secret Manager, сохраняя группу связанных значений конфигурации в одном секрете.
Значение, хранящееся в Secret Manager, должно быть действительной строкой JSON. При обращении к .value() SDK автоматически преобразует строку JSON в объект JavaScript.
Пример
const { onRequest } = require('firebase-functions/v2/https');
const { defineJsonSecret } = require('firebase-functions/params');
// Define a single secret to hold all configuration for some API
const someApiConfig = defineJsonSecret('SOMEAPI_CONFIG');
exports.myApi = onRequest(
{ secrets: [someApiConfig] },
(req, res) => {
// someApiConfig.value() automatically parses the JSON secret
const { apiKey, webhookSecret, clientId } = someApiConfig.value();
// Now you can use apiKey, webhookSecret, clientId
// ...
}
);
Чтобы создать секрет SOMEAPI_CONFIG, задайте его значение в Secret Manager в виде строки JSON, например:
{
"apiKey": "key_...",
"webhookSecret": "secret_...",
"clientId": "client_..."
}
Если значение секрета не является допустимым JSON, при доступе к someApiConfig.value() во время выполнения возникнет ошибка.
Переменные среды
Cloud Functions for Firebase поддерживает формат файлов dotenv для загрузки переменных среды, указанных в файле .env, в среду выполнения приложения. После развертывания переменные среды можно прочитать через интерфейс process.env (в проектах на основе Node.js) или os.environ (в проектах на основе Python).
Чтобы настроить среду таким образом, создайте в проекте файл .env, добавьте нужные переменные и разверните его:
Создайте файл
.envв каталогеfunctions/:# Directory layout: # my-project/ # firebase.json # functions/ # .env # package.json # index.jsОткройте файл
.envдля редактирования и добавьте нужные ключи. Пример:PLANET=Earth AUDIENCE=HumansРазверните функции и убедитесь, что переменные среды загружены:
firebase deploy --only functions # ... # i functions: Loaded environment variables from .env. # ...
После развертывания пользовательских переменных среды код функции может получить к ним доступ:
Node.js
// Responds with "Hello Earth and Humans"
exports.hello = onRequest((request, response) => {
response.send(`Hello ${process.env.PLANET} and ${process.env.AUDIENCE}`);
});
Python
import os
@https_fn.on_request()
def hello(req):
return https_fn.Response(
f"Hello {os.environ.get('PLANET')} and {os.environ.get('AUDIENCE')}"
)
Развертывание нескольких наборов переменных среды
Если вам нужен альтернативный набор переменных среды для проектов Firebase (например, для промежуточной и рабочей сред), создайте файл .env.<project or
alias> и запишите в него переменные среды для конкретного проекта. Переменные среды из файлов .env и .env (если они есть) будут включены во все развернутые функции.
Например, проект может включать следующие три файла, содержащие немного разные значения для разработки и производства:
.env
|
.env.dev
|
.env.prod
|
| PLANET=Earth
AUDIENCE=Humans |
AUDIENCE=Dev Humans | AUDIENCE=Prod Humans |
С учетом значений в этих отдельных файлах набор переменных среды, развернутых вместе с вашими функциями, будет варьироваться в зависимости от вашего целевого проекта:
$ firebase use dev
$ firebase deploy --only functions
i functions: Loaded environment variables from .env, .env.dev.
# Deploys functions with following user-defined environment variables:
# PLANET=Earth
# AUDIENCE=Dev Humans
$ firebase use prod
$ firebase deploy --only functions
i functions: Loaded environment variables from .env, .env.prod.
# Deploys functions with following user-defined environment variables:
# PLANET=Earth
# AUDIENCE=Prod Humans
Зарезервированные переменные среды
Некоторые ключи переменных среды зарезервированы для внутреннего использования. Не используйте в файлах .env следующие ключи:
- Все ключи, начинающиеся с X_GOOGLE_
- Все ключи, начинающиеся с EXT_
- Все ключи, начинающиеся с FIREBASE_
- Любая клавиша из следующего списка:
- CLOUD_RUNTIME_CONFIG
- ENTRY_POINT
- GCP_PROJECT
- GCLOUD_PROJECT
- GOOGLE_CLOUD_PROJECT
- FUNCTION_TRIGGER_TYPE
- FUNCTION_NAME
- FUNCTION_MEMORY_MB
- FUNCTION_TIMEOUT_SEC
- FUNCTION_IDENTITY
- FUNCTION_REGION
- FUNCTION_TARGET
- FUNCTION_SIGNATURE_TYPE
- K_SERVICE
- K_REVISION
- ПОРТ
- K_CONFIGURATION
Хранение конфиденциальной информации о конфигурации и доступ к ней
Переменные среды, хранящиеся в файлах .env, можно использовать для настройки функций, но не следует считать их безопасным способом хранения конфиденциальной информации, такой как учетные данные базы данных или ключи API. Это особенно важно, если вы добавляете файлы .env в систему управления версиями.
Чтобы вы могли хранить конфиденциальную информацию о конфигурации, Cloud Functions for Firebase интегрируется с Google Cloud Secret Manager. Этот зашифрованный сервис надежно хранит значения конфигурации, обеспечивая при этом легкий доступ к ним из ваших функций, когда это необходимо.
Как создать и использовать секрет
Чтобы создать секрет, используйте CLI Firebase.
Чтобы создать и использовать секрет:
В корневом каталоге локального проекта выполните следующую команду:
firebase functions:secrets:set SECRET_NAME
Введите значение для параметра SECRET_NAME.
CLI выведет сообщение об успешном выполнении и предупредит, что для вступления изменений в силу необходимо развернуть функции.
Перед развертыванием убедитесь, что код функций позволяет функции получить доступ к секрету с помощью параметра
secrets:Node.js
const { onRequest } = require('firebase-functions/v2/https'); exports.processPayment = onRequest( { secrets: ["SECRET_NAME"] }, (req, res) => { const myBillingService = initializeBillingService( // reference the secret value process.env.SECRET_NAME ); // Process the payment } );Python
import os from firebase_functions import https_fn @https_fn.on_request(secrets=["SECRET_NAME"]) def process_payment(req): myBillingService = initialize_billing(key=os.environ.get('SECRET_NAME')) # Process the payment ...Развертывание Cloud Functions:
firebase deploy --only functions
Теперь вы сможете получить к нему доступ, как и к любой другой переменной среды. Если же другая функция, в которой секрет не указан, попытается получить к нему доступ, она получит неопределенное значение:
Node.js
exports.anotherEndpoint = onRequest((request, response) => { response.send(`The secret API key is ${process.env.SECRET_NAME}`); // responds with "The secret API key is undefined" because the `secrets` option is missing });Python
@https_fn.on_request() def another_endpoint(req): return https_fn.Response(f"The secret API key is {os.environ.get("SECRET_NAME")}") # Responds with "The secret API key is None" because the `secrets` parameter is missing.
После развертывания функции у нее будет доступ к секретному значению. Доступ к секрету в качестве переменной среды получат только те функции, в параметре secrets которых он указан. Это позволяет гарантировать, что секретные значения будут доступны только там, где они нужны, и снижает риск их случайной утечки.
Управление секретами
Для управления секретами используйте CLI Firebase. При таком способе управления секретами помните, что некоторые изменения CLI требуют изменения и/или повторного развертывания связанных функций. Таким образом, перестанут работать следующие функции:
- Каждый раз, когда вы устанавливаете новое значение для секрета, вы должны повторно развернуть все функции, которые ссылаются на этот секрет, чтобы они получили последнее значение.
- Если вы удалите секрет, убедитесь, что ни одна из развернутых функций не ссылается на него. Функции, использующие удаленный секретный ключ, будут завершаться сбоем без уведомления.
Ниже приведены команды CLI Firebase для управления секретами.
# Change the value of an existing secret firebase functions:secrets:set SECRET_NAME # Set secret from file firebase functions:secrets:set SECRET_NAME --data-file file.json # Validate secret value as json cat file.json | firebase functions:secrets:set SECRET_NAME --format=json # Pipe from stdin and set secret cat file.json | firebase functions:secrets:set SECRET_NAME --format=json # View the value of a secret functions:secrets:access SECRET_NAME # Destroy a secret functions:secrets:destroy SECRET_NAME # View all secret versions and their state functions:secrets:get SECRET_NAME # Automatically clean up all secrets that aren't referenced by any of your functions functions:secrets:prune
Для команд access и destroy можно указать необязательный параметр version, чтобы управлять определенной версией. Пример:
functions:secrets:access SECRET_NAME[@VERSION]
Чтобы получить дополнительную информацию об этих операциях, передайте -h с командой для просмотра справки по CLI.
Как оплачиваются секреты
Secret Manager позволяет бесплатно использовать 6 активных версий секретов. Это означает, что вы можете бесплатно иметь 6 секретов в месяц в проекте Firebase.
По умолчанию CLI Firebase пытается автоматически уничтожать неиспользуемые версии секретов, когда это уместно, например когда вы развертываете функции с новой версией секрета. Вы также можете удалять неиспользуемые секреты с помощью functions:secrets:destroy и functions:secrets:prune.
Secret Manager позволяет выполнять 10 000 бесплатных операций доступа к секрету в месяц. Экземпляры функций считывают только секреты, указанные в параметре secrets, при каждом холодном запуске. Если у вас много экземпляров функций, считывающих много секретов, ваш проект может превысить это ограничение, и в этом случае с вас будет взиматься плата в размере 0,03 доллара США за каждые 10 000 операций доступа.
Дополнительную информацию можно найти в разделе Цены на Secret Manager.
Поддержка эмуляторов
Конфигурация среды с dotenv предназначена для взаимодействия с локальным эмулятором Cloud Functions.
При использовании локального эмулятора Cloud Functions вы можете переопределить переменные среды для своего проекта, настроив файл .env.local. Содержимое файла .env.local имеет приоритет над содержимым файла .env и файла .env, относящегося к проекту.
Например, проект может включать следующие три файла, содержащие немного разные значения для разработки и локального тестирования:
.env
|
.env.dev
|
.env.local
|
| PLANET=Earth
AUDIENCE=Humans |
AUDIENCE=Dev Humans | AUDIENCE=Local Humans |
При запуске в локальном контексте эмулятор загружает переменные среды, как показано ниже:
$ firebase emulators:start
i emulators: Starting emulators: functions
# Starts emulator with following environment variables:
# PLANET=Earth
# AUDIENCE=Local Humans
Секреты и учетные данные в эмуляторе Cloud Functions
Эмулятор Cloud Functions поддерживает использование секретов для хранения конфиденциальной информации о конфигурации и доступа к ней. По умолчанию эмулятор пытается получить доступ к рабочим секретам, используя учетные данные по умолчанию для приложения. В некоторых ситуациях, например в средах непрерывной интеграции, эмулятор может не получить доступ к значениям секретов из-за ограничений разрешений.
Как и в случае с поддержкой переменных среды в эмуляторе Cloud Functions, вы можете переопределить значения секретов, настроив файл .secret.local. Это упрощает тестирование функций на локальном компьютере, особенно если у вас нет доступа к значению секрета.
Перенос из конфигурации среды выполнения
Поддержка functions.config API прекращена, и он будет отключен в марте 2027 г.
После этой даты развертывание с помощью functions.config будет невозможно.
Чтобы избежать сбоев при развертывании, перенесите конфигурацию в Cloud Secret Manager с помощью CLI Firebase. Это наиболее эффективный и безопасный способ переноса конфигурации.
Как экспортировать конфигурацию с помощью интерфейса командной строки Firebase
Используйте команду
config export, чтобы экспортировать существующую конфигурацию среды в новый секрет в Cloud Secret Manager:$ firebase functions:config:export i This command retrieves your Runtime Config values (accessed via functions.config()) and exports them as a Secret Manager secret. i Fetching your existing functions.config() from your project... ✔ Fetched your existing functions.config(). i Configuration to be exported: ⚠ This may contain sensitive data. Do not share this output. { ... } ✔ What would you like to name the new secret for your configuration? RUNTIME_CONFIG ✔ Created new secret version projects/project/secrets/RUNTIME_CONFIG/versions/1```Обновите код функции, чтобы связать секреты
Чтобы использовать конфигурацию, хранящуюся в новом секрете в Cloud Secret Manager, используйте
defineJsonSecretAPI в источнике функции. Также убедитесь, что секреты привязаны ко всем функциям, которым они нужны.До
const functions = require("firebase-functions/v1"); exports.myFunction = functions.https.onRequest((req, res) => { const apiKey = functions.config().someapi.key; // ... });После
const { onRequest } = require("firebase-functions/v2/https"); const { defineJsonSecret } = require("firebase-functions/params"); const config = defineJsonSecret("RUNTIME_CONFIG"); exports.myFunction = onRequest( // Bind secret to your function { secrets: [config] }, (req, res) => { // Access secret values via .value() const apiKey = config.value().someapi.key; // ... });Развертывание функций
Разверните обновленные функции, чтобы применить изменения и привязать разрешения для секретов.
firebase deploy --only functions:<your-function-name>
Автоматически заполняемые переменные среды
Существуют переменные среды, которые автоматически заполняются в среде выполнения функций и в локально эмулируемых функциях. К ним относятся переменные, заполняемые Google Cloud, а также переменная среды, относящаяся к Firebase:
process.env.FIREBASE_CONFIG: предоставляет следующую информацию о конфигурации проекта Firebase:
{
databaseURL: 'https://DATABASE_NAME.firebaseio.com',
storageBucket: 'PROJECT_ID.firebasestorage.app ',
projectId: 'PROJECT_ID'
}
Обратите внимание, что значения в вашей конфигурации Firebase могут отличаться в зависимости от ресурсов, которые вы выделили в своем проекте.
Эта конфигурация применяется автоматически, когда вы инициализируете Firebase Admin SDK без аргументов. Если вы пишете функции на JavaScript, инициализируйте их следующим образом:
const admin = require('firebase-admin');
admin.initializeApp();
Если вы пишете функции на TypeScript, инициализируйте их следующим образом:
import * as functions from 'firebase-functions/v1';
import * as admin from 'firebase-admin';
import 'firebase-functions/v1';
admin.initializeApp();
Если вам нужно инициализировать Admin SDK с конфигурацией проекта по умолчанию, используя учетные данные сервисного аккаунта, вы можете загрузить учетные данные из файла и добавить их в FIREBASE_CONFIG следующим образом:
serviceAccount = require('./serviceAccount.json');
const adminConfig = JSON.parse(process.env.FIREBASE_CONFIG);
adminConfig.credential = admin.credential.cert(serviceAccount);
admin.initializeApp(adminConfig);