Usa los comandos de Firebase CLI o configura opciones de entorno 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 que uses la marca --only
con nombres de funciones específicas para implementar solo las funciones que editaste. 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
Cuando implementas una gran cantidad de funciones, es posible que excedas la cuota estándar y recibas mensajes de error HTTP 429 o 500. Para solucionar este problema, implementa funciones en grupos de 10 o menos.
Para ver una lista completa de los comandos disponibles, consulta la Referencia de Firebase CLI.
Según 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.
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:
- Cambia el nombre de la función y sus regiones como desees.
- Implementa la función con el nombre nuevo. Esto ejecutará temporalmente el mismo código en ambos conjuntos de regiones.
- Borra la función anterior.
Por ejemplo, si tienes una función llamada webhook
que se encuentra actualmente en la región de funciones predeterminada de us-central1
y deseas migrarla a asia-northeast1
, primero debes modificar tu código fuente para cambiarle el nombre 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
se ejecuta 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:
- Cambiar el evento
onChange
del almacenamiento heredado aonFinalize
,onDelete
,onArchive
yonMetadataUpdate
(obtén más información en la guía de actualización de la versión beta a la versión 1 o a la versión 2) - Cambiar de un tipo de evento de Firebase Realtime Database o Cloud Firestore a otro, como del evento genérico
onWrite
al evento detalladoonCreate
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:
- Modifica el código fuente para que incluya una función nueva con el tipo de activador que desees.
- Implementa la función, lo que tendrá como resultado la ejecución temporal de la función antigua y de la nueva.
- Borra de producción la función antigua de forma explícita con Firebase CLI.
Por ejemplo, si tienes 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 por función, la asignación de memoria y las instancias de función mínima o máxima.
Configura 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 16 (beta)
- Node.js 14
- Node.js 12
- Node.js 10
- Node.js 8 (obsoleto desde el 8 de junio de 2020): El 15 de diciembre de 2020, se inhabilitó en Firebase CLI la implementación de funciones en el entorno de ejecución de Node.js 8. La ejecución de funciones ya implementadas se detendrá más adelante. Si implementaste funciones en el entorno de ejecución de Node.js 8, te recomendamos que actualices al entorno de ejecución de Node.js 14
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 la línea que está a continuación
en package.json
si quieres usar solo la versión 14:
"engines": {"node": "14"}
El campo engines
es obligatorio. En él, debes especificar una de las versiones compatibles
de Node.js para poder implementar y ejecutar funciones. Actualmente firebase init functions
configura este campo como 14
.
Actualiza el entorno de ejecución de Node.js
Sigue estos pasos para actualizar el entorno de ejecución de Node.js:
- Asegúrate de que tu proyecto tenga el plan de precios Blaze.
- Asegúrate de usar la versión 8.6.0 o posterior de Firebase CLI.
- Cambia el valor de
engines
en el archivopackage.json
que se creó en el directoriofunctions/
durante la inicialización. Por ejemplo, si actualizas de la versión 10 a la 14, la entrada debería tener este aspecto:"engines": {"node": "14"}
. - También puedes probar los cambios con Firebase Local Emulator Suite.
- Vuelve a implementar las funciones con Firebase CLI v8.1.0 o una versión posterior.
Controla el comportamiento del escalamiento
Según la configuración predeterminada, Cloud Functions para Firebase escala la cantidad de instancias en ejecución según la cantidad de solicitudes entrantes y podría reducir la escala verticalmente a cero en los momentos con menos tráfico. Sin embargo, si tu app requiere una latencia reducida y deseas limitar la cantidad de inicios en frío, puedes cambiar este comportamiento predeterminado si especificas una cantidad mínima de instancias de contenedor que se deben mantener en espera y listas para entregar solicitudes.
De manera similar, puedes establecer una cantidad máxima para limitar el escalamiento de las instancias en respuesta a las solicitudes entrantes. Usa este parámetro de configuración como una forma de controlar tus costos o limitar la cantidad de conexiones a un servicio de respaldo, como una base de datos.
Reduce la cantidad de inicios en frío
Si quieres establecer una cantidad mínima de instancias para una función en el código fuente, usa el
parámetro
runWith
. Esta opción de tiempo de ejecución acepta
un objeto JSON de acuerdo con la
interfaz RuntimeOptions
,
que define el valor de minInstances
. Por ejemplo,
esta función establece un mínimo de 5 instancias para mantenerse en espera:
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
});
A continuación, se mencionan algunos puntos que deberás tener en cuenta cuando configures un valor para minInstances
:
- Si Cloud Functions para Firebase escala tu app por sobre el parámetro de configuración de
minInstances
, experimentarás un inicio en frío en cada instancia que supere ese umbral. - Los inicios en frío afectan de forma más grave a las apps con aumento de tráfico. Si tu
app tiene un aumento de tráfico y estableces un valor de
minInstances
lo suficientemente alto como para que los inicios en frío se reduzcan en cada aumento de tráfico, verás una disminución significativa de la latencia. En el caso de las apps con tráfico constante, es poco probable que los inicios en frío afecten gravemente al rendimiento. Configurar instancias mínimas puede ser útil para los entornos de producción, pero, por lo general, se debe evitar en entornos de prueba. Para reducir la escala a cero en tu proyecto de prueba y seguir disminuyendo los inicios en frío en el proyecto de producción, puedes configurar
minInstances
según la variable de entornoFIREBASE_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 });
Limita la cantidad máxima de instancias para una función
Para establecer el máximo de instancias en el código fuente de la función, usa el
parámetro
runWith
. Esta opción de tiempo de ejecución acepta
un objeto JSON de acuerdo con la interfaz
RuntimeOptions
,
que permite definir los 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, de la siguiente manera:
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 de HTTP se escala verticalmente hasta el límite de maxInstances
, las solicitudes nuevas
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 una instancia disponible para ese momento.
A fin de obtener más información sobre las prácticas recomendadas para usar la configuración de instancias máximas, consulta
estas
prácticas recomendadas sobre el uso de maxInstances
.
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:
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 de 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 MHz256MB
: 400 MHz512MB
: 800 MHz1GB
: 1.4 GHz2GB
: 2.4 GHz4GB
: 4.8 GHz8GB
: 4.8 GHz
Si quieres configurar el tiempo de espera y la asignación de memoria en Google Cloud Console, sigue estos pasos:
- En Google Cloud Console, selecciona Cloud Functions en el menú de la izquierda.
- Haz clic en el nombre de una función para elegirla en la lista de funciones.
- Haz clic en el ícono Editar en el menú de la parte superior.
- Selecciona una asignación de memoria del menú desplegable Memoria asignada.
- 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.
- Haz clic en Guardar para actualizar la función.