Configura tu entorno (1ª gen.)

A menudo, necesitarás una configuración adicional para tus funciones, como claves de API de terceros o una configuración ajustable. El SDK de Firebase para Cloud Functions ofrece una configuración de entorno integrada para facilitar el almacenamiento y la recuperación de este tipo de datos para tu proyecto.

Puedes elegir entre las siguientes opciones:

  • La configuración con parámetros (recomendada para la mayoría de las situaciones) proporciona una configuración de entorno de tipo fuerte con parámetros que se validan en el momento de la implementación, lo que evita errores y simplifica la depuración.
  • La configuración basada en archivos de las variables de entorno implica la creación manual de un archivo dotenv para cargar variables de entorno.

En la mayoría de los casos de uso, se recomienda la configuración con parámetros. Este enfoque hace que los valores de configuración estén disponibles durante los tiempos de ejecución e implementación. Además, la implementación se bloquea, a menos que todos los parámetros tengan un valor válido. Por el contrario, la configuración con variables de entorno no está disponible durante el tiempo de implementación.

Configuración con parámetros

Cloud Functions for Firebase proporciona una interfaz para definir parámetros de configuración de forma declarativa dentro de tu base de código. El valor de estos parámetros está disponible durante la implementación de funciones, cuando se configuran las opciones de implementación y entorno de ejecución, y durante la ejecución. Esto significa que la CLI bloqueará la implementación, a menos que todos los parámetros tengan un valor válido.

Para definir parámetros en tu código, sigue este modelo:

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.`);
  }
);

Cuando se implementa una función con variables de configuración que tengan parámetros, Firebase CLI primero intenta cargar sus valores desde los archivos .env locales. Si no están presentes en esos archivos y no se configura default, la CLI solicitará los valores durante la implementación y, luego, los guardará automáticamente en un archivo .env llamado .env.<project_ID> en tu directorio 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

Según tu flujo de trabajo de desarrollo, puede ser útil agregar el archivo .env.<project_ID> generado al control de versión.

Usa parámetros en el permiso global

Durante la implementación, el código de tus funciones se carga y se inspecciona antes de que los parámetros tengan valores reales. Esto significa que recuperar valores de parámetros durante el permiso global genera un error de implementación. En los casos en los que desees usar un parámetro para inicializar un valor global, usa la devolución de llamada de inicialización onInit(). Esta devolución de llamada se ejecuta antes de que se ejecuten las funciones en producción, pero no se la llama durante el tiempo de implementación, por lo que es un lugar seguro para acceder al valor de un parámetro.

  const { GoogleGenerativeAI } = require('@google/generative-ai');
  const { defineSecret } = require('firebase-functions/params');
  const { onInit } = require('firebase-functions/v1');

  const apiKey = defineSecret('GOOGLE_API_KEY');

  let genAI;
  onInit(() => {
    genAI = new GoogleGenerativeAI(apiKey.value());
  })

Configura el comportamiento de la CLI

Los parámetros se pueden configurar con un objeto Options que controle cómo la CLI solicitará valores. En el siguiente ejemplo, se configuran opciones para validar el formato de un número de teléfono, proporcionar una opción de selección simple y propagar una opción de selección automáticamente desde el proyecto de Firebase:

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: {select: {options:
[{value: "odd"}, {value: "even"}]}}})

const storageBucket = defineString('BUCKET', {input: {resource: {type:
"storage.googleapis.com/Bucket"}}, description: "This will automatically
populate the selector field with the deploying Cloud Project’s
storage buckets"})

Tipos de parámetros

La configuración parametrizada proporciona valores de parámetros de tipo fuerte, y también admite secretos de Cloud Secret Manager. Los tipos admitidos son los siguientes:

  • Secreto
  • String
  • Booleano
  • Número entero
  • Número de punto flotante

Consulta la referencia del espacio de nombres params para obtener información sobre las funciones para definir parámetros.

Expresiones y valores de parámetros

Firebase evalúa tus parámetros en el momento de la implementación y mientras se ejecuta tu función. Debido a estos entornos duales, se debe tener especial cuidado a la hora de comparar valores de parámetros y de usarlos para establecer opciones del entorno de ejecución de las funciones.

Para pasar un parámetro a tu función como una opción del entorno de ejecución, hazlo directamente:

const functions = require('firebase-functions/v1');
const { defineInt} = require('firebase-functions/params');
const minInstancesConfig = defineInt('HELLO\_WORLD\_MININSTANCES');

export const helloWorld = functions.runWith({ minInstances: minInstancesConfig}).https.onRequest(
  (req, res) => {
    //…

Además, si necesitas comparar con un parámetro para saber qué opción elegir, deberás usar comparadores integrados en lugar de verificar el valor:

const functions = require('firebase-functions/v1');
const { defineBool } = require('firebase-functions/params');
const environment = params.defineString(ENVIRONMENT, {default: dev});

// use built-in comparators
const minInstancesConfig =environment.equals('PRODUCTION').thenElse(10, 1);
export const helloWorld = functions.runWith({ minInstances: minInstancesConfig}).https.onRequest(
  (req, res) => {
    //…

Se puede acceder a los parámetros y las expresiones de parámetros que solo se usan en el entorno de ejecución con su función value:

const functions = require('firebase-functions/v1');
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 = functions.https.onRequest(
 (req, res) => {
    res.send(`${welcomeMessage.value()}! I am a function.`);
  }
);

Parámetros integrados

El SDK de Cloud Functions ofrece tres parámetros predefinidos, disponibles en el subpaquete firebase-functions/params:

  • projectID: Es el proyecto de Cloud en el que se ejecuta la función.
  • databaseURL: Es la URL de la instancia de Realtime Database asociada a la función (si está habilitada en el proyecto de Firebase).
  • storageBucket: Es el bucket de Cloud Storage asociado con la función (si está habilitado en el proyecto de Firebase).

Funcionan como parámetros de cadena definidos por el usuario en todo sentido, excepto que Firebase CLI siempre conoce sus valores. Estos valores nunca se solicitarán durante la implementación ni se guardarán en los archivos .env.

Parámetros secretos

Los parámetros de tipo Secret, definidos mediante defineSecret(), representan parámetros de string que tienen un valor almacenado en Cloud Secret Manager. En vez de comprobar un archivo local .env y escribir un nuevo valor en el archivo si falta, los parámetros secretos comprueban la existencia en Cloud Secret Manager y solicitan interactivamente el valor de un nuevo secreto durante la implementación.

Los parámetros secretos definidos de esta manera deben vincularse a funciones individuales que deben tener acceso a ellos:

const functions = require('firebase-functions/v1');
const { defineSecret } = require('firebase-functions/params');
const discordApiKey = defineSecret('DISCORD_API_KEY');

export const postToDiscord = functions.runWith({ secrets: [discordApiKey] }).https.onRequest(
  (req, res) => {
    const apiKey = discordApiKey.value();
    //…
Nota: