Pianificare le esportazioni di dati

Questa pagina descrive come pianificare le esportazioni dei tuoi Cloud Firestore dati. Per eseguire le esportazioni in base a una pianificazione, ti consigliamo di utilizzare Cloud Functions e Cloud Scheduler.

Prima di iniziare

Prima di pianificare le esportazioni di dati gestite, devi completare le seguenti attività:

  1. Abilita la fatturazione per il tuo progetto Google Cloud. Solo Google Cloud progetti con fatturazione abilitata possono utilizzare la funzionalità di esportazione e importazione.
  2. Le operazioni di esportazione richiedono un bucket Cloud Storage di destinazione. Crea un bucket in una località vicina alla località del tuo database.Cloud StorageCloud Firestore Non puoi utilizzare un bucket con pagamento a carico del richiedente per le operazioni di esportazione.

Creare una funzione Cloud Functions e un job Cloud Scheduler

Segui i passaggi riportati di seguito per creare una funzione Cloud Functions Node.js che avvia un'esportazione dei dati Cloud Firestore e un job Cloud Scheduler per chiamare la funzione:

Interfaccia a riga di comando di Firebase
  1. Installa l'interfaccia a riga di comando di Firebase. In una nuova directory, inizializza l'interfaccia a riga di comando per Cloud Functions:

    firebase init functions --project PROJECT_ID
    1. Seleziona JavaScript come linguaggio.
    2. (Facoltativo) Abilita ESLint.
    3. Inserisci y per installare le dipendenze.
  2. Sostituisci il codice nel file functions/index.js con 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');
      });
    });
  3. Nel codice riportato sopra, modifica quanto segue:
    • Sostituisci BUCKET_NAME con il nome del tuo bucket.
    • Sostituisci YOUR_PROJECT_ID con l'ID del progetto
    • Modifica every 24 hours per 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.

  4. Esegui il deployment della funzione pianificata:

    firebase deploy --only functions
Console Google Cloud
Crea una funzione Cloud
  1. Vai alla pagina Cloud Functions nella console Google Cloud:

    Vai a Cloud Functions

  2. Fai clic su Scrivi una funzione.
  3. Inserisci un nome per la funzione, ad esempio firestore-export.
  4. In Trigger, seleziona Cloud Pub/Sub.
  5. 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.
  6. In Codice sorgente, seleziona Editor incorporato. Inserisci il seguente codice in index.js:
    const firestore = require('@google-cloud/firestore');
    const client = new firestore.v1.FirestoreAdminClient();
    // Replace BUCKET_NAME
    const bucket = 'gs://BUCKET_NAME'
    
    exports.scheduledFirestoreExport = (event, context) => {
      const databaseName = client.databasePath(
        YOUR_PROJECT_ID,
        '(default)'
      );
    
      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);
        });
    };
    Nel codice riportato sopra, modifica quanto segue:
    • Sostituisci BUCKET_NAME con il nome del tuo bucket.
    • Modifica collectionIds: [] per esportare solo i gruppi di raccolte specificati Lascia invariato per esportare tutti i gruppi di raccolte.

  7. In package.json, aggiungi la seguente dipendenza:
    {
      "dependencies": {
        "@google-cloud/firestore": "^1.3.0"
      }
    }
  8. In Funzione da eseguire, inserisci scheduledFirestoreExport, il nome della funzione in index.js.
  9. Fai clic su Crea per eseguire il deployment della funzione Cloud.
Crea un job Cloud Scheduler

Poi, crea un job Cloud Scheduler che chiama la funzione Cloud:

  1. Vai alla pagina Cloud Scheduler nella console Google Cloud:

    Vai a Cloud Scheduler

  2. Fai clic su Crea job.
  3. Inserisci un Nome per il job, ad esempio scheduledFirestoreExport.
  4. Inserisci una Frequenza, ad esempio every 24 hours.
  5. Seleziona un Fuso orario.
  6. In Target, seleziona Pub/Sub. Nel campo Argomento, inserisci il nome dell'argomento Pub/Sub che hai definito insieme alla funzione Cloud, initiateFirestoreExport nell'esempio precedente.
  7. Nel campo Payload, inserisci start export. Il job richiede un payload definito, ma la funzione Cloud riportata sopra non utilizza questo valore.
  8. Fai clic su Crea.
A questo punto, hai eseguito il deployment della funzione Cloud e Cloud Scheduler del job, ma la funzione Cloud ha ancora bisogno delle autorizzazioni di accesso per eseguire le operazioni di esportazione.

Configurare le autorizzazioni di accesso

Poi, concedi alla funzione Cloud l'autorizzazione per avviare le operazioni di esportazione e scrivere nel bucket GCS.

Questa funzione Cloud utilizza il service account predefinito del progetto per autenticare e autorizzare le operazioni di esportazione. Quando crei un progetto, viene creato un service account predefinito con il seguente nome:

PROJECT_ID@appspot.gserviceaccount.com

Questo service account 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 service account predefinito:

  • Cloud Datastore Import Export Admin
  • Ruolo Owner o Storage Admin nel bucket

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 console Google Cloud:
Avvia Cloud Shell

  1. Assegna il ruolo Cloud Datastore Import Export Admin. Sostituisci PROJECT_ID, ed esegui il seguente comando:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member serviceAccount:PROJECT_ID@appspot.gserviceaccount.com \
        --role roles/datastore.importExportAdmin
  2. Assegna il ruolo Amministratore Storage nel bucket. Sostituisci PROJECT_ID e BUCKET_NAME, ed esegui il seguente comando:

    gsutil iam ch serviceAccount:PROJECT_ID@appspot.gserviceaccount.com:admin \
        gs://BUCKET_NAME

Se disabiliti o elimini il tuo App Engine service account predefinito, la tua App Engine app perderà l'accesso al tuo Cloud Firestore database. Se hai disabilitato il service account App Engine, puoi riattivarlo. Per maggiori informazioni, consulta la sezione relativa all'abilitazione di un service account. Se hai eliminato il service account 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

Puoi testare il job Cloud Scheduler nella pagina Cloud Scheduler della console Google Cloud.

  1. Vai alla pagina Cloud Scheduler nella console Google Cloud.
    Vai a Cloud Scheduler

  2. Nella 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 funzione Cloud. Apri la pagina della funzione Cloud per visualizzare i log della funzione.

Visualizzare i log della funzione Cloud

Per verificare se la funzione Cloud ha avviato correttamente un'operazione di esportazione, apri i log della funzione:

Console Firebase

Vai alla pagina Cloud Functions nella console Firebase.

Vai ai log delle funzioni

Console di GCP

Vai alla pagina Cloud Functions nella console Google Cloud.

Vai al visualizzatore log

Visualizzare lo stato di avanzamento dell'esportazione

Puoi utilizzare il comando gcloud firestore operations list per visualizzare lo stato di avanzamento delle operazioni di esportazione. Per maggiori informazioni, consulta la sezione relativa alla gestione delle operazioni di esportazione e importazione.

Al termine di un'operazione di esportazione, puoi visualizzare i file di output nel tuo Cloud Storage bucket:

Apri il browser Cloud Storage