Ir a la consola

Administra la implementación de funciones y las opciones del entorno de ejecución

Usa los comandos de Firebase CLI o configura opciones de tiempo de ejecución en el código fuente para implementar, borrar y modificar funciones.

Implementa funciones

Para implementar funciones, ejecuta el siguiente comando de Firebase CLI:

$ firebase deploy --only functions

De forma predeterminada, Firebase CLI implementa todas las funciones dentro de index.js al mismo tiempo. Si tu proyecto contiene más de 5 funciones, te recomendamos usar la marca --only con los nombres específicos de las funciones para implementar solo las que modificaste. Si implementas funciones específicas de esta forma, acelerarás el proceso de implementación y evitarás alcanzar los límites de las cuotas de implementación. Por ejemplo:

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

Para ver una lista completa de los comandos disponibles, consulta la Referencia de Firebase CLI.

En la configuración predeterminada, Firebase CLI busca el código fuente en la carpeta functions/. Agrega las siguientes líneas al archivo firebase.json para especificar otra carpeta:

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

Borra funciones

Puedes borrar las funciones implementadas previamente de estas maneras:

  • De forma explícita en Firebase CLI con functions:delete
  • De forma explícita con el menú contextual de la lista de funciones de Firebase console
  • De forma implícita si quitas la función de index.js antes de la implementación

Para realizar cualquiera de estas operaciones, deberás confirmar que quieres quitar la función de producción.

La función de eliminación explícita en Firebase CLI admite varios argumentos y grupos de funciones, y te permite especificar que una función se ejecute en una región en particular. Además, puedes anular la solicitud de confirmación.

# 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

En la función de eliminación implícita, firebase deploy analiza index.js y quita de producción las funciones eliminadas del archivo. Ten en cuenta que no puedes borrar las funciones con una implementación en modo no interactivo.

Modifica el nombre, la región o el activador de una función

Si quieres cambiar el nombre, las regiones o el activador de una función que maneja tráfico de producción, sigue los pasos de esta sección para no perder eventos durante la modificación. Antes de hacerlo, asegúrate de que tu función sea idempotente, ya que se ejecutarán al mismo tiempo la versión nueva y la antigua de la función durante el cambio.

Cambia el nombre de una función

Para cambiar el nombre de una función, crea una versión nueva de la función con otro nombre en index.js y, a continuación, ejecuta dos comandos de implementación separados. El primer comando implementa la función nueva con otro nombre y el segundo comando quita la versión implementada anteriormente. Por ejemplo, si tienes una función llamada webhook que te gustaría cambiar a webhookNew, modifica el código de la siguiente manera:

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

A continuación, ejecuta los siguientes comandos para implementar la función nueva:

# 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

Cambia las regiones de una función

Si cambias las regiones determinadas de una función que maneja tráfico de producción, puedes perder eventos. Para evitarlo, realiza los siguientes pasos en el mismo orden:

  1. Cambia el nombre de la función y sus regiones como desees.
  2. Implementa la función con el nombre nuevo. Esto ejecutará temporalmente el mismo código en ambos conjuntos de regiones.
  3. Borra la función anterior.

Por ejemplo, si tienes una función llamada webhook que se encuentra en la región predeterminada us-central1 y quieres migrarla a asia-northeast1, primero debes modificar el código fuente para cambiar el nombre de la función y revisar la región:

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

A continuación, impleméntala con el comando:

$ firebase deploy --only functions:webhookAsia

Ahora, tienes dos funciones idénticas en ejecución: webhook se ejecuta en us-central1 y webhookAsia en asia-northeast1.

Luego, borra webhook:

$ firebase functions:delete webhook

Solamente queda una función, webhookAsia, que se ejecuta en asia-northeast1.

Cambia el tipo de activador de una función

A medida que desarrollas tu implementación de Cloud Functions para Firebase, es posible que debas cambiar el tipo de activador de una función por diversas razones. Por ejemplo, puedes realizar lo siguiente:

