Programa exportaciones de datos

En esta página, se describe cómo programar las exportaciones de tus datos de Cloud Firestore. Para ejecutar exportaciones programadas, te recomendamos usar Cloud Functions y Cloud Scheduler.

Antes de comenzar

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

  1. Habilita la facturación para tu proyecto de Google Cloud Platform. Solo los proyectos de GCP que tengan la facturación habilitada pueden usar la función de importación y exportació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 base de datos de Cloud Firestore. No puedes usar un depósito de pagos del solicitante para las operaciones de exportación.

Crea una Cloud Function y un trabajo de Cloud Scheduler

Sigue estos pasos a fin de crear una Cloud Function en Node.js que inicie una exportación de datos de Cloud Firestore y un trabajo de Cloud Scheduler para llamar a esa función:

Firebase CLI
  1. Instala Firebase CLI. En un directorio nuevo, inicializa la CLI para Cloud Functions:

    firebase init functions --project PROJECT_ID
    1. Selecciona el lenguaje JavaScript.
    2. Opcionalmente, habilita ESLint.
    3. Ingresa y para instalar las dependencias.
  2. Reemplaza el código del 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 databaseName =
        client.databasePath(process.env.GCP_PROJECT, '(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']}`);
        return response;
      })
      .catch(err => {
        console.error(err);
        throw new Error('Export operation failed');
      });
    });
    
  3. En el código anterior, modifica lo siguiente:
    • Reemplaza BUCKET_NAME por el nombre de tu depósito.
    • Modifica every 24 hours para establecer tu programa de exportación. Utiliza la sintaxis cron.yaml de App Engine o el formato unix-cron (* * * * *).
    • Modifica collectionIds: [] para que solo se exporten los grupos de colecciones especificados. No lo modifiques si quieres exportar todas las colecciones.

  4. Implementa la función programada con este comando:

    firebase deploy --only functions
GCP Console
Crea una Cloud Function
  1. En GCP Console, abre la página de Cloud Functions:

    Abrir la página de Cloud Functions

  2. Haz clic en Crear función.
  3. Ingresa un nombre de función, como firestoreExport
  4. En Activador, selecciona Cloud Pub/Sub.
  5. En Tema, selecciona Crear tema nuevo. Ingresa un nombre para el tema de Pub/Sub, como initiateFirestoreExport. Anota el nombre del tema, ya que lo necesitarás para crear tu trabajo de Cloud Scheduler.
  6. En Código fuente, selecciona Editor directo. Ingresa 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.GCLOUD_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, modifica lo siguiente:
    • Reemplaza BUCKET_NAME por el nombre de tu depósito.
    • Modifica collectionIds: [] para que solo se exporten los grupos de colecciones especificados. No lo modifiques si quieres exportar todas las colecciones.

  7. En package.json, agrega la siguiente dependencia:
    {
      "dependencies": {
        "@google-cloud/firestore": "^1.3.0"
      }
    }
  8. En Función que se ejecutará, ingresa scheduledFirestoreExport, el nombre de la función de index.js.
  9. Haz clic en Crear para implementar la Cloud Function.
Crea un trabajo de Cloud Scheduler

A continuación, crea un trabajo de Cloud Scheduler que llame a tu Cloud Function:

  1. En GCP Console, abre la página de Cloud Scheduler:

    Abre la página de Cloud Scheduler

  2. Haz clic en Crear trabajo.
  3. Ingresa un Nombre para el trabajo, como scheduledFirestoreExport.
  4. Ingresa una Frecuencia, como every 24 hours.
  5. Selecciona una Zona horaria.
  6. En Destino, selecciona Pub/Sub. En el campo Tema, ingresa el nombre del tema de Pub/Sub que definiste junto con tu función de Cloud Functions, initiateFirestoreExport, en el ejemplo anterior.
  7. En el campo Carga útil, ingresa start export. El trabajo requiere que se defina una carga útil, pero la Cloud Function anterior no utiliza realmente este valor.
  8. Haz clic en Crear.
En este punto, ya implementaste tu Cloud Function y tu trabajo de Cloud Scheduler, pero tu Cloud Function aún necesita permisos de acceso para ejecutar operaciones de exportación.

Configura los permisos de acceso

A continuación, otórgale permiso a tu Cloud Function para que pueda iniciar las operaciones de exportación y escribir en el depósito de GCS.

Esta Cloud Function usa la cuenta de servicio predeterminada de tu proyecto para autenticar y autorizar sus operaciones de exportación. Cuando creas un proyecto, se crea una cuenta de servicio predeterminada con el siguiente nombre:

PROJECT_ID@appspot.gserviceaccount.com

La cuenta de servicio requiere permisos para iniciar operaciones de exportación y escribir en el depósito de Cloud Storage. Para otorgar esos permisos, asigna las siguientes funciones de IAM a la cuenta de servicio predeterminada:

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

Puedes usar las herramientas de línea de comandos de gcloud y gsutil para asignar estas funciones.

Si aún no están instaladas, puedes acceder a estas herramientas desde Cloud Shell en Google Cloud Platform Console:
Iniciar Cloud Shell

  1. Asigna la función Administrador de importación y exportación de Cloud Datastore: Reemplaza PROJECT_ID y ejecuta el siguiente comando:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member serviceAccount:PROJECT_ID@appspot.gserviceaccount.com \
        --role roles/datastore.importExportAdmin
    
  2. Asigna la función Administrador de almacenamiento en tu depósito: Reemplaza PROJECT_ID y BUCKET_NAME, y ejecuta el siguiente comando:

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

Prueba tu trabajo de Cloud Scheduler y la Cloud Function

Puedes probar tu trabajo de Cloud Scheduler en la página Cloud Scheduler de Google Cloud Platform Console.

  1. En GCP Console, abre la página de Cloud Scheduler.
    Abre la página de Cloud Scheduler

  2. En la fila de tu nuevo trabajo de Cloud Scheduler, haz clic en Ejecutar ahora.

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

La página de Cloud Scheduler solo confirma que el trabajo llamó a tu Cloud Function. Abre la página de Cloud Function para ver los registros de tu función.

Visualiza los registros de Cloud Function

Para ver si la Cloud Function inició una operación de exportación correctamente, abre los registros de la función:

Firebase console

En Firebase console, abre la página de Cloud Functions.

Abre la página Registros de Functions

GCP Console

En GCP Console, abre la página de Cloud Functions.

Abre la página del visor de registros

Visualiza 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 importación y exportación.

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

Abre el navegador de Cloud Storage