Tomando Firebase Serverless: aplicaciones móviles y web simplificadas
Publicado: 2022-03-11Las aplicaciones móviles y web generalmente requieren un servidor back-end. Las aplicaciones web requieren un servidor web para entregar contenido. Las aplicaciones también necesitan almacenar perfiles de usuario y medios como imágenes y videos. La comunicación entre la aplicación y el servidor a menudo se realiza mediante una API, que suele ser REST.
Las aplicaciones están codificadas en una variedad de idiomas. Una aplicación iOS está escrita en Swift u Objective-C. Las aplicaciones de Android están escritas en Java o Kotlin. Las aplicaciones web están escritas en HTML, CSS, JavaScript y, a menudo, marcos complejos como Angular o React. Los desarrolladores front-end necesitan conocer los lenguajes relevantes y sus herramientas de desarrollo asociadas.
Los servidores back-end están escritos en una variedad de lenguajes, incluidos Go, Java, PHP y Python. Cada uno de estos lenguajes tiene su propio conjunto de bibliotecas para facilitar la escritura de aplicaciones complejas.
La mayoría de los desarrolladores se consideran desarrolladores front-end o back-end. Los desarrolladores de pila completa que son competentes en ambos roles son relativamente raros.
Ejecutar y mantener un servidor back-end tiene sus propios desafíos. Los servidores necesitan ser construidos, actualizados y respaldados. Los servidores también deben protegerse para evitar la pérdida de datos accidental o malintencionada o el acceso a datos confidenciales. Además, los servidores deben tener asignados nombres de host y direcciones IP para poder conectarse.
¿Qué es Firebase?
Firebase comenzó como una arquitectura de mensajería móvil que fue adquirida por Google. Desde entonces, ha evolucionado hasta convertirse en un conjunto de más de 25 componentes que interoperan con Google Cloud Platform.
Firebase consta de kits de desarrollo de software (SDK), que permiten a los desarrolladores móviles y web acceder a la funcionalidad de la nube de manera simple, segura y confiable. Compensan automáticamente la mala conectividad de la red. Hay una consola web de Firebase para habilitar, administrar y proteger los componentes. También hay herramientas de línea de comandos y API REST para un uso más profundo.
Algunos componentes de Firebase son más conocidos que otros. Hay pocas dependencias entre los componentes, lo que permite la adopción incremental de la funcionalidad. La autenticación y el análisis de Firebase son los más utilizados.
Firebase ha evolucionado para convertirse en una plataforma que permite a los desarrolladores front-end web y móviles desarrollar aplicaciones completas sin necesidad de servidores back-end. Las mejoras recientes han facilitado en gran medida las soluciones sin servidor que brindan una alternativa viable, escalable y rentable a las soluciones de servidor de máquinas virtuales en la nube.
Precios y planes de facturación de Firebase
El plan de facturación básico de Firebase, llamado Spark, es gratuito. Hay límites para el uso de los recursos de la nube, pero son bastante generosos. Es posible ejecutar una aplicación de tamaño razonable sin incurrir en ningún cargo.
Un sitio web con hasta 1 GB de contenido y transferencias de menos de 10 GB/mes se puede alojar con el plan Spark. Firestore permite hasta 1 GB de datos y un tráfico de red de hasta 10 GB/mes. Los límites de almacenamiento en la nube son de hasta 5 GB de datos y descargas de hasta 1 GB por día.
Si la aplicación necesita más recursos, se requiere un plan de facturación pagado, como el pago por uso. Se siguen aplicando los límites gratuitos del plan Spark. Los cargos facturables son bastante bajos. Los precios se pueden encontrar en la página de precios de Firebase.
Las máquinas virtuales que se ejecutan en la nube incurren en cargos mientras se ejecutan, incluso si no se utilizan. Las soluciones sin servidor de Firebase escalan a cero. Esto significa que los recursos solo se ejecutan de manera efectiva cuando están en uso y no incurren en cargos cuando no están en uso. Esto es ideal para aplicaciones para negocios de temporada como alquileres de vacaciones o eventos periódicos como conciertos. Habría mucha actividad seguida de meses de inactividad.
Cómo configurar Firebase
Se requiere una cuenta de correo electrónico para la autenticación. Se prefiere una cuenta de correo de Google. Se pueden crear en https://mail.google.com.
También se requiere una cuenta de Google Cloud Platform (GCP). Una prueba gratuita está disponible aquí. Esto le da un crédito de $300, que está disponible por un año. Se requiere una tarjeta de crédito como prueba de identidad. Google puede cobrar $1 y luego reembolsarlo. La tarjeta de crédito se debitará mensualmente si la facturación está habilitada y se utilizan recursos facturables. También existen empresas proveedoras de Google que actúan como intermediarios para la facturación. Usted paga al proveedor por el uso de la nube y ellos pagan a Google. Tienen sus propios planes de facturación y pueden ofrecer una prueba gratuita.
Es importante monitorear la sección de facturación de la consola en la nube con frecuencia para monitorear el uso. Es fácil mantener activos los recursos, como el almacenamiento, cuando no se necesitan, lo que puede generar costos considerables con el tiempo.
Los proyectos de Firebase también son proyectos de GCP. Puede crear un proyecto de GCP e importarlo a Firebase, o crear un proyecto de Firebase, que también creará un proyecto de GCP. La consola Firebase está aquí.
Se requiere una configuración diferente para diferentes tipos de aplicaciones. Los principales son Android, iOS y aplicaciones web. Las instrucciones de configuración se pueden encontrar en las guías oficiales de Firebase.
Las herramientas de la interfaz de línea de comandos (CLI) de Firebase son necesarias para algunas operaciones. Estos requieren que Node.js
y la herramienta npm
estén instalados. Si se ejecuta en macOS o Linux, el comando npm
deberá ejecutarse con sudo
.
sudo npm install -g firebase-tools
Autenticacion y autorizacion
La autenticación de Firebase es quizás el componente de Firebase más utilizado. Los usuarios pueden seleccionar uno o más de varios mecanismos de autenticación. Estos son la dirección de correo electrónico y la contraseña, los números de teléfono y los proveedores de identidad federados de Google, Facebook, Twitter y GitHub. Se puede habilitar cualquier número de mecanismos de autenticación.
La interfaz de usuario de Firebase solicita al usuario el mecanismo a utilizar:
Firebase proporciona interfaces de usuario para la autenticación que se pueden invocar desde unas pocas líneas de código en el lado del cliente. También hay API para realizar la autenticación manualmente. En una autenticación exitosa, se genera un token de identidad que se puede usar para la validación de back-end.
Las API permiten a los usuarios de administración administrar usuarios mediante programación. Las operaciones incluyen:
- Crear, actualizar y eliminar usuarios
- Busque usuarios por criterios de búsqueda, como dirección de correo electrónico o número de teléfono
- Acceda a información como la fecha de creación de la cuenta y la última fecha y hora de inicio de sesión
- Valide direcciones de correo electrónico y números de teléfono sin tener que utilizar los flujos de trabajo existentes
La mayoría de las aplicaciones web y móviles requieren que un gran número de usuarios inicien sesión en sus aplicaciones. Por ejemplo, cualquier persona con una cuenta de correo de Google puede autenticarse en cualquier aplicación que permita la autenticación de Google. Se requiere una forma de autorización para restringir el acceso a la aplicación a ciertos usuarios. Esto se puede hacer fácilmente almacenando asociaciones entre direcciones de correo electrónico y roles de acceso en el almacenamiento de datos. En una autenticación exitosa, la dirección de correo electrónico se busca en el almacenamiento de datos. Si el usuario existe con los roles correctos, se otorga acceso; de lo contrario, se fuerza la sesión del usuario.
Alojamiento de base de fuego
El alojamiento de Firebase permite que el contenido web estático, que incluye JavaScript, se aloje en la nube sin necesidad de un servidor web. El contenido se almacena en caché en los bordes de una red de entrega de contenido (CDN) global. Esto permite un acceso rápido al contenido desde cualquier parte del mundo.
Se pueden alojar uno o más sitios web agregándolos a la sección Alojamiento de un proyecto de Firebase en Firebase Console. El contenido se entrega a través de SSL y se le asignan dos URL con el formato, [https://nombre-del-sitio.web.app] y https://nombre-del-sitio.firebaseapp.com, donde site-name
es el nombre del proyecto o un nombre del sitio especificado por el usuario.
Es muy fácil tener el sitio alojado desde su propio nombre de dominio siempre que pueda cambiar los registros DNS para el dominio. Agrega su nombre de dominio a un sitio en Firebase Console. A continuación, se le proporcionará un registro DNS TXT, que debe agregar al DNS de su dominio para demostrarle a Google que es el propietario del dominio. Una vez que el registro TXT está visible, puede obtener registros DNS A para el sitio. Un certificado SSL se aprovisiona automáticamente para el sitio. Una vez que se ha proporcionado el certificado, el sitio está disponible globalmente. En principio, las actualizaciones de DNS y el aprovisionamiento de certificados pueden tardar varias horas. En la práctica, el proceso se puede completar en 20 minutos.
Para agregar contenido al alojamiento, en primer lugar, cree un directorio para el sitio y cd
a él desde la línea de comandos. A continuación, inicie sesión en Firebase e inicialice el directorio del proyecto.
firebase login firebase init
Se le pedirá que seleccione un proyecto y qué servicios de cliente se requieren. Los servicios siempre se pueden agregar más adelante y no es necesario seleccionarlos en esta etapa.
Cree un archivo llamado firebase.json
, que define el directorio raíz del sitio web y los archivos que se excluirán. También necesitará un archivo .gitignore
para excluir archivos del control de versiones.
{ "hosting": { "public": "public", "ignore": [ "firebase.json", "**/.*", "**/node_modules/**" ] } }
Luego, copie el contenido estático en el directorio público. Finalmente, implemente el sitio en la nube.
firebase deploy
Para cambiar el contenido web, simplemente cambie los archivos de contenido y emita el comando de implementación. Cada implementación aparece como una versión en Firebase Console. Puede volver a una versión anterior con un solo clic.

Firebase Hosting también puede reescribir URI en archivos, Cloud Functions y Cloud Run. Esto simplifica mucho las cosas ya que no es necesario asignar un dominio a estos servicios. Las reescrituras se definen agregando una sección de reescrituras a la sección de alojamiento de firebase.json. La implementación del alojamiento fallará si el servicio no existe.
{ "hosting": { "public": "public", "rewrites": [ { "source": "/xxx", "destination": "/profile.html" }, { "source": "/yyy", "function": "profile" }, { "source": "/api{,/**}", "run": { "serviceId": "cloud-api", "region": "europe-west1" } } ] } }
Almacenamiento de datos
Firebase proporciona API de cliente para acceder al almacenamiento de datos basado en la nube. Hay tres tipos de almacenamiento:
- Base de datos en tiempo real
- Tienda de fuego en la nube
- Almacenamiento en la nube
Esto permite que los clientes móviles y web almacenen y recuperen datos sin necesidad de un servidor.
Base de datos en tiempo real
Realtime Database es una base de datos NoSQL alojada en la nube. Los datos en Realtime Database se sincronizan automáticamente en tiempo real con todos los dispositivos conectados. Funciona multiplataforma para Android, iOS y web. Los datos se almacenan como una estructura de árbol JSON. Las reglas de seguridad se pueden configurar para controlar el acceso de lectura y escritura a los datos.
Cada dispositivo mantiene una copia local de la base de datos. Esto significa que los datos están disponibles cuando no están conectados a la red. Al volver a conectarse, las copias locales y basadas en la nube de los datos se sincronizan.
Los datos son leídos por aplicaciones que utilizan un oyente. Un oyente escucha en un nodo en el árbol JSON. Cada vez que se modifican los datos en la consola o por otro usuario, se llama a la devolución de llamada del oyente con el nuevo valor de datos. Realtime Database también admite consultas. Cada consulta devuelve un nodo y todos sus nodos secundarios.
Las reglas de seguridad por defecto no permiten el acceso a los datos. Las reglas se pueden agregar globalmente o a nodos individuales del objeto JSON. Las reglas de seguridad controlan el acceso de lectura y escritura a los datos y pueden realizar la validación.
Realtime Database se adapta mejor a pequeños fragmentos de datos que no requieren una estructura de datos profundamente anidada. El límite gratuito es de 1 GB de datos.
Tienda de fuego en la nube
Cloud Firestore se considera el reemplazo de Realtime Database. Extiende la funcionalidad de Realtime Database. Los datos no están en un árbol JSON sino en una colección jerárquica de documentos. Cada documento consta de un conjunto de pares clave-valor y subdocumentos opcionales. Las consultas permiten un filtrado y clasificación más complejos y solo devuelven documentos completos. Las consultas no devuelven subdocumentos.
Cloud Firestore pronto reemplazará a Cloud Datastore. Se puede ejecutar en modo Datastore o en modo nativo. Todas las aplicaciones de Datastore se migrarán automáticamente a Cloud Firestore.
Cloud Firestore se adapta mejor a piezas de datos relativamente pequeñas. Puede tener una estructura de datos profundamente anidada. El límite gratuito es de 1 GB de datos.
Almacenamiento en la nube
Cloud Storage es para almacenar archivos como imágenes y videoclips. Los clientes móviles y web pueden usar Firebase para cargar y descargar archivos directamente desde y hacia la nube sin necesidad de un servidor back-end. El límite gratuito es de 5 GB de datos.
Funciones en la nube
Las funciones en la nube son una tecnología importante para crear aplicaciones sin servidor. Una función de nube se puede escribir en JavaScript, TypeScript, Python o Go, que se implementa directamente en la nube de Google. Una función se activa por una solicitud HTTP o por un evento en la nube, como escribir en Cloud Storage.
Una función en la nube solo puede manejar una solicitud a la vez, pero la nube escala automáticamente la función al replicarla. Una función de la nube escrita en Python usa la biblioteca Flask para manejar las solicitudes HTTP. La función toma un objeto de solicitud como parámetro y devuelve el cuerpo de la respuesta.
Una función Python Cloud simple requiere un directorio de trabajo, y el punto de entrada se encuentra en el archivo main.py
def simple_cloud_function(request): return "It worked"
Las dependencias son administradas por pip y van a un archivo llamado requirements.txt
.
Flask==1.0.2
Una función se implementa con la herramienta de línea de comandos de gcloud
. Especifica el nombre de la función, el idioma y el disparador.
gcloud functions deploy simple_cloud_function --runtime python37 \ --trigger-http
La URL de la función se muestra en la implementación y se puede encontrar ejecutando el comando describe.
gcloud functions describe simple_cloud_function Url: https://europe-west1-project-id.cloudfunctions.net/simplecloud_function
Cloud Functions puede llamar a las API de Google Cloud y Firebase para proporcionar funcionalidad de back-end. Proporcionan información de registro sobre el inicio de la ejecución y el tiempo de ejecución. Se pueden agregar fácilmente registros adicionales. Los registros se pueden ver en la interfaz de usuario de Stackdriver Logging y a través de la herramienta de línea de comandos de gcloud
.
gcloud functions logs read simple_cloud_function
Las funciones se pueden ver y eliminar en Google Cloud Console.
Las funciones de la nube se utilizan mejor para operaciones que ocurren con relativa poca frecuencia. Un ejemplo de uso es crear una miniatura cuando se carga una imagen en Cloud Storage. El límite gratuito es de 125.000 invocaciones al mes.
carrera en la nube
Cloud Run es una funcionalidad añadida recientemente que facilita enormemente las aplicaciones sin servidor. Permite que los contenedores Docker se ejecuten en la nube sin tener que realizar una configuración de infraestructura compleja. Puede ejecutarse en modo administrado, que utiliza el tiempo de ejecución de Knative, que se basa en Kubernetes. También se puede ejecutar en Anthos, que también se basa en Kubernetes pero permite que los contenedores se ejecuten en las nubes e incluso en su propio centro de datos. No es necesario configurar y administrar un clúster de Kubernetes, ya que todo se hace automáticamente.
Cloud Run puede administrar cualquier aplicación que se pueda integrar en las imágenes de Docker. Escala automáticamente el número de contenedores en función de la demanda. También se reduce a cero cuando no se utiliza el servicio. Los servicios no utilizados no incurren en cargos.
Los contenedores Docker necesitan ejecutar un servidor web si van a responder a las solicitudes HTTP. El servicio de Python usará Flask. El punto de entrada estará en app.py
.
from flask import Flask, request app = Flask(__name__) @app.route('/api/profile') def profile(): page = ''' Page content ''' return page
La aplicación necesita un Dockerfile
para crear la imagen.
FROM python ENV APP_HOME /app WORKDIR $APP_HOME COPY . . ENV PORT 8080 RUN pip install Flask gunicorn firebase-admin CMD exec gunicorn --bind :$PORT --workers 1 --threads 8 app:app
Los contenedores de Cloud Run se implementan directamente en la nube.
gcloud run deploy --image=image_name --platform=managed \ --region=europe-west1 --allow-unauthenticated
Si el nombre del servicio, la plataforma, la región o si se permite la autenticación no están definidos en la configuración del proyecto o no se proporcionan en la línea de comandos, se les solicitará. Una vez completada la implementación, se mostrará la URL del servicio. La URL también se puede obtener mediante el comando gcloud.
gcloud run services list SERVICE REGION URL LAST DEPLOYED BY LAST DEPLOYED AT cloud-api europe-west1 https://cloud-api-h42ifbxkyq-ew.a.run.app [email protected] 2020-02-05T10:53:30.006Z
La URL contiene un número aleatorio que es difícil de administrar. Aquí es donde las reglas de reescritura de Firebase Hosting se vuelven más útiles.
Los servicios se pueden ver y eliminar en Google Cloud Console.
Cloud Run es ideal para alojar una API REST. Los límites gratuitos mensuales son 180 000 segundos de CPU, 360 000 GB de segundos de memoria, 2 millones de solicitudes y 1 GB de salida de red. El límite de salida de red gratuita solo se aplica si el servicio se implementa en una región de América del Norte.
Autenticación
De forma predeterminada, los contenedores de Cloud Functions y Cloud Run son públicos y cualquiera puede acceder a ellos en Internet. Con las reglas de IAM en Cloud Console, los servicios se pueden restringir a miembros del proyecto, grupos de Google y direcciones de correo electrónico individuales.
Si existen restricciones, el acceso no autorizado está prohibido. Para habilitar el acceso, se debe agregar un token de identidad a los encabezados de solicitud. El token de identidad se puede obtener mediante el comando gcloud o durante el proceso de autenticación de Firebase.
gcloud auth print-identity-token
Se requiere un encabezado de autorización.
Authorization: Bearer id-token
Resumen
Google Cloud Platform y Firebase ofrecen una gama de productos que facilitan enormemente el desarrollo de aplicaciones móviles y web. La necesidad de un servidor back-end se puede eliminar por completo al permitir que los clientes accedan a la funcionalidad de la nube directamente o al implementar el código back-end en la nube mediante Cloud Functions o Cloud Run.
Las aplicaciones existentes se pueden migrar a serverless de forma incremental. De hecho, la forma en que la tecnología está evolucionando podría significar que las soluciones tradicionales de servidor basadas en máquinas virtuales ya no serán necesarias.