Google is committed to advancing racial equity for Black communities. See how.
Questa pagina è stata tradotta dall'API Cloud Translation.
Switch to English

Gestisci la distribuzione delle funzioni e le opzioni di runtime

Puoi distribuire, eliminare e modificare le funzioni utilizzando i comandi della CLI Firebase o impostando le opzioni di runtime nel codice sorgente delle funzioni.

Distribuisci funzioni

Per distribuire le funzioni, esegui questo comando della CLI di Firebase:

$ firebase deploy --only functions

Per impostazione predefinita, la CLI di Firebase distribuisce tutte le funzioni all'interno di index.js contemporaneamente. Se il tuo progetto contiene più di 5 funzioni, ti consigliamo di utilizzare il flag --only con nomi di funzione specifici per distribuire solo le funzioni che hai modificato. La distribuzione di funzioni specifiche in questo modo velocizza il processo di distribuzione e aiuta a evitare di incorrere in quote di distribuzione. Per esempio:

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

Quando si distribuisce un numero elevato di funzioni, è possibile superare la quota standard e ricevere messaggi di errore HTTP 429 o 500. Per risolvere questo problema, distribuire le funzioni in gruppi di 10 o meno.

Consulta il riferimento della CLI di Firebase per l'elenco completo dei comandi disponibili.

Per impostazione predefinita, la CLI di Firebase cerca il codice sorgente nella cartella functions/ . Puoi specificare un'altra cartella aggiungendo le seguenti righe in firebase.json :

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

Elimina funzioni

È possibile eliminare le funzioni distribuite in precedenza in questi modi:

  • esplicitamente nella CLI di Firebase con le functions:delete
  • utilizzando esplicitamente il menu contestuale nell'elenco delle funzioni nella console Firebase
  • implicitamente rimuovendo la funzione da index.js prima della distribuzione.

Tutte le operazioni di cancellazione richiedono di confermare prima di rimuovere la funzione dalla produzione.

L'eliminazione esplicita di funzioni nella CLI di Firebase supporta più argomenti e gruppi di funzioni e ti consente di specificare una funzione in esecuzione in una particolare regione. Inoltre, puoi ignorare la richiesta di conferma.

# 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 l'eliminazione implicita della funzione, firebase deploy analizza index.js e rimuove dalla produzione tutte le funzioni che sono state rimosse dal file.

Modifica il nome, la regione o il trigger di una funzione

Se si rinominano o si modificano le regioni o si attivano funzioni che gestiscono il traffico di produzione, seguire i passaggi in questa sezione per evitare di perdere eventi durante la modifica. Prima di seguire questi passaggi, assicurati innanzitutto che la tua funzione sia idempotente , poiché sia ​​la nuova versione che la vecchia versione della funzione verranno eseguite contemporaneamente durante la modifica.

Rinomina una funzione

Per rinominare una funzione, creare una nuova versione rinominata della funzione in index.js e quindi eseguire due comandi di distribuzione separati. Il primo comando distribuisce la nuova funzione denominata e il secondo comando rimuove la versione distribuita in precedenza. Ad esempio, se hai una funzione chiamata webhook che desideri modificare in webhookNew , modifica il codice come segue:

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

Quindi esegui i seguenti comandi per distribuire la nuova funzione:

# 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

Modifica la regione o le regioni di una funzione

Se stai modificando le regioni specificate per una funzione che gestisce il traffico di produzione, puoi prevenire la perdita di eventi eseguendo questi passaggi in ordine:

  1. Rinominare la funzione e modificarne la regione o le regioni come desiderato.
  2. Distribuire la funzione rinominata, che si traduce nell'esecuzione temporanea dello stesso codice in entrambi i gruppi di aree.
  3. Elimina la funzione precedente.

Ad esempio, se si dispone di una funzione chiamata webhook che si trova attualmente nella regione delle funzioni predefinite di us-central1 e si desidera us-central1 ad asia-northeast1 us-central1 , è necessario prima modificare il codice sorgente per rinominare la funzione e rivedere la regione .

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

Quindi distribuisci eseguendo:

$ firebase deploy --only functions:webhookAsia

Ora ci sono due funzioni identiche in esecuzione: webhook è in esecuzione in us-central1 e webhookAsia è in esecuzione in asia-northeast1 webhookAsia .

Quindi, elimina il webhook :

$ firebase functions:delete webhook

Ora c'è solo una funzione: webhookAsia , che è in esecuzione in asia-northeast1 webhookAsia .

Modificare il tipo di trigger di una funzione

Man mano che sviluppi la distribuzione di Cloud Functions per Firebase nel tempo, potrebbe essere necessario modificare il tipo di trigger di una funzione per vari motivi. Ad esempio, potresti voler:

  • onFinalize dall'evento onChange archiviazione legacy a onFinalize , onDelete , onArchive e onMetadataUpdate . (Ulteriori informazioni su questo argomento nella guida all'aggiornamento da beta a v1 o v2 ).
  • Passa da un tipo di evento Firebase Realtime Database o Cloud Firestore a un altro, come l'evento generico onWrite all'evento granulare onCreate .

