Agendar exportações de dados

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

Antes de você começar

Antes de agendar exportações de dados gerenciados, você deve concluir as seguintes tarefas:

  1. Ative o faturamento para seu projeto do Google Cloud. Somente projetos do Google Cloud com faturamento ativado podem usar o recurso de exportação e importação.
  2. As operações de exportação exigem um bucket de destino do Cloud Storage. Crie um bucket do Cloud Storage em um local próximo ao local do banco de dados do Cloud Firestore . Você não pode usar um bucket de pagamentos do solicitante para operações de exportação.

Criar um job do Cloud Function e do Cloud Scheduler

Siga as etapas abaixo para criar uma função do Cloud Node.js que inicia uma exportação de dados do Cloud Firestore e um trabalho do Cloud Scheduler para chamar essa função:

CLI do Firebase
  1. Instale a CLI do Firebase . Em um novo diretório, inicialize a CLI do Cloud Functions:

    firebase init functions --project PROJECT_ID
    1. Selecione JavaScript para o idioma.
    2. Opcionalmente, habilite o ESLint.
    3. Digite y para instalar dependências.
  2. Substitua o código no arquivo 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 intervalo.
    • Modifique every 24 hours para definir sua programação de exportação. Use a sintaxe cron.yaml do AppEngine ou o formato unix-cron ( * * * * * ).
    • Modifique collectionIds: [] para exportar apenas os grupos de coleções especificados. Deixe como está para exportar todas as coleções.

  4. Implante a função agendada:

    firebase deploy --only functions
Console do GCP
Crie uma função do Cloud
  1. Acesse a página do Cloud Functions no Console do GCP:

    Acesse o Cloud Functions

  2. Clique em Criar função
  3. Insira um nome de função como firestoreExport
  4. Em Acionador , selecione Cloud Pub/Sub
  5. Em Tópico , selecione Criar novo tópico . Insira um nome para o tópico pub/sub, como initiateFirestoreExport . Anote o nome do tópico conforme necessário para criar seu job do Cloud Scheduler.
  6. Em Código-fonte , selecione Editor embutido . Insira 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(
        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);
        });
    };
    No código acima, modifique o seguinte:
    • Substitua BUCKET_NAME pelo nome do seu bucket.
    • Modifique collectionIds: [] para exportar apenas os grupos de coleções 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 ser executada , insira scheduledFirestoreExport , o nome da função em index.js .
  9. Clique em Criar para implantar o Cloud Function.
Criar um job do Cloud Scheduler

Em seguida, crie um job do Cloud Scheduler que chame sua função do Cloud:

  1. Acesse a página do Cloud Scheduler no Console do GCP:

    Vá para o Agendador de Nuvem

  2. Clique em Criar trabalho .
  3. Insira um Nome para o trabalho, como scheduledFirestoreExport .
  4. Insira uma Frequência , por exemplo, every 24 hours .
  5. Selecione um fuso horário .
  6. Em Destino , selecione Pub/Sub . No campo Tópico , insira o nome do tópico pub/sub que você definiu junto com sua função do Cloud, initiateFirestoreExport no exemplo acima.
  7. No campo Carga útil , insira start export . O job requer uma carga definida, mas a função do Cloud acima não usa esse valor.
  8. Clique em Criar .
Neste ponto, você implantou o job do Cloud Function e do Cloud Scheduler, mas o Cloud Function ainda precisa de permissões de acesso para executar operações de exportação.

Configurar permissões de acesso

Em seguida, conceda permissão ao Cloud Function para iniciar operações de exportação e gravar no bucket do GCS.

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

PROJECT_ID@appspot.gserviceaccount.com

Esta conta de serviço requer permissão para iniciar uma operação de exportação e gravar no bucket do Cloud Storage. Para conceder essas permissões, atribua as seguintes funções do IAM à conta de serviço padrão:

  • Cloud Datastore Import Export Admin
  • Função Owner ou Storage Admin no bucket

Você pode usar as ferramentas de linha de comando gcloud e gsutil para atribuir essas funções.

Se ainda não estiver instalado, você poderá acessar estas ferramentas do Cloud Shell no console do Google Cloud Platform:
Iniciar o Cloud Shell

  1. Atribua o papel de administrador de importação e 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 Administrador de armazenamento ao seu bucket. 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 você desativar ou excluir sua conta de serviço padrão do App Engine, seu aplicativo do App Engine perderá acesso ao banco de dados do Cloud Firestore. Se você desativou sua conta de serviço do App Engine, poderá reativá-la. Consulte como ativar uma conta de serviço . Se você excluiu sua conta de serviço do App Engine nos últimos 30 dias, poderá restaurá-la. Consulte como cancelar a exclusão de uma conta de serviço .

Teste seu job do Cloud Scheduler e o Cloud Function

Você pode testar seu job do Cloud Scheduler na página do Cloud Scheduler do Console do Google Cloud Platform.

  1. Acesse a página do Cloud Scheduler no Console do GCP.
    Vá para o Agendador de Nuvem

  2. Na linha do novo job do Cloud Scheduler, clique em Executar agora .

    Após alguns segundos, o job do Cloud Scheduler deverá atualizar a coluna de resultados para Êxito e Última execução para a hora atual. Talvez seja necessário clicar em Atualizar .

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

Ver os registros do Cloud Function

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

Console do Firebase

Acesse a página do Cloud Functions no console do Firebase.

Vá para registros de funções

Console do GCP

Acesse a página do Cloud Functions no Console do GCP.

Vá para o Visualizador de registros

Ver o progresso da exportação

Você pode usar o comando gcloud firestore operations list para visualizar o progresso de suas operações de exportação. Consulte Gerenciamento de operações de exportação e importação .

Após a conclusão de uma operação de exportação, você poderá visualizar os arquivos de saída no bucket do Cloud Storage:

Abra o navegador do Cloud Storage