Programar exportaciones de datos

Esta página describe cómo programar exportaciones de sus datos de Cloud Firestore. Para ejecutar exportaciones según una programación, recomendamos utilizar Cloud Functions y Cloud Scheduler.

Antes de que empieces

Antes de programar exportaciones de datos administrados, debe completar las siguientes tareas:

  1. Habilite la facturación para su proyecto de Google Cloud. Solo los proyectos de Google Cloud con facturación habilitada pueden utilizar la función de exportación e importación.
  2. Las operaciones de exportación requieren un depósito de Cloud Storage de destino. Crea un depósito de Cloud Storage en una ubicación cercana a la ubicación de tu base de datos de Cloud Firestore . No puede utilizar un depósito de Pagos del solicitante para operaciones de exportación.

Crear una función de nube y un trabajo de programador de nube

Siga los pasos a continuación para crear una función en la nube de Node.js que inicie una exportación de datos de Cloud Firestore y un trabajo de Cloud Scheduler para llamar a esa función:

CLI de base de fuego
  1. Instale Firebase CLI . En un nuevo directorio, inicialice la CLI para Cloud Functions:

    firebase init functions --project PROJECT_ID
    1. Seleccione JavaScript para el idioma.
    2. Opcionalmente, habilite ESLint.
    3. Ingrese y para instalar dependencias.
  2. Reemplace el código en el archivo functions/index.js con lo siguiente:

    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. En el código anterior, modifique lo siguiente:
    • Reemplace BUCKET_NAME con el nombre de su depósito.
    • Modifique every 24 hours para configurar su cronograma de exportación. Utilice la sintaxis cron.yaml de AppEngine o el formato Unix-cron ( * * * * * ).
    • Modifique collectionIds: [] para exportar solo los grupos de colección especificados. Déjelo como está para exportar todas las colecciones.

  4. Implementar la función programada:

    firebase deploy --only functions
Consola GCP
Crear una función en la nube
  1. Vaya a la página de Funciones de la nube en GCP Console:

    Ir a Funciones de la Nube

  2. Haga clic en Crear función
  3. Ingrese un nombre de función como firestoreExport
  4. En Activador , seleccione Cloud Pub/Sub
  5. En Tema , seleccione Crear nuevo tema . Ingrese un nombre para el tema de publicación/sub, como initiateFirestoreExport . Tome nota del nombre del tema, ya que lo necesita para crear su trabajo de Cloud Scheduler.
  6. En Código fuente , seleccione Editor en línea . Ingrese el siguiente código en 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);
        });
    };
    En el código anterior, modifique lo siguiente:
    • Reemplace BUCKET_NAME con el nombre de su depósito.
    • Modifique collectionIds: [] para exportar solo los grupos de colección especificados. Déjelo como está para exportar todas las colecciones.

  7. En package.json , agregue la siguiente dependencia:
    {
      "dependencies": {
        "@google-cloud/firestore": "^1.3.0"
      }
    }
  8. En Función a ejecutar , ingrese scheduledFirestoreExport , el nombre de la función en index.js .
  9. Haga clic en Crear para implementar la función de nube.
Crear un trabajo de Programador de la nube

A continuación, cree un trabajo de Cloud Scheduler que llame a su función de nube:

  1. Vaya a la página de Cloud Scheduler en GCP Console:

    Ir al programador de la nube

  2. Haga clic en Crear trabajo .
  3. Ingrese un nombre para el trabajo, como scheduledFirestoreExport .
  4. Introduzca una Frecuencia , por ejemplo, every 24 hours .
  5. Seleccione una zona horaria .
  6. En Destino , seleccione Pub/Sub . En el campo Tema , ingrese el nombre del tema de publicación/sub que definió junto con su función en la nube, initiateFirestoreExport en el ejemplo anterior.
  7. En el campo Carga útil , ingrese start export . El trabajo requiere una carga útil definida, pero la función de nube anterior en realidad no utiliza este valor.
  8. Haga clic en Crear .
En este punto, ha implementado su trabajo Cloud Function y Cloud Scheduler, pero su Cloud Function aún necesita permisos de acceso para ejecutar operaciones de exportación.

Configurar permisos de acceso

A continuación, otorgue permiso a la función de nube para iniciar operaciones de exportación y escribir en su depósito de GCS.

Esta función de nube utiliza la cuenta de servicio predeterminada de su proyecto para autenticar y autorizar sus operaciones de exportación. Cuando crea un proyecto, se crea una cuenta de servicio predeterminada con el siguiente nombre:

PROJECT_ID@appspot.gserviceaccount.com

Esta cuenta de servicio requiere permiso para iniciar una operación de exportación y escribir en su depósito de Cloud Storage. Para otorgar estos permisos, asigne las siguientes funciones de IAM a la cuenta de servicio predeterminada:

  • Cloud Datastore Import Export Admin
  • Rol Owner o Storage Admin en el depósito

Puedes usar las herramientas de línea de comandos gcloud y gsutil para asignar estos roles.

Si aún no están instaladas, puede acceder a estas herramientas desde Cloud Shell en la consola de Google Cloud Platform:
Iniciar Cloud Shell

  1. Asigne la función de administrador de importación y exportación de Cloud Datastore . Reemplace PROJECT_ID y ejecute el siguiente comando:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member serviceAccount:PROJECT_ID@appspot.gserviceaccount.com \
        --role roles/datastore.importExportAdmin
    
  2. Asigne la función de administrador de almacenamiento en su depósito. Reemplace PROJECT_ID y BUCKET_NAME y ejecute el siguiente comando:

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

Si desactiva o elimina su cuenta de servicio predeterminada de App Engine, su aplicación App Engine perderá el acceso a su base de datos de Cloud Firestore. Si deshabilitó su cuenta de servicio de App Engine, puede volver a habilitarla; consulte habilitar una cuenta de servicio . Si eliminaste tu cuenta de servicio de App Engine en los últimos 30 días, puedes restaurarla; consulta cómo recuperar una cuenta de servicio .

Pruebe su trabajo de Cloud Scheduler y su función de nube

Puede probar su trabajo de Cloud Scheduler en la página Cloud Scheduler de Google Cloud Platform Console.

  1. Vaya a la página de Cloud Scheduler en GCP Console.
    Ir al programador de la nube

  2. En la fila de su nuevo trabajo de Cloud Scheduler, haga clic en Ejecutar ahora .

    Después de unos segundos, el trabajo de Cloud Scheduler debería actualizar la columna de resultados a Éxito y Última ejecución a la hora actual. Es posible que tengas que hacer clic en Actualizar .

La página de Cloud Scheduler solo confirma que el trabajo llamó su función de nube. Abra la página Cloud Function para ver los registros de su función.

Ver los registros de la función de nube

Para ver si la función de nube inició correctamente una operación de exportación, abra los registros de la función:

Consola de base de fuego

Vaya a la página Cloud Functions en Firebase console.

Ir a registros de funciones

Consola GCP

Vaya a la página Cloud Functions en GCP Console.

Ir al visor de registros

Ver el progreso de la exportación

Puedes usar el comando gcloud firestore operations list para ver el progreso de tus operaciones de exportación; consulta cómo administrar las operaciones de exportación e importación .

Una vez completada una operación de exportación, puedes ver los archivos de salida en tu depósito de Cloud Storage:

Abra el navegador de almacenamiento en la nube