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

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