No es posible cambiar el tipo de evento de una función solo con cambiar el código fuente y ejecutar firebase deploy. Para evitar errores, usa el siguiente procedimiento a fin de cambiar el tipo de activador de una función:

  1. Modifica el código fuente para que incluya una función nueva con el tipo de activador que desees.
  2. Implementa la función, lo que tendrá como resultado la ejecución temporal de la función en la región antigua y la nueva.
  3. Borra de producción la función antigua de forma explícita con Firebase CLI.

Por ejemplo, si tenías una función objectChanged con un tipo de evento heredado onChange y deseas cambiarlo a onFinalize, primero debes cambiar el nombre de la función y modificarla para que tenga el tipo de evento 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);
});

A continuación, y antes de borrar la función antigua, ejecuta los siguientes comandos para crear primero la función nueva:

# 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

Configura las opciones de ejecución

Cloud Functions para Firebase te permite seleccionar opciones de ejecución, como la versión del entorno de ejecución de Node.js y el tiempo de espera y la asignación de memoria para cada función.

Configurar la versión de Node.js

El SDK de Firebase para Cloud Functions 2.0.0 y versiones posteriores permite seleccionar el entorno de ejecución de Node.js. Puedes ejecutar todas las funciones de un proyecto de manera exclusiva en el entorno correspondiente a una de estas versiones compatibles de Node.js:

  • Node.js 6 (obsoleta)
  • Node.js 8
  • Node.js 10 (Beta)

Ten en cuenta que el entorno de ejecución de Node.js 10 se encuentra en versión Beta y que necesitas firebase-tools 4.0.0 o una versión posterior para implementar funciones en Node.js 8. Si tienes funciones basadas en Node.js 6, puedes seguir usando esa versión hasta que la quitemos. Debido a su estabilidad y compatibilidad con la sintaxis async/await, te recomendamos que uses Node.js 8.

Sigue estos pasos para configurar la versión de Node.js:

Configura la versión en el campo engines del archivo package.json que se creó en el directorio functions/ durante la inicialización. Por ejemplo, edita esta línea en package.json si quieres usar la versión 10:

  "engines": {"node": "10"}

El campo engines es obligatorio. En él, debes especificar una de las versiones compatibles de Node.js para que puedas implementar y ejecutar funciones. Actualmente, firebase init functions configura este campo como 8, la versión recomendada de Node.js para la mayoría de las implementaciones.

Configura el tiempo de espera y la asignación de memoria

En algunos casos, es posible que tus funciones necesiten requisitos especiales para tener un valor de tiempo de espera largo o una mayor asignación de memoria. Puedes establecer estos valores en Google Cloud Console o en el código fuente de la función (solamente en Firebase).

Usa el parámetro runWith en el SDK de Firebase para Cloud Functions 2.0.0. a fin de establecer la asignación de memoria y el tiempo de espera en el código fuente de la función. Esta opción de tiempo de ejecución acepta un objeto JSON de acuerdo con la interfaz RuntimeOptions, que permite definir los valores para timeoutSeconds y memory. Por ejemplo, esta función de almacenamiento usa 1 GB de memoria y su tiempo de espera se agota en 300 segundos:

const runtimeOpts = {
  timeoutSeconds: 300,
  memory: '1GB'
}

exports.myStorageFunction = functions
  .runWith(runtimeOpts)
  .storage
  .object()
  .onFinalize((object) = > {
    // do some complicated things that take a lot of memory and time
  });

El valor máximo para timeoutSeconds es de 540 o 9 minutos. Los valores válidos para memory son los siguientes:

  • 128MB
  • 256MB
  • 512MB
  • 1GB
  • 2GB

Para configurar el tiempo de espera y la asignación de memoria en Google Cloud Platform Console, realiza lo siguiente:

  1. En Google Cloud Platform Console, selecciona Cloud Functions en el menú de navegación izquierdo.
  2. Haz clic en el nombre de una función para seleccionarla desde la lista de funciones.
  3. Haz clic en el ícono Editar en el menú de la parte superior.
  4. Selecciona una asignación de memoria del menú desplegable Memoria asignada.
  5. Haz clic en Más para ver las opciones avanzadas y, a continuación, ingresa la cantidad de segundos en el cuadro de texto Tiempo de espera.
  6. Haz clic en Guardar para actualizar la función.