Pianificare le esportazioni di dati
Questa pagina descrive come pianificare le esportazioni dei dati di Firestore. Per eseguire le esportazioni in base a una pianificazione, ti consigliamo di utilizzare Cloud Run Functions e Cloud Scheduler.
Prima di iniziare
Prima di pianificare le esportazioni di dati gestite, devi completare le seguenti attività:
- Abilita la fatturazione per il tuo Google Cloud progetto. Solo i progetti con la fatturazione abilitata possono utilizzare la funzionalità di esportazione e importazione. Google Cloud
- Le operazioni di esportazione richiedono un bucket Cloud Storage di destinazione. Crea un bucket Cloud Storage in una località vicina alla località del database Firestore. Non puoi utilizzare un bucket con pagamento a carico del richiedente per le operazioni di esportazione.
Creare una Cloud Function e un job Cloud Scheduler
Per creare una funzione Cloud Function Node.js che avvia un'esportazione dei dati di Firestore e un job Cloud Scheduler per chiamare la funzione:
Interfaccia a riga di comando di Firebase
-
Installa l'interfaccia a riga di comando di Firebase. In una nuova directory, inizializza l'interfaccia a riga di comando per Cloud Run Functions:
firebase init functions --project PROJECT_ID
- Seleziona JavaScript come lingua.
- (Facoltativo) Abilita ESLint.
- Inserisci
yper installare le dipendenze.
-
Sostituisci il codice nel file
functions/index.jscon il seguente:const functions = require('firebase-functions'); const firestore = require('@google-cloud/firestore'); const client = new firestore.v1.FirestoreAdminClient(); // Replace BUCKET_NAME const bucket = 'gs://BUCKET_NAME'; exports.scheduledFirestoreExport = functions.pubsub .schedule('every 24 hours') .onRun((context) => { const projectId = process.env.GCP_PROJECT; const databaseName = client.databasePath(projectId, '(default)'); return client.exportDocuments({ name: databaseName, outputUriPrefix: bucket, // Leave collectionIds empty to export all collections // or set to a list of collection IDs to export, // collectionIds: ['users', 'posts'] collectionIds: [] }) .then(responses => { const response = responses[0]; console.log(`Operation Name: ${response['name']}`); }) .catch(err => { console.error(err); throw new Error('Export operation failed'); }); });
-
Nel codice precedente, modifica quanto segue:
- Sostituisci
BUCKET_NAMEcon il nome del tuo bucket. - Sostituisci
YOUR_PROJECT_IDcon l'ID progetto . - Modifica
every 24 hoursper impostare la pianificazione di esportazione. Utilizza la sintassi cron.yaml di App Engine o il formato unix-cron (* * * * *). -
Modifica
collectionIds: []per esportare solo i gruppi di raccolte specificati Lascia invariato per esportare tutti i gruppi di raccolte.
- Sostituisci
-
Esegui il deployment della funzione pianificata:
firebase deploy --only functions
Google Cloud Console
Crea una Cloud Function
-
Vai alla pagina Cloud Functions nella Google Cloud console:
- Fai clic su Scrivi una funzione.
- Inserisci un nome della funzione, ad esempio
firestore-export. - In Trigger, seleziona Cloud Pub/Sub.
- In Argomento, seleziona Crea nuovo argomento. Inserisci un nome per
l'argomento Pub/Sub, ad esempio
initiateFirestoreExport. Prendi nota del nome dell'argomento, perché ti servirà per creare il job Cloud Scheduler. - In Codice sorgente, seleziona Editor incorporato. Inserisci il
seguente codice in
index.js: Nel codice precedente, modifica quanto segue:const firestore = require('@google-cloud/firestore'); const client = new firestore.v1.FirestoreAdminClient(); // Replace BUCKET_NAME const bucket = 'gs://BUCKET_NAME' exports.scheduledFirestoreExport = (event, context) => { // Access the GCLOUD_PROJECT environment variable set by the runtime. const projectId = process.env.GOOGLE_CLOUD_PROJECT || process.env.GCLOUD_PROJECT; // Use the DATABASE_ID environment variable if set, // otherwise default to '(default)' const databaseId = process.env.DATABASE_ID || '(default)'; const databaseName = client.databasePath( projectId, databaseId ); return client .exportDocuments({ name: databaseName, outputUriPrefix: bucket, // Leave collectionIds empty to export all collection groups // or define a list of collection group IDs: // collectionIds: ['users', 'posts'] collectionIds: [], }) .then(responses => { const response = responses[0]; console.log(`Operation Name: ${response['name']}`); return response; }) .catch(err => { console.error(err); }); };
- Sostituisci
BUCKET_NAMEcon il nome del tuo bucket. -
Modifica
collectionIds: []per esportare solo i gruppi di raccolte specificati Lascia invariato per esportare tutti i gruppi di raccolte. -
(Facoltativo) Se utilizzi un database non predefinito, assicurati di impostare la variabile di ambiente
DATABASE_IDquando crei la funzione Cloud Function. Se utilizzi un runtime in cuiGOOGLE_CLOUD_PROJECTnon è impostato automaticamente, potresti doverlo impostare manualmente o sostituirlo con l'ID progetto nel codice.
- Sostituisci
- In
package.json, aggiungi la seguente dipendenza:{ "dependencies": { "@google-cloud/firestore": "^1.3.0" } } - In Funzione da eseguire, inserisci
scheduledFirestoreExport, il nome della funzione inindex.js. - Fai clic su Crea per eseguire il deployment della Cloud Function.
Crea un job Cloud Scheduler
Poi, crea un job Cloud Scheduler che chiama la Cloud Function:
-
Vai alla pagina Cloud Scheduler nella Google Cloud console:
- Fai clic su Crea job.
- Inserisci un Nome per il job, ad esempio
scheduledFirestoreExport. - Inserisci una Frequenza, ad esempio
every 24 hours. - Seleziona un Fuso orario.
- In Target, seleziona Pub/Sub. Nel campo Argomento, inserisci il nome dell'argomento Pub/Sub che hai definito insieme alla Cloud Function,
initiateFirestoreExportnell'esempio precedente. - Nel campo Payload, inserisci
start export. Il job richiede un payload definito, ma la Cloud Function precedente non utilizza effettivamente questo valore. - Fai clic su Crea.
Configurare le autorizzazioni di accesso
Poi, concedi alla Cloud Function l'autorizzazione per avviare le operazioni di esportazione e scrivere nel bucket GCS.
Questa funzione Cloud Run utilizza un account di servizio per autenticare e autorizzare le operazioni di esportazione. Il account di servizio utilizzato dipende dalla configurazione di Cloud Run Functions:
- Cloud Functions (1ª generazione.): utilizza il account di servizio predefinito di App Engine:
PROJECT_ID@appspot.gserviceaccount.com - Cloud Run Functions (2ª generazione.): utilizza il service account predefinito di Compute Engine
service account:
PROJECT_NUMBER-compute@developer.gserviceaccount.com
Questo account di servizio richiede l'autorizzazione per avviare un'operazione di esportazione e scrivere nel bucket Cloud Storage. Per concedere queste autorizzazioni, assegna i seguenti ruoli IAM al account di servizio:
Cloud Datastore Import Export Admin- Ruolo
Storage Adminnel bucket Cloud Run Invoker(obbligatorio per Cloud Run Functions (2ª generazione.) per consentire al servizio di attivazione di richiamare la funzione)
Puoi utilizzare gli strumenti a riga di comando gcloud e gsutil
per assegnare questi ruoli.
Se non sono già installati, puoi accedere a questi
strumenti da Cloud Shell nella Google Cloud console:
Avvia Cloud Shell
-
Assegna il ruolo Cloud Datastore Import Export Admin. Sostituisci PROJECT_ID e SERVICE_ACCOUNT (ad es.
PROJECT_ID@appspot.gserviceaccount.comoPROJECT_NUMBER-compute@developer.gserviceaccount.com) ed esegui il seguente comando:gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:SERVICE_ACCOUNT \ --role roles/datastore.importExportAdmin -
Assegna il ruolo Storage Admin al bucket. Sostituisci SERVICE_ACCOUNT e BUCKET_NAME, ed esegui il seguente comando:
gsutil iam ch serviceAccount:SERVICE_ACCOUNT:admin \ gs://BUCKET_NAME -
(Per Cloud Run Functions (2ª generazione.)) Assegna il Cloud Run Invoker ruolo al account di servizio. Sostituisci PROJECT_ID e SERVICE_ACCOUNT, ed esegui il seguente comando:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:SERVICE_ACCOUNT \ --role roles/run.invoker
Se disabiliti o elimini il account di servizio predefinito di App Engine, l'app App Engine perderà l'accesso al database Firestore. Se hai disabilitato il account di servizio App Engine, puoi riattivarlo. Per maggiori informazioni, consulta la sezione relativa all'abilitazione di un service account. Se hai eliminato il account di servizio App Engine negli ultimi 30 giorni, puoi ripristinarlo. Per maggiori informazioni, consulta la sezione relativa all'annullamento dell'eliminazione di un service account.
Testare il job Cloud Scheduler e la funzione Cloud Functions
Puoi testare il job Cloud Scheduler nella pagina Cloud Scheduler di the Google Cloud console.
Vai alla pagina Cloud Scheduler nella Google Cloud console.
Vai a Cloud SchedulerNella riga del nuovo job Cloud Scheduler, fai clic su Esegui ora.
Dopo alcuni secondi, il job Cloud Scheduler dovrebbe aggiornare la colonna dei risultati a Successo e Ultima esecuzione all'ora corrente. Potrebbe essere necessario fare clic su Aggiorna.
La pagina Cloud Scheduler conferma solo che il job ha chiamato la Cloud Function. Apri la pagina Cloud Function per visualizzare i log della funzione.
Visualizzare i log di Cloud Function
Per verificare se la Cloud Function ha avviato correttamente un'operazione di esportazione, apri i log della funzione:
Console Firebase
Nella console Firebase, vai a Hosting e serverless > Funzioni.
Console di GCP
Vai alla pagina Cloud Run Functions nella Google Cloud console.
Visualizzare l'avanzamento dell'esportazione
Puoi utilizzare il comando gcloud firestore operations list per visualizzare l'
avanzamento delle operazioni di esportazione. Per maggiori informazioni, consulta la sezione relativa alla
gestione delle operazioni di esportazione e importazione.
Una volta completata un'operazione di esportazione, puoi visualizzare i file di output nel bucket Cloud Storage:
Apri il browser di Cloud Storage