Transferir datos entre proyectos

En esta página se describe cómo usar las funciones de importación y exportación gestionadas para mover datos de Firestore de un proyecto a otro. Esto puede ser útil para configurar un entorno de desarrollo o como parte de la migración permanente de una aplicación a otro proyecto. En el ejemplo de esta página se muestra cómo exportar datos de un proyecto de origen y, a continuación, importarlos a un proyecto de destino. Para mover datos entre proyectos, sigue estos pasos:

  1. Crea un segmento de Cloud Storage para almacenar los datos de tu proyecto de origen.
  2. Exporta los datos de tu proyecto de origen al segmento.
  3. Concede permiso a tu proyecto de destino para leer del segmento.
  4. Importa los datos del segmento al proyecto de destino.

Antes de empezar

Para poder usar el servicio de exportación e importación gestionado, debes completar las siguientes tareas:

  1. Habilita la facturación tanto en el proyecto de origen como en el de destino. Solo los Google Cloud proyectos con la facturación habilitada pueden usar las funciones de exportación e importación.
  2. Asegúrate de que tu cuenta tiene los permisos de gestión de identidades y accesos necesarios en el proyecto de origen y en el de destino. Si eres propietario de ambos proyectos, tu cuenta tiene los permisos necesarios. De lo contrario, los siguientes roles de gestión de identidades y accesos conceden los permisos necesarios para las operaciones de importación y exportación de Firestore:

    Owner, Cloud Datastore Owner o Cloud Datastore Import Export Admin

    El propietario de un proyecto puede conceder uno de estos roles siguiendo los pasos que se indican en Conceder acceso.

  3. Configura la herramienta de línea de comandos gcloud y conéctate a tu proyecto de una de las siguientes formas:

  4. Configura los índices en tu nuevo proyecto. Los índices compuestos deben coincidir entre los proyectos de origen y de destino. Los índices deben configurarse primero para evitar tener que procesar cada documento varias veces.

Exportar datos del proyecto de origen

Para exportar los datos, crea un segmento de Cloud Storage para los archivos de exportación de Firestore e inicia una operación de exportación.

Crea un segmento de Cloud Storage

Crea un segmento de Cloud Storage en la misma ubicación que tu base de datos de Firestore. Para ver la ubicación de tu base de datos, consulta la configuración de ubicación del proyecto. No puedes usar un contenedor de pago del solicitante para las operaciones de exportación e importación.

Si el segmento de Cloud Storage no está en tuproyecto de origen, debes dar acceso al segmento a la cuenta de servicio predeterminada del proyecto de origen. Cada Google Cloud proyecto tiene una cuenta de servicio predeterminada creada automáticamente con el nombre PROJECT_ID@appspot.gserviceaccount.com. Las operaciones de exportación de Firestore usan esta cuenta de servicio predeterminada para autorizar las operaciones de los segmentos de Cloud Storage. Para dar acceso a la cuenta de servicio predeterminada a tu segmento de origen, concédele el rol Storage Admin.

Puedes asignar este rol con la herramienta gsutil, disponible en Cloud Shell:

Iniciar Cloud Shell

gsutil iam ch serviceAccount:[service-PROJECT_NUMBER]@gcp-sa-firestore.iam.gserviceaccount.com :roles/storage.admin\
gs://[BUCKET_NAME]@

También puedes conceder este rol en la Google Cloud consola.

Inhabilitar operaciones de escritura (opcional)

Si tu aplicación sigue escribiendo en tu base de datos mientras realizas una operación de exportación, es posible que no se registren todas esas escrituras en tus archivos de exportación. Para exportar datos desde un estado coherente, inhabilita las escrituras en tu base de datos actualizando tus reglas de seguridad y deteniendo las operaciones del SDK de administrador.

  1. Actualizar reglas de seguridad

    En la pestaña Reglas de Firestore de la consola, actualiza las reglas de seguridad del proyecto de origen para denegar todas las escrituras. Por ejemplo:

      // Deny write access to all users under any conditions
      service cloud.firestore {
        match /databases/{database}/documents {
          match /{document=**} {
            allow write: if false;
          }
          // Reads do not affect export operations
          // Add your read rules here
        }
      }
    
  2. Detener las escrituras de los SDKs de administrador

    Las reglas de seguridad no impiden que se escriban datos desde entornos de servidor privilegiados creados con un SDK de administrador de Firebase o una biblioteca de cliente de servidor de Google Cloud. Asegúrate de detener las operaciones de escritura de tus servidores de administración cerrando o actualizando tus servidores.

