Mover dados entre projetos

Nesta página, você verá como usar os recursos gerenciados de importação e exportação para mover dados do Firestore de um projeto para outro. Isso pode ser útil para configurar um ambiente de desenvolvimento ou como parte da migração permanente de um app para outro projeto. O exemplo nesta página demonstra como exportar dados de um projeto de origem e, em seguida, como importar esses dados para um projeto de destino. Para mover dados entre projetos é necessário seguir as seguintes etapas:

  1. Criar um bucket do Cloud Storage para armazenar os dados do seu projeto de origem.
  2. Exportar os dados do projeto de origem para o bucket.
  3. Dar permissão ao projeto de destino para ler dados do bucket.
  4. Importar os dados do bucket para o projeto de destino.

Antes de começar

Antes de usar o serviço gerenciado de exportação e importação, é necessário concluir as tarefas a seguir:

  1. Ative o faturamento para seu projeto de origem e de destino. Somente projetos do Google Cloud com faturamento ativado podem usar a funcionalidade de exportação e importação.
  2. Verifique se a conta tem as permissões necessárias do IAM nos projetos de origem e destino. Se você for o proprietário dos dois projetos, sua conta terá as permissões necessárias. Caso contrário, os seguintes papéis do IAM concedem as permissões necessárias para as operações de exportação e importação do Firestore:

    Owner, Cloud Datastore Owner ou Cloud Datastore Import Export Admin

    Um proprietário de projeto pode conceder essas funções seguindo as instruções disponíveis na página Como conceder acesso.

  3. Configure a ferramenta de linha de comando gcloud e use uma das maneiras a seguir para conectar-se ao seu projeto:

  4. Configure índices no seu novo projeto. Os índices compostos precisam corresponder entre os projetos de origem e de destino. Os índices precisam ser configurados primeiro para evitar a necessidade de processar cada documento várias vezes.

Exportar dados do projeto de origem

Para exportar os dados, crie um bucket do Cloud Storage para seus arquivos de exportação do Firestore e inicie uma operação de exportação.

Criar um bucket do Cloud Storage

Crie um bucket do Cloud Storage no mesmo local que o banco de dados do Firestore. Para ver a localização do seu banco de dados, consulte a configuração do local do projeto. Não é possível usar um bucket de pagamentos do solicitante para operações de exportação e importação.

Se o bucket do Cloud Storage não estiver no projeto de origem, será preciso conceder acesso ao bucket à conta de serviço padrão do projeto de origem. Cada projeto do Google Cloud tem uma conta de serviço padrão criada automaticamente com o nome PROJECT_ID@appspot.gserviceaccount.com. As operações de exportação do Firestore usam essa conta de serviço padrão para autorizar as operações de bucket do Cloud Storage. Para conceder à conta de serviço padrão acesso ao seu intervalo de origem, atribua a ela o papel Storage Admin.

Para conceder esse papel, use a ferramenta gsutil, disponível no Cloud Shell:

Inicie o Cloud Shell

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

Também é possível conceder esse papel no Console do Google Cloud.

Desativar operações de gravação (opcional)

Se o aplicativo continuar gravando no banco de dados enquanto uma operação de exportação é realizada, talvez você não capture todas essas gravações nos arquivos de exportação. Para exportar dados de um estado consistente, desative as gravações no banco de dados ao atualizar as regras de segurança e interromper as operações do SDK Admin.

  1. Atualize as regras de segurança

    Na guia Regras do console do Firestore, atualize as regras de segurança do projeto de origem para negar todas as gravações. Exemplo:

      // 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. Interromper gravações dos SDKs Admins

    As regras de segurança não impedem gravações provenientes de ambientes de servidor privilegiados, criados com o SDK Admin do Firebase ou com a biblioteca de cliente de servidor do Google Cloud. Certifique-se de interromper as operações de gravação dos servidores de administração ao desligar ou atualizar seus servidores.

Começar uma operação de exportação

Use o comando gcloud firestore export para exportar dados do seu projeto de origem. É possível exportar todos os dados ou apenas conjuntos específicos. Substitua [SOURCE_BUCKET] pelo nome do seu bucket do Cloud Storage:

Exportar todos os dados
gcloud firestore export gs://[SOURCE_BUCKET] --async
Exportar coleções específicas
gcloud firestore export gs://[SOURCE_BUCKET] --collection-ids=[COLLECTION_ID_1],[COLLECTION_ID_2] --async

Anote a operação de exportação outputURIPrefix, porque você a usará mais tarde. Por padrão, o Firestore adiciona um prefixo aos seus arquivos de exportação com base em um carimbo de data/hora:

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

Use o comando firestore operations list para visualizar o andamento da execução da operação de exportação:

gcloud firestore operations list

Importar dados para o projeto de destino

Em seguida, conceda ao projeto de destino acesso aos arquivos de dados do Firestore e inicie uma operação de importação.

Conceder ao projeto de destino acesso aos arquivos de dados

Antes de iniciar uma operação de importação, é necessário garantir que seu projeto de destino possa acessar os arquivos de dados do Firestore.

Mover arquivos de dados para um intervalo local

Se o local do bucket de origem for diferente do local do projeto de destino no Firestore, será necessário mover seus arquivos de dados para um bucket do Cloud Storage no mesmo local do projeto de destino.

Mova seus arquivos de dados para outro bucket do Cloud Storage seguindo as instruções na página Como renomear e mover buckets. Nas próximas etapas, use esse novo bucket como o [SOURCE_BUCKET].

Conceder à conta de serviço do projeto acesso ao bucket de origem

Se o bucket de origem não estiver no projeto de destino, será preciso conceder ao bucket de origem acesso à conta de serviço padrão do projeto de destino. A conta de serviço padrão é denominada [DESTINATION_PROJECT_ID]@appspot.gserviceaccount.com. Para conceder o acesso ao seu bucket de origem à conta de serviço padrão, atribua as permissões necessárias a ela.

É possível distribuir os papéis necessários com a gsutil ferramenta disponível no Cloud Shell:

Inicie o Cloud Shell

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

Também é possível conceder esse papel no Console do Google Cloud.

Começar uma operação de importação

Antes de iniciar a operação de importação, verifique se a ferramenta gcloud está configurada para o projeto correto:

gcloud config set project [DESTINATION_PROJECT_ID]

Use o comando gcloud firestore import para importar os dados do bucket de origem para o projeto de destino:

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

Em que [EXPORT_PREFIX] corresponde ao prefixo da operação de exportação em outputUriPrefix. Exemplo:

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

Use o comando firestore operations list para visualizar o andamento da execução da operação de exportação:

gcloud firestore operations list