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

На этой странице описывается, как использовать функции управляемого импорта и экспорта для перемещения данных 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 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