获取我们在 Firebase 峰会上发布的所有信息,了解 Firebase 可如何帮助您加快应用开发速度并满怀信心地运行应用。了解详情

Administrar funciones

Puede implementar, eliminar y modificar funciones mediante los comandos de la CLI de Firebase o configurando las opciones de tiempo de ejecución en el código fuente de sus funciones.

Implementar funciones

Para implementar funciones, ejecute este comando de Firebase CLI:

firebase deploy --only functions

De manera predeterminada, Firebase CLI implementa todas las funciones dentro de index.js al mismo tiempo. Si su proyecto contiene más de 5 funciones, le recomendamos que use el indicador --only con nombres de función específicos para implementar solo las funciones que ha editado. La implementación de funciones específicas de esta manera acelera el proceso de implementación y lo ayuda a evitar las cuotas de implementación. Por ejemplo:

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

Al implementar una gran cantidad de funciones, es posible que exceda la cuota estándar y reciba mensajes de error HTTP 429 o 500. Para solucionar esto, implemente funciones en grupos de 10 o menos.

Consulte la referencia de Firebase CLI para ver la lista completa de comandos disponibles.

De forma predeterminada, Firebase CLI busca en la carpeta functions/ el código fuente. Si lo prefiere, puede organizar funciones en bases de código o múltiples conjuntos de archivos.

Eliminar funciones

Puede eliminar funciones implementadas previamente de estas maneras:

  • explícitamente en Firebase CLI con functions:delete
  • explícitamente en Google Cloud Console .
  • implícitamente eliminando la función de index.js antes de la implementación.

Todas las operaciones de eliminación le solicitan que confirme antes de eliminar la función de producción.

La eliminación explícita de funciones en Firebase CLI admite múltiples argumentos, así como grupos de funciones, y le permite especificar una función que se ejecuta en una región en particular. Además, puede anular el aviso 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

Con la eliminación implícita de funciones, firebase deploy analiza index.js y elimina de producción cualquier función que haya sido eliminada del archivo.

Modificar el nombre, la región o el disparador de una función

Si está renombrando o cambiando las regiones o desencadenando funciones que manejan el tráfico de producción, siga los pasos de esta sección para evitar perder eventos durante la modificación. Antes de seguir estos pasos, primero asegúrese de que su función sea idempotente , ya que tanto la versión nueva como la versión anterior de su función se ejecutarán al mismo tiempo durante el cambio.

Cambiar el nombre de una función

Para cambiar el nombre de una función, cree una nueva versión renombrada de la función en index.js y luego ejecute dos comandos de implementación separados. El primer comando implementa la función recién nombrada y el segundo comando elimina la versión implementada anteriormente. Por ejemplo, si tiene una función llamada webhook que le gustaría cambiar a webhookNew , revise 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");
});

Luego ejecute los siguientes comandos para implementar la nueva función:

# 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

Cambiar la región o regiones de una función

Si está cambiando las regiones especificadas para una función que maneja el tráfico de producción, puede evitar la pérdida de eventos realizando estos pasos en orden:

  1. Cambie el nombre de la función y cambie su región o regiones según lo desee.
  2. Implemente la función renombrada, lo que da como resultado la ejecución temporal del mismo código en ambos conjuntos de regiones.
  3. Elimina la función anterior.

Por ejemplo, si tiene una función llamada webhook que se encuentra actualmente en la región de funciones predeterminadas de us-central1 a asia-northeast1 , primero debe modificar su 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");
    });

Luego implemente ejecutando:

firebase deploy --only functions:webhookAsia

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

Luego, elimine webhook :

firebase functions:delete webhook

Ahora solo hay una función: webhookAsia , que se ejecuta en asia-northeast1 .

Cambiar el tipo de activador de una función

A medida que desarrolla su implementación de Cloud Functions para Firebase con el tiempo, es posible que deba cambiar el tipo de activador de una función por varios motivos. Por ejemplo, es posible que desee cambiar de un tipo de evento Firebase Realtime Database o Cloud Firestore a otro, como el evento onWrite genérico al evento onCreate más granular.

No es posible cambiar el tipo de evento de una función simplemente cambiando el código fuente y ejecutando firebase deploy . Para evitar errores, cambie el tipo de activador de una función mediante este procedimiento:

  1. Modifique el código fuente para incluir una nueva función con el tipo de activador deseado.
  2. Implemente la función, lo que da como resultado la ejecución temporal tanto de la función antigua como de la nueva.
  3. Elimine explícitamente la función anterior de la producción mediante Firebase CLI.

Por ejemplo, si tenía una función objectChanged que tiene el tipo de evento heredado onChange y desea cambiarla a onFinalize , primero cambie el nombre de la función y edítela 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);
});

Luego ejecute los siguientes comandos para crear primero la función nueva, antes de eliminar la función anterior:

# 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

Establecer opciones de tiempo de ejecución

Cloud Functions para Firebase le permite seleccionar opciones de tiempo de ejecución, como la versión de tiempo de ejecución de Node.js y el tiempo de espera por función, la asignación de memoria y las instancias de funciones mínimas y máximas.

Como práctica recomendada, estas opciones (excepto la versión de Node.js) deben configurarse en un objeto de configuración dentro del código de la función. Este objeto RuntimeOptions es la fuente de la verdad para las opciones de tiempo de ejecución de su función y anulará las opciones establecidas a través de cualquier otro método (como a través de la consola de Google Cloud o la CLI de gcloud).

Si su flujo de trabajo de desarrollo implica configurar manualmente las opciones de tiempo de ejecución a través de la consola de Google Cloud o la CLI de gcloud y no quiere que estos valores se anulen en cada implementación, establezca la opción preserveExternalChanges en true . Con esta opción establecida en true , Firebase fusiona las opciones de tiempo de ejecución establecidas en su código con la configuración de la versión implementada actualmente de su función con la siguiente prioridad:

  1. La opción se establece en el código de funciones: anular cambios externos.
  2. La opción se establece en RESET_VALUE en el código de funciones: anular los cambios externos con el valor predeterminado.
  3. La opción no está configurada en el código de funciones, pero está configurada en la función implementada actualmente: use la opción especificada en la función implementada.

No se recomienda usar la opción preserveExternalChanges: true para la mayoría de los escenarios porque su código ya no será la fuente completa de la verdad para las opciones de tiempo de ejecución de sus funciones. Si lo usa, verifique la consola de Google Cloud o use gcloud CLI para ver la configuración completa de una función.

Establecer la versión de Node.js

El SDK de Firebase para Cloud Functions 2.0.0 y superior permite una selección del tiempo de ejecución de Node.js. Puede optar por ejecutar todas las funciones de un proyecto exclusivamente en el entorno de tiempo de ejecución correspondiente a una de estas versiones compatibles de Node.js:

  • Node.js 16
  • Node.js 14

Para configurar la versión de Node.js:

Establezca la versión en el campo de engines en el archivo package.json que se creó en su directorio functions/ durante la inicialización. Por ejemplo, para usar solo la versión 16, edite esta línea en package.json :

  "engines": {"node": "16"}

El campo engines es obligatorio; debe especificar una de las versiones compatibles de Node.js para poder implementar y ejecutar funciones. Actualmente firebase init functions establecen este campo en 16 .

Actualice su tiempo de ejecución de Node.js

Para actualizar su tiempo de ejecución de Node.js:

  1. Asegúrese de que su proyecto esté en el plan de precios de Blaze .
  2. Asegúrese de estar usando Firebase CLI v9.17.0 o posterior.
  3. Cambie el valor de los engines en el archivo package.json que se creó en su directorio functions/ durante la inicialización. Por ejemplo, si está actualizando de la versión 10 a la versión 16, la entrada debería verse así: "engines": {"node": "16"}
  4. Opcionalmente, pruebe sus cambios con Firebase Local Emulator Suite .
  5. Vuelva a implementar las funciones con Firebase CLI v9.17.0 o posterior.

Controlar el comportamiento de escalado

De forma predeterminada, Cloud Functions para Firebase escala la cantidad de instancias en ejecución en función de la cantidad de solicitudes entrantes, lo que puede reducir la escala a cero instancias en tiempos de tráfico reducido. Sin embargo, si su aplicación requiere una latencia reducida y desea limitar la cantidad de inicios en frío, puede cambiar este comportamiento predeterminado especificando una cantidad mínima de instancias de contenedor que se mantendrán activas y listas para atender las solicitudes.

De manera similar, puede establecer un número máximo para limitar el escalado de instancias en respuesta a las solicitudes entrantes. Utilice esta configuración como una forma de controlar sus costos o de limitar la cantidad de conexiones a un servicio de respaldo, como una base de datos.

Reducir el número de arranques en frío

Para establecer el número mínimo de instancias de una función en el código fuente, use el método runWith . Este método acepta un objeto JSON conforme a la interfaz RuntimeOptions , que define el valor de minInstances . Por ejemplo, esta función establece un mínimo de 5 instancias para mantener el calor:

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

Aquí hay algunas cosas a considerar al establecer un valor para minInstances :

  • Si Cloud Functions para Firebase escala su aplicación por encima de su configuración de minInstances , experimentará un inicio en frío para cada instancia por encima de ese umbral.
  • Los inicios en frío tienen el efecto más severo en las aplicaciones con tráfico irregular. Si su aplicación tiene picos de tráfico y establece un valor de minInstances lo suficientemente alto como para que los inicios en frío se reduzcan con cada aumento de tráfico, verá una latencia significativamente reducida. Para aplicaciones con tráfico constante, no es probable que los inicios en frío afecten gravemente el rendimiento.
  • Establecer instancias mínimas puede tener sentido para entornos de producción, pero por lo general debe evitarse en entornos de prueba. Para escalar a cero en su proyecto de prueba pero aún así reducir los inicios en frío en su proyecto de producción, puede configurar minInstances según la variable de entorno 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
        });
    

Limitar el número máximo de instancias de una función

Para establecer instancias máximas en el código fuente de la función, use el método runWith . Este método acepta un objeto JSON conforme a la interfaz RuntimeOptions , que define valores para maxInstances . Por ejemplo, esta función establece un límite de 100 instancias para no sobrecargar una base de datos heredada hipotética:

exports.mirrorOrdersToLegacyDatabase = functions
    .runWith({
      // Legacy database only supports 100 simultaneous connections
      maxInstances: 100,
    })
    .firestore.document("orders/{orderId}")
    .onWrite((change, context) => {
      // Connect to legacy database
    });

Si una función HTTP se escala hasta el límite de maxInstances , las nuevas solicitudes se ponen en cola durante 30 segundos y luego se rechazan con un código de respuesta de 429 Too Many Requests si no hay ninguna instancia disponible para entonces.

Para obtener más información sobre las prácticas recomendadas para usar la configuración de instancias máximas, consulte estas prácticas recomendadas para usar maxInstances .

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

En algunos casos, sus funciones pueden tener requisitos especiales para un valor de tiempo de espera prolongado o una gran asignación de memoria. Puede establecer estos valores en Google Cloud Console o en el código fuente de la función (solo Firebase).

Para configurar la asignación de memoria y el tiempo de espera en el código fuente de las funciones, use el parámetro runWith introducido en Firebase SDK para Cloud Functions 2.0.0. Esta opción de tiempo de ejecución acepta un objeto JSON conforme a la interfaz RuntimeOptions , que define valores para timeoutSeconds y memory . Por ejemplo, esta función de almacenamiento usa 1 GB de memoria y se agota después de 300 segundos:

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

El valor máximo para timeoutSeconds es 540 o 9 minutos. La cantidad de memoria otorgada a una función corresponde a la CPU asignada para la función, como se detalla en esta lista de valores válidos para memory :

  • 128MB -200 MHz
  • 256MB — 400 MHz
  • 512MB — 800 MHz
  • 1GB : 1,4 GHz
  • 2GB : 2,4 GHz
  • 4GB : 4,8 GHz
  • 8GB : 4,8 GHz

Para configurar la asignación de memoria y el tiempo de espera en Google Cloud Console:

  1. En Google Google Cloud Console, seleccione Funciones en la nube en el menú de la izquierda.
  2. Seleccione una función haciendo clic en su nombre en la lista de funciones.
  3. Haga clic en el icono Editar en el menú superior.
  4. Seleccione una asignación de memoria del menú desplegable denominado Memoria asignada .
  5. Haga clic en Más para mostrar las opciones avanzadas e ingrese una cantidad de segundos en el cuadro de texto Tiempo de espera.
  6. Haga clic en Guardar para actualizar la función.