Programa exportaciones de datos

En esta página, se describe cómo programar exportaciones de los datos de Firestore. Para ejecutar exportaciones programadas, te recomendamos usar funciones de Cloud Run 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. Solo los proyectos de Google Cloud 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 bucket de Cloud Storage en una ubicación cercana a la base de datos de Firestore. No puedes usar un bucket de pagos del solicitante para las operaciones de exportación.

Crea una función de Cloud Functions y un trabajo de Cloud Scheduler

Sigue estos pasos a fin de crear una función de Cloud Functions 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 Funciones de Cloud Run:

    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 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, modifica lo siguiente:
    • Reemplaza BUCKET_NAME por el nombre de tu bucket.
    • 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
Consola de Google Cloud
Crea una Cloud Function
  1. Ve a la página de Cloud Functions en la consola de Google Cloud:

    Ir a 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.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, modifica lo siguiente:
    • Reemplaza BUCKET_NAME por el nombre de tu bucket.
    • 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. Ve a la página Cloud Scheduler en la consola de Google Cloud:

    Ir a 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 bucket 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 bucket 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 bucket

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 la consola de Google Cloud:
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 bucket: Reemplaza PROJECT_ID y BUCKET_NAME, y ejecuta el siguiente comando:

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

Si inhabilitas o borras tu cuenta de servicio predeterminada de App Engine, tu aplicación de App Engine perderá el acceso a la base de datos de Firestore. Si inhabilitaste tu cuenta de servicio de App Engine, puedes volver a habilitarla; consulta la documentación sobre cómo habilitar una cuenta de servicio. Si borraste tu cuenta de servicio de App Engine en los últimos 30 días, puedes restablecerla. Para ello, consulta cómo recuperar una cuenta de servicio.

Prueba tu trabajo de Cloud Scheduler y la Cloud Function

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

  1. Ve a la página de Cloud Scheduler en la consola de Google Cloud.
    Ir a 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

Ve a la página Funciones de Cloud Run en Firebase console.

Ir a Registros de funciones

GCP Console

Ve a la página Cloud Run Functions en la consola de Google Cloud.

Ir al 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 bucket de Cloud Storage:

Abrir el navegador de Cloud Storage