Prendere Firebase Serverless: applicazioni mobili e Web semplificate
Pubblicato: 2022-03-11Le applicazioni mobili e Web di solito richiedono un server back-end. Le applicazioni Web richiedono un server Web per fornire contenuto. Le applicazioni devono anche memorizzare profili utente e contenuti multimediali come immagini e video. La comunicazione tra l'applicazione e il server viene spesso eseguita utilizzando un'API, che di solito è REST.
Le applicazioni sono codificate in una gamma di lingue. Un'applicazione iOS è scritta in Swift o Objective-C. Le applicazioni Android sono scritte in Java o Kotlin. Le applicazioni Web sono scritte in HTML, CSS, JavaScript e spesso in framework complessi come Angular o React. Gli sviluppatori front-end devono conoscere i linguaggi rilevanti e gli strumenti di sviluppo associati.
I server back-end sono scritti in una vasta gamma di linguaggi tra cui Go, Java, PHP e Python. Ciascuno di questi linguaggi ha la propria suite di librerie per facilitare la scrittura di applicazioni complesse.
La maggior parte degli sviluppatori si considera sviluppatori front-end o back-end. Gli sviluppatori full-stack che sono competenti in entrambi i ruoli sono relativamente rari.
L'esecuzione e la manutenzione di un server back-end ha le sue sfide. I server devono essere creati, aggiornati e sottoposti a backup. I server devono anche essere protetti per prevenire la perdita di dati accidentale o dannosa o l'accesso a dati sensibili. Inoltre, i server devono avere nomi host e indirizzi IP assegnati in modo che possano essere connessi.
Cos'è Firebase?
Firebase è nato come un'architettura di messaggistica mobile che è stata acquisita da Google. Da allora si è evoluto per essere una suite di oltre 25 componenti che interagiscono con Google Cloud Platform.
Firebase è costituito da kit di sviluppo software (SDK), che consentono agli sviluppatori mobili e Web di accedere alle funzionalità cloud in modo semplice, sicuro e affidabile. Compensano automaticamente la scarsa connettività di rete. È disponibile una console Web Firebase per abilitare, amministrare e proteggere i componenti. Sono inoltre disponibili strumenti da riga di comando e API REST per un utilizzo più approfondito.
Alcuni componenti di Firebase sono meglio conosciuti di altri. Esistono poche dipendenze tra i componenti, il che consente l'adozione incrementale delle funzionalità. L'autenticazione e l'analisi di Firebase sono le più utilizzate.
Firebase si è evoluto fino a diventare una piattaforma che consente agli sviluppatori front-end mobile e web di sviluppare applicazioni complete senza la necessità di server back-end. I recenti miglioramenti hanno notevolmente facilitato le soluzioni serverless che forniscono un'alternativa praticabile, scalabile ed economica alle soluzioni server Cloud Virtual Machine.
Prezzi e piani di fatturazione di Firebase
Il piano di fatturazione Firebase di base, chiamato Spark, è gratuito. Esistono limiti all'utilizzo delle risorse cloud, ma sono piuttosto generosi. È possibile eseguire un'applicazione di dimensioni ragionevoli senza incorrere in alcun addebito.
Un sito Web con un massimo di 1 GB di contenuto e trasferimenti inferiori a 10 GB al mese possono essere ospitati con il piano Spark. Firestore consente fino a 1 GB di dati e traffico di rete fino a 10 GB/mese. I limiti di archiviazione cloud sono fino a 5 GB di dati e download fino a 1 GB/giorno.
Se l'applicazione necessita di più risorse, è necessario un piano di fatturazione a pagamento come il pagamento in base al consumo. Si applicano ancora i limiti gratuiti del piano Spark. Le spese fatturabili sono piuttosto basse. I prezzi possono essere trovati nella pagina dei prezzi di Firebase.
Le macchine virtuali eseguite nel cloud comportano costi mentre sono in esecuzione, anche se non vengono utilizzate. Le soluzioni serverless Firebase sono scalabili a zero. Ciò significa che le risorse sono effettivamente in esecuzione solo quando sono in uso e non sono soggette ad addebiti quando non sono in uso. Questo è l'ideale per applicazioni per attività stagionali come affitti per vacanze o eventi periodici come concerti. Ci sarebbero state molte attività seguite da mesi di inattività.
Come configurare Firebase
Per l'autenticazione è richiesto un account di posta elettronica. È preferibile un account di posta Google. Possono essere creati su https://mail.google.com.
È richiesto anche un account Google Cloud Platform (GCP). Una prova gratuita è disponibile qui. Questo ti dà $ 300 di credito, che è disponibile per un anno. È richiesta una carta di credito come prova di identità. Google potrebbe addebitare $ 1 e poi rimborsarlo. La carta di credito verrà addebitata mensilmente se la fatturazione è abilitata e vengono utilizzate risorse fatturabili. Esistono anche società di fornitori di Google che fungono da intermediari per la fatturazione. Paghi il provider per l'utilizzo del cloud e loro pagano Google. Hanno i propri piani di fatturazione e possono offrire una prova gratuita.
È importante monitorare frequentemente la sezione di fatturazione della console cloud per monitorare l'utilizzo. È facile mantenere attive risorse come lo storage quando non sono necessarie, il che può comportare costi considerevoli nel tempo.
I progetti Firebase sono anche progetti GCP. Puoi creare un progetto GCP e importarlo in Firebase oppure creare un progetto Firebase, che creerà anche un progetto GCP. La console Firebase è qui.
È necessaria una configurazione diversa per diversi tipi di applicazioni. I principali sono Android, iOS e applicazioni web. Le istruzioni di configurazione possono essere trovate nelle guide ufficiali di Firebase.
Gli strumenti Firebase Command Line Interface (CLI) sono necessari per alcune operazioni. Questi richiedono che Node.js
e lo strumento npm
siano installati. Se in esecuzione su macOS o Linux, il comando npm
dovrà essere eseguito con sudo
.
sudo npm install -g firebase-tools
Autenticazione e autorizzazione
L'autenticazione Firebase è forse il componente Firebase più utilizzato. Gli utenti possono selezionare uno o più di un certo numero di meccanismi di autenticazione. Si tratta di indirizzo e-mail e password, numeri di telefono e provider di identità federati Google, Facebook, Twitter e GitHub. È possibile abilitare un numero qualsiasi di meccanismi di autenticazione.
L'interfaccia utente di Firebase richiede all'utente il meccanismo da utilizzare:
Firebase fornisce interfacce utente per l'autenticazione che possono essere richiamate da poche righe di codice lato client. Esistono anche API per eseguire l'autenticazione manualmente. In caso di autenticazione riuscita, viene generato un token di identità che può essere utilizzato per la convalida back-end.
Le API consentono agli utenti di amministrazione di gestire gli utenti a livello di codice. Le operazioni includono:
- Creazione, aggiornamento ed eliminazione di utenti
- Cerca gli utenti in base a criteri di ricerca come indirizzo e-mail o numero di telefono
- Accedi a informazioni come la data di creazione dell'account e la data e l'ora dell'ultimo accesso
- Convalida indirizzi e-mail e numeri di telefono senza dover utilizzare i flussi di lavoro esistenti
La maggior parte delle applicazioni mobili e Web desidera che un gran numero di utenti acceda alle proprie applicazioni. Ad esempio, chiunque disponga di un account Google Mail può autenticarsi a qualsiasi applicazione che consenta l'autenticazione di Google. È necessaria una forma di autorizzazione per limitare l'accesso all'applicazione a determinati utenti. Questo può essere fatto facilmente archiviando le associazioni tra indirizzi e-mail e ruoli di accesso nell'archiviazione dei dati. In caso di autenticazione riuscita, l'indirizzo e-mail viene cercato nell'archivio dati. Se l'utente esiste con i ruoli corretti, l'accesso è concesso; in caso contrario, l'utente viene disconnesso forzatamente.
Hosting Firebase
L'hosting Firebase consente di ospitare nel cloud contenuto Web statico, che include JavaScript, senza la necessità di un server Web. Il contenuto è memorizzato nella cache ai margini di una rete di distribuzione dei contenuti (CDN) globale. Ciò consente un rapido accesso al contenuto da qualsiasi parte del mondo.
È possibile ospitare uno o più siti Web aggiungendoli alla sezione Hosting di un progetto Firebase nella Console Firebase. Il contenuto viene distribuito su SSL e vengono forniti due URL del modulo, [https://site-name.web.app] e https://site-name.firebaseapp.com, dove site-name
è il nome del progetto o un nome del sito specificato dall'utente.
È molto facile avere il sito ospitato dal tuo nome di dominio a condizione che tu possa modificare i record DNS per il dominio. Aggiungi il tuo nome di dominio a un sito sulla console Firebase. Ti verrà quindi fornito un record TXT DNS, che devi aggiungere al DNS del tuo dominio per dimostrare a Google che sei il proprietario del dominio. Una volta che il record TXT è visibile, puoi ottenere i record DNS A per il sito. Viene automaticamente fornito un certificato SSL per il sito. Una volta eseguito il provisioning del certificato, il sito è disponibile a livello globale. In linea di principio, possono essere necessarie diverse ore per gli aggiornamenti DNS e il provisioning dei certificati. In pratica, il processo può essere completato in 20 minuti.
Per aggiungere contenuto all'hosting, prima di tutto, crea una directory per il sito e cd
in essa dalla riga di comando. Quindi, accedi a Firebase e inizializza la directory del progetto.
firebase login firebase init
Ti verrà chiesto di selezionare un progetto e quali servizi client sono richiesti. I servizi possono sempre essere aggiunti in un secondo momento e non devono essere selezionati in questa fase.
Crea un file chiamato firebase.json
, che definisce la directory principale del sito Web e i file da escludere. Avrai anche bisogno di un file .gitignore
per escludere i file dal controllo della versione.
{ "hosting": { "public": "public", "ignore": [ "firebase.json", "**/.*", "**/node_modules/**" ] } }
Quindi, copia il contenuto statico nella directory pubblica. Infine, distribuisci il sito nel cloud.
firebase deploy
Per modificare il contenuto Web, è sufficiente modificare i file di contenuto ed eseguire il comando deploy. Ogni distribuzione viene visualizzata come una versione su Firebase Console. Puoi tornare a una versione precedente con un solo clic.
Firebase Hosting può anche riscrivere gli URI su file, Cloud Functions e Cloud Run. Questo semplifica notevolmente le cose in quanto non è necessario assegnare un dominio a questi servizi. Le riscritture vengono definite aggiungendo una sezione di riscrittura alla sezione di hosting di firebase.json. La distribuzione dell'hosting avrà esito negativo se il servizio non esiste.

{ "hosting": { "public": "public", "rewrites": [ { "source": "/xxx", "destination": "/profile.html" }, { "source": "/yyy", "function": "profile" }, { "source": "/api{,/**}", "run": { "serviceId": "cloud-api", "region": "europe-west1" } } ] } }
Archivio dati
Firebase fornisce API client per l'accesso all'archiviazione dei dati basata su cloud. Esistono tre tipi di archiviazione:
- Database in tempo reale
- Cloud Firestore
- Archiviazione su cloud
Ciò consente ai client mobili e Web di archiviare e recuperare i dati senza la necessità di un server.
Database in tempo reale
Il database in tempo reale è un database NoSQL ospitato nel cloud. I dati nel database in tempo reale vengono sincronizzati automaticamente in tempo reale su tutti i dispositivi collegati. Funziona su più piattaforme per Android, iOS e Web. I dati vengono archiviati come una struttura ad albero JSON. È possibile impostare regole di sicurezza per controllare l'accesso in lettura e scrittura ai dati.
Ciascun dispositivo conserva una copia locale del database. Ciò significa che i dati sono disponibili quando non sono connessi alla rete. Alla riconnessione, le copie locali e basate su cloud dei dati vengono sincronizzate.
I dati vengono letti dalle applicazioni utilizzando un listener. Un listener è in ascolto su un nodo nell'albero JSON. Ogni volta che i dati vengono modificati sulla console o da un altro utente, il callback del listener viene chiamato con il nuovo valore dei dati. Il database in tempo reale supporta anche le query. Ogni query restituisce un nodo e tutti i suoi nodi figlio.
Le regole di sicurezza per impostazione predefinita non consentono l'accesso ai dati. Le regole possono essere aggiunte a livello globale oa singoli nodi dell'oggetto JSON. Le regole di sicurezza controllano l'accesso in lettura e scrittura ai dati e possono eseguire la convalida.
Il database in tempo reale è più adatto a piccoli pezzi di dati che non richiedono una struttura dati profondamente nidificata. Il limite gratuito è di 1 GB di dati.
Cloud Firestore
Cloud Firestore è considerato il sostituto del database in tempo reale. Estende le funzionalità del database in tempo reale. I dati non si trovano in un albero JSON ma in una raccolta gerarchica di documenti. Ogni documento è costituito da un insieme di coppie chiave-valore e documenti secondari facoltativi. Le query consentono un filtraggio e un ordinamento più complessi e restituiscono solo documenti completi. Le query non restituiscono documenti secondari.
Cloud Firestore sostituirà presto Cloud Datastore. Può essere eseguito in modalità Datastore o in modalità nativa. Tutte le applicazioni Datastore verranno migrate automaticamente su Cloud Firestore.
Cloud Firestore è più adatto a dati relativamente piccoli. Può avere una struttura dati profondamente nidificata. Il limite gratuito è di 1 GB di dati.
Archiviazione su cloud
Cloud Storage serve per archiviare file come immagini e clip video. I client mobili e Web possono utilizzare Firebase per caricare e scaricare file direttamente da e verso il cloud senza la necessità di un server back-end. Il limite gratuito è di 5 GB di dati.
Funzioni cloud
Le funzioni cloud sono una tecnologia importante per la creazione di applicazioni serverless. Una funzione cloud può essere scritta in JavaScript, TypeScript, Python o Go, che viene distribuita direttamente nel cloud di Google. Una funzione viene attivata da una richiesta HTTP o da un evento nel cloud come la scrittura su Cloud Storage.
Una funzione cloud può gestire solo una richiesta alla volta, ma il cloud ridimensiona automaticamente la funzione replicandola. Una funzione cloud scritta in Python utilizza la libreria Flask per gestire le richieste HTTP. La funzione accetta un oggetto richiesta come parametro e restituisce il corpo della risposta.
Una semplice funzione Python Cloud richiede una directory di lavoro e il punto di ingresso va nel file main.py
.
def simple_cloud_function(request): return "It worked"
Le dipendenze sono gestite da pip e vanno in un file chiamato requirements.txt
.
Flask==1.0.2
Una funzione viene distribuita utilizzando lo strumento da riga di comando gcloud
. Specifica il nome della funzione, la lingua e il trigger.
gcloud functions deploy simple_cloud_function --runtime python37 \ --trigger-http
L'URL della funzione viene visualizzato durante la distribuzione e può essere trovato eseguendo il comando describe.
gcloud functions describe simple_cloud_function Url: https://europe-west1-project-id.cloudfunctions.net/simplecloud_function
Cloud Functions può chiamare le API di Google Cloud e Firebase per fornire funzionalità di back-end. Forniscono informazioni di registrazione sull'avvio dell'esecuzione e sul tempo di esecuzione. È possibile aggiungere facilmente registrazioni aggiuntive. I log possono essere visualizzati nell'interfaccia utente di Stackdriver Logging e tramite lo strumento a riga di comando gcloud
.
gcloud functions logs read simple_cloud_function
Le funzioni possono essere visualizzate ed eliminate in Google Cloud Console.
Le funzioni cloud vengono utilizzate al meglio per operazioni che si verificano relativamente di rado. Un esempio di utilizzo consiste nel creare una miniatura quando un'immagine viene caricata su Cloud Storage. Il limite gratuito è di 125.000 chiamate al mese.
Corsa sul cloud
Cloud Run è una funzionalità aggiunta di recente che facilita notevolmente le applicazioni serverless. Consente ai container Docker di essere eseguiti nel cloud senza dover eseguire complesse configurazioni dell'infrastruttura. Può essere eseguito in modalità gestita, che utilizza il runtime Knative, basato su Kubernetes. Può anche essere eseguito su Anthos, anch'esso basato su Kubernetes, ma consente ai container di essere eseguiti su cloud e persino sul proprio data center. Non è necessario configurare e gestire un cluster Kubernetes poiché tutto viene eseguito automaticamente.
Qualsiasi applicazione che può essere integrata nelle immagini Docker può essere gestita da Cloud Run. Ridimensiona automaticamente il numero di container in base alla domanda. Si riduce anche a zero quando il servizio non viene utilizzato. I servizi non utilizzati non comportano alcun addebito.
I contenitori Docker devono eseguire un server Web se devono rispondere alle richieste HTTP. Il servizio Python utilizzerà Flask. Il punto di ingresso sarà in app.py
.
from flask import Flask, request app = Flask(__name__) @app.route('/api/profile') def profile(): page = ''' Page content ''' return page
L'applicazione necessita di un Dockerfile
per creare l'immagine.
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
I container Cloud Run vengono distribuiti direttamente nel cloud.
gcloud run deploy --image=image_name --platform=managed \ --region=europe-west1 --allow-unauthenticated
Se il nome del servizio, la piattaforma, la regione o se consentire l'autenticazione non sono definiti nella configurazione del progetto o forniti sulla riga di comando, verranno richiesti. Una volta completata la distribuzione, verrà visualizzato l'URL del servizio. L'URL può anche essere ottenuto utilizzando il 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
L'URL contiene un numero casuale difficile da gestire. È qui che le regole di riscrittura di Firebase Hosting diventano più utili.
I servizi possono essere visualizzati ed eliminati in Google Cloud Console.
Cloud Run è ideale per ospitare un'API REST. I limiti mensili gratuiti sono 180.000 secondi CPU, 360.000 GB secondi di memoria, 2 milioni di richieste e 1 GB di rete in uscita. Il limite di uscita di rete gratuito si applica solo se il servizio è distribuito in una regione del Nord America.
Autenticazione
Per impostazione predefinita, i contenitori Cloud Functions e Cloud Run sono pubblici e sono accessibili da chiunque su Internet. Utilizzando le regole IAM in Cloud Console, i servizi possono essere limitati ai membri del progetto, ai gruppi Google e ai singoli indirizzi email.
Se sono in vigore restrizioni, l'accesso non autorizzato è vietato. Per consentire l'accesso, è necessario aggiungere un token di identità alle intestazioni della richiesta. Il token di identità può essere ottenuto utilizzando il comando gcloud o durante il processo di autenticazione di Firebase.
gcloud auth print-identity-token
È richiesta un'intestazione di autorizzazione.
Authorization: Bearer id-token
Sommario
Google Cloud Platform e Firebase forniscono una gamma di prodotti che facilitano notevolmente lo sviluppo di applicazioni web e mobili. La necessità di un server back-end può essere completamente eliminata consentendo ai client di accedere direttamente alle funzionalità cloud o distribuendo codice back-end nel cloud utilizzando Cloud Functions o Cloud Run.
Le applicazioni esistenti possono essere migrate a serverless in modo incrementale. In effetti, il modo in cui la tecnologia si sta evolvendo potrebbe significare che le tradizionali soluzioni server basate su macchine virtuali non saranno più necessarie.