Non è possibile modificare il tipo di evento di una funzione semplicemente cambiando il codice sorgente ed eseguendo il firebase deploy . Per evitare errori, modificare il tipo di trigger di una funzione con questa procedura:

  1. Modificare il codice sorgente per includere una nuova funzione con il tipo di trigger desiderato.
  2. Distribuire la funzione, che si traduce nell'esecuzione temporanea sia della vecchia che della nuova funzione.
  3. Elimina esplicitamente la vecchia funzione dalla produzione utilizzando la CLI di Firebase.

Ad esempio, se hai una funzione objectChanged con il tipo di evento onChange legacy e desideri cambiarlo in onFinalize , prima rinomina la funzione e modificala per avere il tipo di 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);
});

Quindi eseguire i seguenti comandi per creare prima la nuova funzione, prima di eliminare la vecchia funzione:

# 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

Imposta le opzioni di runtime

Cloud Functions per Firebase ti consente di selezionare opzioni di runtime come la versione runtime di Node.js, il timeout per funzione e l'allocazione della memoria.

Imposta la versione di Node.js.

Firebase SDK per Cloud Functions 2.0.0 e versioni successive consente una selezione del runtime Node.js. Puoi scegliere di eseguire tutte le funzioni in un progetto esclusivamente nell'ambiente di runtime corrispondente a una di queste versioni di Node.js supportate:

  • Node.js 14 (beta)
  • Node.js 12
  • Node.js 10
  • Node.js 8 (obsoleto l'8 giugno 2020) La distribuzione delle funzioni nel runtime Node.js 8 è stata disabilitata nella CLI di Firebase il 15 dicembre 2020. L'esecuzione delle funzioni già distribuite verrà interrotta in futuro; se sono state distribuite funzioni al runtime Node.js 8, si consiglia di eseguire l'aggiornamento al runtime Node.js 12 .

Per impostare la versione di Node.js:

Imposta la versione nel campo engines nel file package.json che è stato creato nella tua directory functions/ durante l'inizializzazione. Ad esempio, per utilizzare solo la versione 12, modifica questa riga in package.json :

  "engines": {"node": "12"}

Il campo engines è obbligatorio; deve specificare una delle versioni di Node.js supportate per poter distribuire ed eseguire le funzioni. Attualmente le firebase init functions imposta questo campo su 12 .

Aggiorna il tuo runtime Node.js.

Per aggiornare il tuo runtime Node.js:

  1. Assicurati di utilizzare il piano di fatturazione con pagamento in base al consumo di Blaze.
  2. Assicurati di utilizzare Firebase CLI versione 8.6.0 o successiva.
  3. Modificare il valore dei engines nel file package.json che è stato creato nella directory functions/ durante l'inizializzazione. Ad esempio, se esegui l'aggiornamento dalla versione 10 alla versione 12, la voce dovrebbe essere simile a questa: "engines": {"node": "12"}
  4. Facoltativamente, prova le modifiche utilizzando l' emulatore Firebase .
  5. Ridistribuisci le funzioni utilizzando Firebase CLI v8.1.0 o successiva.

Imposta timeout e allocazione della memoria

In alcuni casi, le funzioni potrebbero avere requisiti speciali per un valore di timeout lungo o una grande allocazione di memoria. Puoi impostare questi valori nella Google Cloud Console o nel codice sorgente della funzione (solo Firebase).

Per impostare l'allocazione della memoria e il timeout nel codice sorgente delle funzioni, utilizza il parametro runWith introdotto in Firebase SDK for Cloud Functions 2.0.0. Questa opzione di runtime accetta un oggetto JSON conforme all'interfaccia RuntimeOptions , che definisce i valori per timeoutSeconds e la memory . Ad esempio, questa funzione di archiviazione utilizza 1 GB di memoria e va in timeout dopo 300 secondi:

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

Il valore massimo per timeoutSeconds è 540 o 9 minuti. I valori validi per la memory sono:

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

Per impostare l'allocazione della memoria e il timeout nella Google Cloud Console:

  1. Nella Google Google Cloud Console seleziona Cloud Functions dal menu a sinistra.
  2. Selezionare una funzione facendo clic sul suo nome nell'elenco delle funzioni.
  3. Fare clic sull'icona Modifica nel menu in alto.
  4. Selezionare un'allocazione di memoria dal menu a discesa denominato Memoria allocata .
  5. Fare clic su Altro per visualizzare le opzioni avanzate e immettere un numero di secondi nella casella di testo Timeout .
  6. Fare clic su Salva per aggiornare la funzione.