Agende exportações de dados

Esta página descreve como agendar exportações dos seus dados do Firestore. Para executar exportações de acordo com uma programação, recomendamos que use funções do Cloud Run e o Cloud Scheduler.

Antes de começar

Antes de agendar exportações de dados geridas, tem de concluir as seguintes tarefas:

  1. Ative a faturação para o seu projeto Google Cloud . Apenas os Google Cloud projetos com a faturação ativada podem usar a funcionalidade de exportação e importação.
  2. As operações de exportação requerem um contentor de destino do Cloud Storage. Crie um contentor do Cloud Storage numa localização perto da localização da sua base de dados do Firestore. Não pode usar um contentor Requester Pays para operações de exportação.

Crie uma função do Google Cloud e uma tarefa do Cloud Scheduler

Siga os passos abaixo para criar uma função do Cloud Functions Node.js que inicia uma exportação de dados do Firestore e uma tarefa do Cloud Scheduler para chamar essa função:

Firebase CLI
  1. Instale a Firebase CLI. Num novo diretório, inicialize a CLI para funções do Cloud Run:

    firebase init functions --project PROJECT_ID
    1. Selecione JavaScript para o idioma.
    2. Opcionalmente, ative o ESLint.
    3. Introduza y para instalar dependências.
  2. Substitua o código no ficheiro functions/index.js pelo seguinte:

    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. No código acima, modifique o seguinte:
    • Substitua BUCKET_NAME pelo nome do seu contentor.
    • Substitua YOUR_PROJECT_ID pelo ID do seu projeto
    • Modifique every 24 hours para definir a agenda de exportação. Use a sintaxe cron.yaml do App Engine ou o formato unix-cron (* * * * *).
    • Modifique collectionIds: [] para exportar apenas os grupos de recolha especificados. Deixe como está para exportar todas as coleções.

  4. Implemente a função agendada:

    firebase deploy --only functions
Google Cloud consola
Crie uma função do Google Cloud
  1. Aceda à página Cloud Functions na Google Cloud consola:

    Aceder ao Cloud Functions

  2. Clique em Escrever uma função
  3. Introduza um nome de função, como firestore-export
  4. Em Acionador, selecione Cloud Pub/Sub
  5. Em Tópico, selecione Criar novo tópico. Introduza um nome para o tópico do Pub/Sub, como initiateFirestoreExport. Tome nota do nome do tópico, pois precisa dele para criar a tarefa do Cloud Scheduler.
  6. Em Código fonte, selecione Editor inline. Introduza o seguinte código em 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 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);
        });
    };
    No código acima, modifique o seguinte:
    • Substitua BUCKET_NAME pelo nome do seu contentor.
    • Modifique collectionIds: [] para exportar apenas os grupos de recolha especificados. Deixe como está para exportar todas as coleções.

  7. Em package.json, adicione a seguinte dependência:
    {
      "dependencies": {
        "@google-cloud/firestore": "^1.3.0"
      }
    }
  8. Em Função a executar, introduza scheduledFirestoreExport, o nome da função em index.js.
  9. Clique em Criar para implementar a função do Google Cloud.
Crie uma tarefa do Cloud Scheduler

Em seguida, crie uma tarefa do Cloud Scheduler que chame a sua função da nuvem:

  1. Aceda à página Cloud Scheduler na Google Cloud consola:

    Aceda ao Cloud Scheduler

  2. Clique em Criar tarefa.
  3. Introduza um nome para a tarefa, como scheduledFirestoreExport.
  4. Introduza uma Frequência, por exemplo, every 24 hours.
  5. Selecione um fuso horário.
  6. Em Destino, selecione Pub/Sub. No campo Tópico, introduza o nome do tópico de publicação/subscrição que definiu juntamente com a função do Google Cloud, initiateFirestoreExport no exemplo acima.
  7. No campo Payload, introduza start export. A tarefa requer uma carga útil definida, mas a função do Google Cloud acima não usa realmente este valor.
  8. Clique em Criar.
Neste ponto, implementou a sua função do Google Cloud e tarefa do Cloud Scheduler, mas a sua função do Google Cloud ainda precisa de autorizações de acesso para executar operações de exportação.

Configure as autorizações de acesso

Em seguida, conceda à função do Google Cloud autorização para iniciar operações de exportação e escrever no seu contentor do GCS.

Esta Cloud Function usa a conta de serviço predefinida do seu projeto para autenticar e autorizar as respetivas operações de exportação. Quando cria um projeto, é criada uma conta de serviço predefinida com o seguinte nome:

PROJECT_ID@appspot.gserviceaccount.com

Esta conta de serviço requer autorização para iniciar uma operação de exportação e para escrever no seu contentor do Cloud Storage. Para conceder estas autorizações, atribua as seguintes funções do IAM à conta de serviço predefinida:

  • Cloud Datastore Import Export Admin
  • Owner ou Storage Admin no contentor

Pode usar as ferramentas de linha de comandos gcloud e gsutil para atribuir estas funções.

Se ainda não estiverem instaladas, pode aceder a estas ferramentas a partir do Cloud Shell na Google Cloud consola:
Iniciar Cloud Shell

  1. Atribua a função Administrador de importação/exportação do Cloud Datastore. Substitua PROJECT_ID e execute o seguinte comando:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member serviceAccount:PROJECT_ID@appspot.gserviceaccount.com \
        --role roles/datastore.importExportAdmin
  2. Atribua a função de administrador do armazenamento ao seu contentor. Substitua PROJECT_ID e BUCKET_NAME e execute o seguinte comando:

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

Se desativar ou eliminar a conta de serviço predefinida do App Engine, a sua app do App Engine perde o acesso à base de dados do Firestore. Se desativou a sua conta de serviço do App Engine, pode reativá-la. Consulte o artigo Ativar uma conta de serviço. Se eliminou a sua conta de serviço do App Engine nos últimos 30 dias, pode restaurá-la. Consulte o artigo sobre como anular a eliminação de uma conta de serviço.

Teste a sua tarefa do Cloud Scheduler e função do Google Cloud

Pode testar a sua tarefa do Cloud Scheduler na página Cloud Scheduler da consola. Google Cloud

  1. Aceda à página Cloud Scheduler na Google Cloud consola.
    Aceda ao Cloud Scheduler

  2. Na linha da nova tarefa do Cloud Scheduler, clique em Executar agora.

    Após alguns segundos, a tarefa do Cloud Scheduler deve atualizar a coluna de resultados para Sucesso e a Última execução para a hora atual. Pode ter de clicar em Atualizar.

A página do Cloud Scheduler apenas confirma que a tarefa chamou a sua função do Google Cloud. Abra a página da Cloud Function para ver os registos da sua função.

Veja os registos da função do Cloud

Para ver se a função do Cloud iniciou com êxito uma operação de exportação, abra os registos da função:

Consola do Firebase

Aceda à página Funções do Cloud Run na consola do Firebase.

Aceda aos registos de funções

GCP Console

Aceda à página Funções do Cloud Run na Google Cloud consola.

Aceda ao visualizador de registos

Veja o progresso da exportação

Pode usar o comando gcloud firestore operations list para ver o progresso das operações de exportação. Consulte o artigo Gerir operações de exportação e importação.

Após a conclusão de uma operação de exportação, pode ver os ficheiros de saída no seu contentor do Cloud Storage:

Abra o navegador do Cloud Storage