Iniciar una operación de exportación

Usa el comando gcloud firestore export para exportar datos de tu proyecto de origen. Puedes exportar todos tus datos o solo colecciones específicas. Sustituye [SOURCE_BUCKET] por el nombre de tu segmento de Cloud Storage:

Exportar todos los datos
gcloud firestore export gs://[SOURCE_BUCKET] --async
Exportar colecciones específicas
gcloud firestore export gs://[SOURCE_BUCKET] --collection-ids=[COLLECTION_ID_1],[COLLECTION_ID_2] --async

Anota el outputURIPrefix de la operación de exportación, ya que lo usarás más adelante. De forma predeterminada, Firestore añade un prefijo a los archivos de exportación basado en una marca de tiempo:

outputUriPrefix: gs://[SOURCE_BUCKET]/2019-03-05T20:58:23_56418

Mientras se ejecuta la operación de exportación, puedes usar el comando firestore operations list para ver el progreso de la operación:

gcloud firestore operations list

Importar datos al proyecto de destino

A continuación, da acceso al proyecto de destino a tus archivos de datos de Firestore e inicia una operación de importación.

Dar acceso al proyecto de destino a tus archivos de datos

Antes de poder iniciar una operación de importación, debe asegurarse de que el proyecto de destino pueda acceder a sus archivos de datos de Firestore.

Mover archivos de datos a un segmento local

Si la ubicación del segmento de origen es distinta a la ubicación de Firestore del proyecto de destino, debes mover los archivos de datos a un segmento de Cloud Storage que esté en la misma ubicación que el proyecto de destino.

Mueve tus archivos de datos a otro segmento de Cloud Storage siguiendo los pasos que se indican en Mover y cambiar el nombre de segmentos. En todos los pasos siguientes, utiliza este nuevo segmento como [SOURCE_BUCKET].

Concede a la cuenta de servicio del proyecto acceso a tu segmento de origen

Si el segmento de origen no está en el proyecto de destino, debes dar acceso a la cuenta de servicio predeterminada del proyecto de destino al segmento de origen. La cuenta de servicio predeterminada se llama [DESTINATION_PROJECT_ID]@appspot.gserviceaccount.com. Para dar acceso a la cuenta de servicio predeterminada a tu segmento de origen, concédele los permisos adecuados para acceder al segmento.

Puedes conceder los roles necesarios con la herramienta gsutil disponible en Cloud Shell:

Iniciar Cloud Shell

gsutil iam ch serviceAccount:[DESTINATION_PROJECT_ID]@appspot.gserviceaccount.com:legacyBucketReader,legacyObjectReader \
gs://[SOURCE_BUCKET]

También puedes conceder este rol en la Google Cloud consola.

Iniciar una operación de importación

Antes de iniciar la operación de importación, asegúrate de que gcloud esté configurado para el proyecto correcto:

gcloud config set project [DESTINATION_PROJECT_ID]

Usa el comando gcloud firestore import para importar los datos del bucket de origen al proyecto de destino:

gcloud firestore import gs://[SOURCE_BUCKET]/[EXPORT_PREFIX] --async

Donde [EXPORT_PREFIX] coincide con el prefijo de la operación de exportación outputUriPrefix. Por ejemplo:

gcloud firestore import gs://[SOURCE_BUCKET]/2019-03-05T20:58:23_56418 --async

Mientras se ejecuta la operación de exportación, puedes usar el comando firestore operations list para ver el progreso de la operación:

gcloud firestore operations list