Pianifica le esportazioni di dati

Questa pagina descrive come pianificare le esportazioni dei dati Cloud Firestore. 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 gestiti, è necessario completare le seguenti attività:

  1. Abilita la fatturazione per il tuo progetto Google Cloud. Solo i progetti Google Cloud 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 Cloud Storage in una posizione vicino alla posizione del database Cloud Firestore . Non è possibile utilizzare un intervallo a carico del richiedente per le operazioni di esportazione.

Crea una funzione Cloud e un lavoro Cloud Scheduler

Segui i passaggi seguenti per creare una funzione Cloud Node.js che avvia un'esportazione di dati Cloud Firestore e un processo Cloud Scheduler per chiamare tale funzione:

CLI di Firebase
  1. Installa la CLI Firebase . In una nuova directory, inizializza la CLI per Cloud Functions:

    firebase init functions --project PROJECT_ID
    1. Seleziona JavaScript per la lingua.
    2. Facoltativamente, abilitare ESLint.
    3. Immettere y per installare le dipendenze.
  2. Sostituisci il codice nel file functions/index.js con quanto segue:

    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 sopra, modifica quanto segue:
    • Sostituisci BUCKET_NAME con il nome del tuo bucket.
    • Modifica every 24 hours per impostare la pianificazione dell'esportazione. Utilizza la sintassi cron.yaml di AppEngine o il formato unix-cron ( * * * * * ).
    • Modifica collectionIds: [] per esportare solo i gruppi di raccolte specificati. Lascia così com'è per esportare tutte le raccolte.

  4. Distribuire la funzione pianificata:

    firebase deploy --only functions
Console GCP
Creare una funzione cloud
  1. Vai alla pagina Cloud Functions nella console GCP:

    Vai a Funzioni cloud

  2. Fare clic su Crea funzione
  3. Immettere un nome di funzione come firestoreExport
  4. In Trigger selezionare Cloud Pub/Sub
  5. In Argomento , seleziona Crea nuovo argomento . Immettere un nome per l'argomento pub/sub, ad esempio initiateFirestoreExport . Prendi nota del nome dell'argomento perché ti serve per creare il tuo lavoro Cloud Scheduler.
  6. In Codice sorgente , seleziona Editor in linea . 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(
        process.env.GCP_PROJECT,
        '(default)'
      );
    
      return client
        .exportDocuments({
          name: databaseName,
          outputUriPrefix: bucket,
          // Leave collectionIds empty to export all collections
          // or define a list of collection 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 sopra, modificare quanto segue:
    • Sostituisci BUCKET_NAME con il nome del tuo bucket.
    • Modifica collectionIds: [] per esportare solo i gruppi di raccolte specificati. Lascia così com'è per esportare tutte le raccolte.

  7. In package.json aggiungere 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 distribuire la Funzione Cloud.
Crea un lavoro di pianificazione cloud

Successivamente, crea un processo Cloud Scheduler che chiama la tua Cloud Function:

  1. Vai alla pagina Cloud Scheduler nella console GCP:

    Vai a Pianificazione cloud

  2. Fare clic su Crea lavoro .
  3. Immettere un nome per il lavoro, 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 tua Cloud Function, initiateFirestoreExport nell'esempio precedente.
  7. Nel campo Payload , inserisci start export . Il lavoro richiede un payload definito, ma la funzione Cloud di cui sopra in realtà non utilizza questo valore.
  8. Fare clic su Crea .
A questo punto, hai distribuito il tuo processo Cloud Function e Cloud Scheduler, ma la tua Cloud Function necessita ancora delle autorizzazioni di accesso per eseguire le operazioni di esportazione.

Configurare i permessi di accesso

Successivamente, concedi a Cloud Function l'autorizzazione per avviare le operazioni di esportazione e per scrivere nel tuo bucket GCS.

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

PROJECT_ID@appspot.gserviceaccount.com

Questo account di servizio richiede l'autorizzazione per avviare un'operazione di esportazione e per scrivere nel bucket Cloud Storage. Per concedere queste autorizzazioni, assegna i seguenti ruoli IAM all'account di servizio predefinito:

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

Puoi utilizzare gli strumenti da 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 di Google Cloud Platform:
Avvia Cloud Shell

  1. Assegna il ruolo di amministratore import-export di Cloud Datastore . Sostituisci PROJECT_ID ed esegui il comando seguente:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member serviceAccount:PROJECT_ID@appspot.gserviceaccount.com \
        --role roles/datastore.importExportAdmin
    
  2. Assegna il ruolo di amministratore di archiviazione al tuo bucket. Sostituisci PROJECT_ID e BUCKET_NAME ed esegui il comando seguente:

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

Se disabiliti o elimini il tuo account di servizio predefinito di App Engine, la tua app App Engine perderà l'accesso al database Cloud Firestore. Se hai disabilitato il tuo account di servizio App Engine, puoi riabilitarlo, vedi Abilitazione di un account di servizio . Se hai eliminato il tuo account di servizio App Engine negli ultimi 30 giorni, puoi ripristinarlo, consulta Annullamento dell'eliminazione di un account di servizio .

Metti alla prova il tuo lavoro Cloud Scheduler e Cloud Function

Puoi testare il tuo lavoro Cloud Scheduler nella pagina Cloud Scheduler della console di Google Cloud Platform.

  1. Vai alla pagina Cloud Scheduler nella console GCP.
    Vai a Pianificazione cloud

  2. Nella riga relativa al nuovo processo Cloud Scheduler, fai clic su Esegui ora .

    Dopo alcuni secondi, il processo Cloud Scheduler dovrebbe aggiornare la colonna dei risultati su Successo e Ultima esecuzione sull'ora corrente. Potrebbe essere necessario fare clic su Aggiorna .

La pagina Cloud Scheduler conferma solo che il lavoro ha chiamato la tua Cloud Function. Apri la pagina Cloud Function per visualizzare i log della tua funzione.

Visualizza i log di Cloud Functions

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

Console FireBase

Vai alla pagina Cloud Functions nella console Firebase.

Vai a Registri funzioni

Console GCP

Vai alla pagina Cloud Functions nella console GCP.

Vai al Visualizzatore log

Visualizza l'avanzamento dell'esportazione

Puoi utilizzare il comando gcloud firestore operations list per visualizzare lo stato di avanzamento delle operazioni di esportazione, vedere 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 archiviazione cloud