Часто для ваших функций требуется дополнительная настройка, например, ключи API сторонних разработчиков или настраиваемые параметры. Firebase SDK для 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 CLI сначала пытается загрузить их значения из локальных файлов .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() ложным.
Настройка поведения интерфейса командной строки
Параметры можно настроить с помощью объекта 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. Поддерживаемые типы:
- Секрет
- Нить
- Логический
- Целое число
- Плавать
- Список (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-адрес экземпляра базы данных реального времени, связанного с функцией (если она включена в проекте Firebase). -
storageBucket— это сегмент Cloud Storage, связанный с функцией (если эта функция включена в проекте Firebase).
Python
-
PROJECT_ID— облачный проект, в котором выполняется данная функция. -
DATABASE_URL— URL-адрес экземпляра базы данных реального времени, связанного с функцией (если она включена в проекте Firebase). -
STORAGE_BUCKET— сегмент Cloud Storage, связанный с функцией (если эта функция включена в проекте Firebase).
Эти параметры во всех отношениях функционируют как определяемые пользователем строковые параметры, за исключением того, что, поскольку их значения всегда известны Firebase CLI, они никогда не будут запрашиваться при развертывании и не будут сохраняться в файлах .env .
Секретные параметры
Параметры типа Secret , определенные с помощью defineSecret() , представляют собой строковые параметры, значение которых хранится в Cloud Secret Manager. Вместо проверки наличия параметра в локальном файле .env и записи в него нового значения в случае его отсутствия, параметры secret проверяются на наличие в 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. SDK автоматически преобразует строку JSON в объект JavaScript при обращении к методу .value() .
Пример:
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 |
| ПЛАНЕТА = Земля АУДИТОРИЯ = Люди | АУДИТОРИЯ = Разработчики (Люди) | АУДИТОРИЯ = Люди-продюсеры |
Учитывая значения в этих отдельных файлах, набор переменных среды, развертываемых вместе с вашими функциями, будет различаться в зависимости от целевого проекта:
$ 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
- ТОЧКА ВХОДА
- GCP_PROJECT
- GCLOUD_PROJECT
- ПРОЕКТ_GOOGLE_CLOUD
- FUNCTION_TRIGGER_TYPE
- НАЗВАНИЕ_ФУНКЦИИ
- ФУНКЦИЯ_ПАМЯТЬ_МБ
- FUNCTION_TIMEOUT_SEC
- FUNCTION_IDENTITY
- FUNCTION_REGION
- ЦЕЛЬ ФУНКЦИИ
- FUNCTION_SIGNATURE_TYPE
- K_SERVICE
- K_REVISION
- ПОРТ
- K_КОНФИГУРАЦИЯ
Хранение и доступ к конфиденциальной информации о конфигурации.
Переменные окружения, хранящиеся в файлах .env , могут использоваться для настройки функций, но не следует рассматривать их как безопасный способ хранения конфиденциальной информации, такой как учетные данные базы данных или ключи API. Это особенно важно, если вы добавляете файлы .env в систему контроля версий.
Для хранения конфиденциальной информации о конфигурации Cloud Functions for Firebase интегрируется с Google Cloud Secret Manager . Этот зашифрованный сервис надежно хранит значения конфигурации, обеспечивая при этом легкий доступ к ним из ваших функций при необходимости.
Создайте и используйте секрет.
Для создания секрета используйте Firebase CLI.
Чтобы создать и использовать секрет:
В корневом каталоге вашего локального проекта выполните следующую команду:
firebase functions:secrets:set SECRET_NAME
Введите значение для SECRET_NAME .
Интерфейс командной строки выдает сообщение об успешном выполнении и предупреждает о необходимости развертывания функций для вступления изменений в силу.
Перед развертыванием убедитесь, что код вашей функции разрешает доступ к секрету с помощью опции
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 будут иметь доступ к этому секрету в качестве переменной окружения. Это помогает гарантировать, что значения секрета доступны только там, где они необходимы, снижая риск случайной утечки секрета.
Управление секретами
Используйте Firebase CLI для управления секретами. При таком способе управления секретами помните, что некоторые изменения в CLI требуют модификации и/или повторного развертывания связанных функций. В частности:
- При каждом изменении значения секрета необходимо повторно развернуть все функции, которые ссылаются на этот секрет, чтобы они могли использовать последнее значение.
- Если вы удаляете секрет, убедитесь, что ни одна из развернутых функций не ссылается на этот секрет. Функции, использующие удаленное значение секрета, завершатся с ошибкой без предупреждения.
Вот краткое описание команд Firebase CLI для управления секретами:
# 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 можно указать необязательный параметр версии, чтобы управлять конкретной версией. Например:
functions:secrets:access SECRET_NAME[@VERSION]
Для получения более подробной информации об этих операциях передайте параметр -h вместе с командой, чтобы просмотреть справку по командной строке.
Как продаются секреты
Secret Manager позволяет бесплатно использовать 6 активных версий секретов. Это означает, что в проекте Firebase можно иметь 6 секретов в месяц без каких-либо затрат.
По умолчанию Firebase CLI пытается автоматически удалять неиспользуемые версии секретов, когда это необходимо, например, при развертывании функций с новой версией секрета. Кроме того, вы можете активно удалять неиспользуемые секреты с помощью 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 |
| ПЛАНЕТА = Земля АУДИТОРИЯ = Люди | АУДИТОРИЯ = Разработчики (Люди) | АУДИТОРИЯ = Местные жители |
При запуске в локальном контексте эмулятор загружает переменные среды следующим образом:
$ firebase emulators:start
i emulators: Starting emulators: functions
# Starts emulator with following environment variables:
# PLANET=Earth
# AUDIENCE=Local Humans
Секреты и учетные данные в эмуляторе Cloud Functions
Эмулятор Cloud Functions поддерживает использование секретов для хранения и доступа к конфиденциальной информации конфигурации . По умолчанию эмулятор будет пытаться получить доступ к вашим производственным секретам, используя учетные данные приложения по умолчанию . В некоторых ситуациях, например, в средах CI, эмулятор может не получить доступ к значениям секретов из-за ограничений прав доступа.
Подобно поддержке переменных окружения в эмуляторе Cloud Functions , вы можете переопределить значения секретов, создав файл .secret.local . Это упрощает локальное тестирование ваших функций, особенно если у вас нет доступа к значению секрета.
Переход от конфигурации среды выполнения
Если вы использовали конфигурацию среды с помощью functions.config , вам необходимо перевести существующую конфигурацию в поддерживаемый формат до конца 2025 года, когда functions.config будет выведен из эксплуатации. После декабря 2025 года новые развертывания с использованием functions.config будут завершаться с ошибкой.
В большинстве случаев рекомендуется параметризованная конфигурация. Такой подход делает значения конфигурации доступными как во время выполнения, так и во время развертывания, и развертывание блокируется, если все параметры не имеют допустимого значения.
Перейдите на подпакет params
Если вы использовали конфигурацию среды с помощью functions.config , вы можете перенести существующую конфигурацию, преобразовав её в параметризованную конфигурацию . Например:
Ранее: 1-е поколение
const functions = require("firebase-functions/v1");
exports.date = functions.https.onRequest((req, res) => {
const date = new Date();
const formattedDate =
date.toLocaleDateString(functions.config().dateformat);
// ...
});
После: 2-е поколение
const {onRequest} = require("firebase-functions/v2/https");
const {defineString} = require("firebase-functions/params");
const dateFormat = defineString("DATE_FORMAT");
exports.date = onRequest((req, res) => {
const date = new Date();
const formattedDate = date.toLocaleDateString(dateFormat.value());
// ...
});
Миграция вложенной конфигурации
Если в ваших functions.config() использовались вложенные объекты, тип параметра defineJsonSecret предлагает простой способ миграции. Вы можете хранить всю структуру JSON из functions.config() непосредственно в одном секрете.
Например, если бы у вас было:
Ранее: 1-е поколение
const functions = require("firebase-functions/v1");
exports.myFunction = functions.https.onRequest((req, res) => {
const apiKey = functions.config().someapi.key;
const webhookSecret = functions.config().someapi.webhookSecret;
// ...
});
Для миграции можно сохранить весь объект someapi в виде строки JSON в секрете с именем SOMEAPI_CONFIG и использовать defineJsonSecret :
После: 2-е поколение
const {onRequest} = require("firebase-functions/v2/https");
const {defineJsonSecret} = require("firebase-functions/params");
const someApiConfig = defineJsonSecret("SOMEAPI_CONFIG");
exports.myFunction = onRequest(<mark>{ secrets: [someApiConfig] }</mark>, (req, res) => {
const apiKey = someApiConfig.value().key;
const webhookSecret = someApiConfig.value().webhookSecret;
// ...
});
Обратите внимание, что, в отличие от functions.config() , любой секрет, определенный с помощью defineSecret или defineJsonSecret должен быть явно привязан к функции с помощью опции { secrets: [...] } , чтобы быть доступным во время выполнения.
Это сохраняет структуру конфигурации и сводит к минимуму изменения в коде. Вы можете использовать Firebase CLI для экспорта существующего JSON-файла functions.config() и установки его в качестве значения для нового секрета. См. раздел «Управление секретами» для получения инструкций по установке значений секретов, включая установку JSON-секретов из файла или стандартного ввода.
Задайте значения параметров
При первом развертывании Firebase CLI запросит все значения параметров и сохранит их в файле dotenv. Чтобы экспортировать значения из файла functions.config , выполните команду firebase functions:config:export .
Для дополнительной безопасности вы также можете указать типы параметров и правила проверки .
Особый случай: API-ключи
Модуль params интегрируется с Cloud Secret Manager, который обеспечивает детальный контроль доступа к конфиденциальным значениям, таким как ключи API. Дополнительную информацию см. в разделах «Секретные параметры» и «Структурированные секреты JSON» .
Автоматически заполняемые переменные среды
В функциях, выполняемых во время их работы и в локально эмулируемых функциях, автоматически заполняются переменные среды. К ним относятся переменные, заполняемые 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);