Перемещайте данные между проектами

На этой странице описано, как использовать функции управляемого импорта и экспорта для перемещения данных Cloud Firestore из одного проекта в другой. Это может быть полезно для настройки среды разработки или при окончательном переносе приложения в другой проект. Пример на этой странице демонстрирует, как экспортировать данные из исходного проекта, а затем импортировать эти данные в целевой проект. Перемещение данных между проектами включает в себя следующие шаги:

  1. Создайте корзину Cloud Storage для хранения данных из исходного проекта.
  2. Экспортируйте данные из исходного проекта в корзину.
  3. Дайте целевому проекту разрешение на чтение из корзины.
  4. Импортируйте данные из корзины в целевой проект.

Прежде чем вы начнете

Прежде чем вы сможете использовать услугу управляемого экспорта и импорта, вам необходимо выполнить следующие задачи:

  1. Включите оплату как для исходного, так и для целевого проекта. Только проекты Google Cloud с включенной оплатой могут использовать функции экспорта и импорта.
  2. Убедитесь, что у вашей учетной записи есть необходимые разрешения Cloud IAM в исходном и целевом проектах. Если вы являетесь владельцем обоих проектов, ваша учетная запись имеет необходимые разрешения. В противном случае следующие роли Cloud IAM предоставляют необходимые разрешения для операций экспорта и импорта Cloud Firestore:

    Owner , Cloud Datastore Owner или Cloud Datastore Import Export Admin

    Владелец проекта может предоставить одну из этих ролей, выполнив действия, описанные в разделе Предоставление доступа .

  3. Настройте инструмент командной строки gcloud и подключитесь к своему проекту одним из следующих способов:

  4. Настройте индексы в своем новом проекте. Составные индексы должны совпадать между исходным и целевым проектами. Сначала следует настроить индексы, чтобы избежать необходимости обрабатывать каждый документ несколько раз.

Экспорт данных из исходного проекта

Экспортируйте свои данные, создав корзину Cloud Storage для файлов экспорта Cloud Firestore и начав операцию экспорта.

Создайте сегмент облачного хранилища.

Создайте корзину Cloud Storage в том же месте, где находится ваша база данных Cloud Firestore. Чтобы просмотреть местоположение вашей базы данных, см. настройку местоположения вашего проекта . Вы не можете использовать корзину Requester Pays для операций экспорта и импорта.

Если сегмент Cloud Storage отсутствует в исходном проекте , вы должны предоставить сервисному аккаунту исходного проекта по умолчанию доступ к сегменту. Каждый проект Google Cloud имеет автоматически создаваемую учетную запись службы по умолчанию с именем PROJECT_ID @appspot.gserviceaccount.com . Операции экспорта Cloud Firestore используют эту учетную запись службы по умолчанию для авторизации операций с сегментом Cloud Storage. Чтобы предоставить учетной записи службы по умолчанию доступ к исходному сегменту, предоставьте ей роль Storage Admin .

Вы можете предоставить эту роль с помощью инструмента gsutil , доступного в Cloud Shell:

Запустить Cloud Shell

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

Вы также можете предоставить эту роль в консоли Google Cloud .

Отключить операции записи (необязательно)

Если ваше приложение продолжает записывать в базу данных во время выполнения операции экспорта, возможно, вы не сможете зафиксировать все эти записи в файлах экспорта. Чтобы экспортировать данные из согласованного состояния, отключите запись в базу данных, обновив правила безопасности и остановив любые операции Admin SDK.

  1. Обновить правила безопасности

    На вкладке « Правила Cloud Firestore» консоли обновите правила безопасности исходного проекта, чтобы запретить любую запись. Например:

      // 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. Остановка записи из Admin SDK

    Правила безопасности не запрещают записи, поступающие из привилегированных серверных сред, созданных с помощью Firebase Admin SDK или клиентской библиотеки Google Cloud Server . Обязательно остановите операции записи с серверов администрирования, выключив или обновив серверы.

Начать экспортную операцию

Используйте команду gcloud firestore export чтобы экспортировать данные из исходного проекта. Вы можете экспортировать все свои данные или только определенные коллекции. Замените [SOURCE_BUCKET] на имя вашего сегмента Cloud Storage:

Экспортировать все данные
gcloud firestore export gs://[SOURCE_BUCKET] --async
Экспорт определенных коллекций
gcloud firestore export gs://[SOURCE_BUCKET] --collection-ids=[COLLECTION_ID_1],[COLLECTION_ID_2] --async

Обратите внимание на outputURIPrefix вашей операции экспорта, поскольку вы будете использовать его позже. По умолчанию Cloud Firestore добавляет префикс к вашим файлам экспорта на основе отметки времени:

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

Во время выполнения операции экспорта вы можете использовать команду firestore operations list , чтобы просмотреть ход выполнения вашей операции:

gcloud firestore operations list

Импортируйте данные в целевой проект

Затем предоставьте целевому проекту доступ к файлам данных Cloud Firestore и начните операцию импорта.

Предоставьте целевому проекту доступ к вашим файлам данных.

Прежде чем вы сможете начать операцию импорта, вы должны убедиться, что целевой проект имеет доступ к файлам данных Cloud Firestore.

Переместить файлы данных в локальную корзину

Если расположение исходной корзины отличается от местоположения Cloud Firestore вашего целевого проекта, вам необходимо переместить файлы данных в корзину Cloud Storage в том же месте, что и целевой проект.

Переместите файлы данных в другой сегмент Cloud Storage, выполнив действия, описанные в разделе «Перемещение и переименование сегментов» . Для всех следующих шагов используйте этот новый сегмент как [SOURCE_BUCKET] .

Предоставьте сервисному аккаунту проекта доступ к исходному сегменту.

Если исходный сегмент отсутствует в целевом проекте, вы должны предоставить сервисному аккаунту целевого проекта по умолчанию доступ к исходному сегменту. Учетная запись службы по умолчанию называется [DESTINATION_PROJECT_ID] @appspot.gserviceaccount.com . Чтобы предоставить учетной записи службы по умолчанию доступ к исходному сегменту, предоставьте ему соответствующие разрешения на доступ к этому сегменту.

Вы можете предоставить необходимые роли с помощью инструмента gsutil , доступного в Cloud Shell:

Запустить Cloud Shell

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

Вы также можете предоставить эту роль в консоли Google Cloud .

Начать операцию импорта

Прежде чем начать операцию импорта, убедитесь, что gcloud настроен для правильного проекта:

gcloud config set project [DESTINATION_PROJECT_ID]

Используйте команду gcloud firestore import , чтобы импортировать данные из исходного сегмента в целевой проект:

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

Где [EXPORT_PREFIX] соответствует префиксу в outputUriPrefix вашей операции экспорта. Например:

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

Во время выполнения операции экспорта вы можете использовать команду firestore operations list , чтобы просмотреть ход выполнения вашей операции:

gcloud firestore operations list