Programa una exportación

En esta página, se describe cómo programar exportaciones de tus datos de Firestore en modo Datastore. Para ejecutar exportaciones programadas, te recomendamos usar las funciones de Cloud Run y Cloud Scheduler. Crea una función de Cloud Functions que inicie las exportaciones y usa Cloud Scheduler para ejecutar la función.

Antes de comenzar

Antes de programar la exportación de datos, 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. Crea un bucket de Cloud Storage en una ubicación cercana a la base de datos en modo Datastore. Las operaciones de exportación requieren un bucket de Cloud Storage de destino. 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 los pasos a continuación a fin de crear una función de Cloud Functions que inicie las exportaciones de datos y un trabajo de Cloud Scheduler para llamar a esa función:

Crea una función de Cloud Functions datastore_export

  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 datastoreExport.
  4. En Activador, selecciona Cloud Pub/Sub. Trigger usa el tema de Pub/Sub para llamar a la función.
  5. En el campo Tema, selecciona Crear un tema. Ingresa un nombre para el tema de Pub/Sub, como startDatastoreExport. Anota el nombre del tema, ya que lo necesitarás para crear el trabajo de Cloud Scheduler.
  6. En Código fuente, selecciona Editor directo.
  7. En el menú desplegable Entorno de ejecución, selecciona Python 3.7.
  8. Ingresa el siguiente código para main.py:
    # Copyright 2021 Google LLC All Rights Reserved.
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #     http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    import base64
    import json
    import os
    
    from google.cloud import datastore_admin_v1
    
    project_id = os.environ.get("GCP_PROJECT")
    client = datastore_admin_v1.DatastoreAdminClient()
    
    
    def datastore_export(event, context):
        """Triggers a Datastore export from a Cloud Scheduler job.
    
        Args:
            event (dict): event[data] must contain a json object encoded in
                base-64. Cloud Scheduler encodes payloads in base-64 by default.
                Object must include a 'bucket' value and can include 'kinds'
                and 'namespaceIds' values.
            context (google.cloud.functions.Context): The Cloud Functions event
                metadata.
        """
        if "data" in event:
            # Triggered via Cloud Scheduler, decode the inner data field of the json payload.
            json_data = json.loads(base64.b64decode(event["data"]).decode("utf-8"))
        else:
            # Otherwise, for instance if triggered via the Cloud Console on a Cloud Function, the event is the data.
            json_data = event
    
        bucket = json_data["bucket"]
        entity_filter = datastore_admin_v1.EntityFilter()
    
        if "kinds" in json_data:
            entity_filter.kinds = json_data["kinds"]
    
        if "namespaceIds" in json_data:
            entity_filter.namespace_ids = json_data["namespaceIds"]
    
        export_request = datastore_admin_v1.ExportEntitiesRequest(
            project_id=project_id, output_url_prefix=bucket, entity_filter=entity_filter
        )
        operation = client.export_entities(request=export_request)
        response = operation.result()
        print(response)
    
  9. En requirements.txt, agrega la siguiente dependencia:
    google-cloud-datastore==2.20.0
    
  10. En Punto de entrada, ingresa datastore_export, el nombre de la función en main.py.
  11. Haz clic en Desplegar para implementar la Cloud Function.

Configura los permisos de acceso

A continuación, otorga permiso a la función de Cloud Functions para iniciar las operaciones de exportación y escribir en el bucket de Cloud Storage.

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

project_id@appspot.gserviceaccount.com

Esta cuenta de servicio necesita permiso 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
  • Rol Storage Object User en el bucket

Puedes usar Google Cloud CLI para asignar estos roles. Puedes acceder a esta herramienta 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 el rol de Usuario de objetos de almacenamiento en tu bucket. Reemplaza bucket_name y project_id, y ejecuta el siguiente comando:

    gcloud storage buckets add-iam-policy-binding gs://bucket_name \
        --member=serviceAccount:project_id@appspot.gserviceaccount.com \
        --role=roles/storage.objectUser

Crea un trabajo de Cloud Scheduler

A continuación, crea un trabajo de Cloud Scheduler que llame a la función de Cloud Functions datastore_export:

  1. Ve a la página de 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 scheduledDatastoreExport.

  4. Ingresa una Frecuencia en formato unix-cron.

  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 la función de Cloud Functions, startDatastoreExport en el ejemplo anterior.

  7. En el campo Carga útil, ingresa un objeto JSON para configurar la operación de exportación. La función de Cloud Functions datastore_export requiere un valor bucket. De manera opcional, puedes incluir valores kinds o namespaceIDs para establecer un filtro de entidad, por ejemplo:

    Exporta todas las entidades

    {
    "bucket": "gs://bucket_name"
    }
    

    Exporta con filtro de entidad

    • Exporta entidades de tipo User o Task desde todos los espacios de nombres:

      {
      "bucket": "gs://bucket_name",
      "kinds": ["User", "Task"]
      }
      

    • Exporta entidades de tipo User o Task desde los espacios de nombres predeterminados y Testers. Usa una string vacía ("") para especificar el espacio de nombres predeterminado:

      {
      "bucket": "gs://bucket_name",
      "kinds": ["User", "Task"],
      "namespaceIds": ["", "Testers"]
      }
      

    • Exporta entidades de cualquier tipo desde los espacios de nombres predeterminados y Testers. Usa una string vacía ("") para especificar el espacio de nombres predeterminado:

      {
      "bucket": "gs://bucket_name",
      "namespaceIds": ["", "Testers"]
      }
      

    En el ejemplo anterior, bucket_name es el nombre del depósito de Cloud Storage.

  8. Haz clic en Crear.

Prueba tus exportaciones programadas

Para probar el trabajo de Cloud Function y Cloud Scheduler, ejecuta el trabajo de Cloud Scheduler en la página de Cloud Scheduler de la consola de Google Cloud. Si se ejecuta de forma correcta, se inicia una operación de exportación real.

  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, haz clic en Actualizar. El trabajo de Cloud Scheduler debe actualizar la columna de resultados a Correcto y Última ejecución a la hora actual.

En la página de Cloud Scheduler solo se confirma que el trabajo envió un mensaje al tema de Pub/Sub. Para ver si la solicitud de exportación se realizó de forma correcta, consulta los registros de la función de Cloud Functions.

Visualiza los registros de Cloud Function

Para ver si la Cloud Function inició de forma correcta una operación de exportación, consulta la página Explorador de registros en la consola de Google Cloud.

Ir al Explorador de registros

El registro de la función de Cloud Functions informa los errores y las iniciaciones de exportación correctas.

Visualiza el progreso de la exportación

Puedes usar el comando gcloud datastore operations list para ver el progreso de tus operaciones de exportación. Consulta enumera todas las operaciones de larga duración.

Una vez que se completa una operación de exportación, puedes ver los archivos de salida en el bucket de Cloud Storage: El servicio de exportación administrado usa una marca de tiempo para organizar tus operaciones de exportación:

Ir a Cloud Storage