Запланировать экспорт данных

На этой странице описано, как запланировать экспорт данных Cloud Firestore . Чтобы выполнять экспорт по расписанию, мы рекомендуем использовать Cloud Functions и Cloud Scheduler .

Прежде чем начать

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

  1. Включите оплату для своего проекта Google Cloud . Только проекты Google Cloud с включенной оплатой могут использовать функцию экспорта и импорта.
  2. Для операций экспорта требуется целевой сегмент Cloud Storage . Создайте корзину Cloud Storage рядом с расположением вашей базы данных Cloud Firestore . Вы не можете использовать корзину Requester Pays для операций экспорта.

Создайте облачную функцию и задание Cloud Scheduler .

Выполните следующие шаги, чтобы создать облачную функцию Node.js, которая инициирует экспорт данных Cloud Firestore , и задание Cloud Scheduler для вызова этой функции:

Интерфейс командной строки Firebase
  1. Установите Firebase CLI . В новом каталоге инициализируйте CLI для Cloud Functions :

    firebase init functions --project PROJECT_ID
    1. Выберите JavaScript для языка.
    2. При необходимости включите ESLint.
    3. Введите y , чтобы установить зависимости.
  2. Замените код в файле functions/index.js следующим:

    const functions = require('firebase-functions');
    const firestore = require('@google-cloud/firestore');
    const client = new firestore.v1.FirestoreAdminClient();
    
    // Replace BUCKET_NAME
    const bucket = 'gs://BUCKET_NAME';
    
    exports.scheduledFirestoreExport = functions.pubsub
                                                .schedule('every 24 hours')
                                                .onRun((context) => {
    
      const projectId = process.env.GCP_PROJECT;
      const databaseName = 
        client.databasePath(projectId, '(default)');
    
      return client.exportDocuments({
        name: databaseName,
        outputUriPrefix: bucket,
        // Leave collectionIds empty to export all collections
        // or set to a list of collection IDs to export,
        // collectionIds: ['users', 'posts']
        collectionIds: []
        })
      .then(responses => {
        const response = responses[0];
        console.log(`Operation Name: ${response['name']}`);
      })
      .catch(err => {
        console.error(err);
        throw new Error('Export operation failed');
      });
    });
  3. В приведенном выше коде измените следующее:
    • Замените BUCKET_NAME на имя вашего сегмента.
    • Вносите изменения every 24 hours чтобы установить график экспорта. Используйте либо синтаксис AppEngine cron.yaml , либо формат unix-cron ( * * * * * ).
    • Измените collectionIds: [] , чтобы экспортировать только указанные группы коллекций. Оставьте как есть, чтобы экспортировать все коллекции.

  4. Разверните запланированную функцию:

    firebase deploy --only functions
Консоль Google Cloud
Создайте облачную функцию
  1. Перейдите на страницу «Функции облака» в консоли Google Cloud:

    Перейти к облачным функциям

  2. Нажмите «Создать функцию».
  3. Введите имя функции, например firestoreExport
  4. В разделе «Триггер» выберите Cloud Pub/Sub.
  5. В разделе «Тема» выберите «Создать новую тему» . Введите имя для темы публикации/подписки, например initiateFirestoreExport . Запишите название темы, так как оно понадобится вам для создания задания Cloud Scheduler .
  6. В разделе «Исходный код» выберите «Встроенный редактор» . Введите следующий код в index.js :
    const firestore = require('@google-cloud/firestore');
    const client = new firestore.v1.FirestoreAdminClient();
    // Replace BUCKET_NAME
    const bucket = 'gs://BUCKET_NAME'
    
    exports.scheduledFirestoreExport = (event, context) => {
      const databaseName = client.databasePath(
        process.env.GCP_PROJECT,
        '(default)'
      );
    
      return client
        .exportDocuments({
          name: databaseName,
          outputUriPrefix: bucket,
          // Leave collectionIds empty to export all collections
          // or define a list of collection IDs:
          // collectionIds: ['users', 'posts']
          collectionIds: [],
        })
        .then(responses => {
          const response = responses[0];
          console.log(`Operation Name: ${response['name']}`);
          return response;
        })
        .catch(err => {
          console.error(err);
        });
    };
    В приведенном выше коде измените следующее:
    • Замените BUCKET_NAME на имя вашего сегмента.
    • Измените collectionIds: [] , чтобы экспортировать только указанные группы коллекций. Оставьте как есть, чтобы экспортировать все коллекции.

  7. В package.json добавьте следующую зависимость:
    {
      "dependencies": {
        "@google-cloud/firestore": "^1.3.0"
      }
    }
  8. В разделе «Функция для выполнения» введите scheduledFirestoreExport — имя функции в index.js .
  9. Нажмите «Создать» , чтобы развернуть облачную функцию.
Создание задания Cloud Scheduler

Затем создайте задание Cloud Scheduler , которое вызывает вашу облачную функцию:

  1. Перейдите на страницу Cloud Scheduler в консоли Google Cloud:

    Зайдите в Cloud Scheduler

  2. Нажмите «Создать задание» .
  3. Введите имя задания, например, scheduledFirestoreExport .
  4. Введите частоту , например, every 24 hours .
  5. Выберите часовой пояс .
  6. В разделе «Цель» выберите «Pub/Sub» . В поле «Тема» введите название темы публикации/подписки, которую вы определили вместе с облачной функцией, initiateFirestoreExport в приведенном выше примере.
  7. В поле Полезная нагрузка введите start export . Для задания требуется определенная полезная нагрузка, но облачная функция, указанная выше, фактически не использует это значение.
  8. Нажмите Создать .
На этом этапе вы развернули задание облачной функции и Cloud Scheduler , но вашей облачной функции по-прежнему требуются разрешения на доступ для выполнения операций экспорта.

Настройте права доступа

Затем дайте облачной функции разрешение на запуск операций экспорта и запись в корзину GCS.

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

PROJECT_ID@appspot.gserviceaccount.com

Этому сервисному аккаунту требуется разрешение на запуск операции экспорта и запись в корзину Cloud Storage . Чтобы предоставить эти разрешения, назначьте следующие роли IAM учетной записи службы по умолчанию:

  • Cloud Datastore Import Export Admin
  • Роль Owner или Storage Admin в сегменте

Для назначения этих ролей можно использовать инструменты командной строки gcloud и gsutil .

Если они еще не установлены, вы можете получить доступ к этим инструментам из Cloud Shell в консоли Google Cloud:
Запустить Cloud Shell

  1. Назначьте роль администратора импорта и экспорта Cloud Datastore . Замените PROJECT_ID и выполните следующую команду:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member serviceAccount:PROJECT_ID@appspot.gserviceaccount.com \
        --role roles/datastore.importExportAdmin
  2. Назначьте роль администратора хранилища в своем сегменте. Замените PROJECT_ID и BUCKET_NAME и выполните следующую команду:

    gsutil iam ch serviceAccount:PROJECT_ID@appspot.gserviceaccount.com:admin \
        gs://BUCKET_NAME

Если вы отключите или удалите свою учетную запись службы App Engine по умолчанию, ваше приложение App Engine потеряет доступ к вашей базе данных Cloud Firestore . Если вы отключили свою учетную запись службы App Engine , вы можете снова включить ее, см. Включение учетной записи службы . Если вы удалили свою учетную запись службы App Engine в течение последних 30 дней, вы можете восстановить свою учетную запись службы, см. восстановление учетной записи службы .

Проверьте работу Cloud Scheduler и облачную функцию.

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

  1. Перейдите на страницу Cloud Scheduler в консоли Google Cloud.
    Зайдите в Cloud Scheduler

  2. В строке нового задания Cloud Scheduler нажмите «Выполнить сейчас» .

    Через несколько секунд задание Cloud Scheduler должно обновить столбцы результатов для значений «Успешно» и «Последний запуск» до текущего времени. Возможно, вам придется нажать «Обновить» .

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

Просмотр журналов облачных функций

Чтобы узнать, успешно ли облачная функция запустила операцию экспорта, откройте журналы функции:

Консоль Firebase

Перейдите на страницу Cloud Functions в консоли Firebase.

Перейти к журналам функций

Консоль GCP

Перейдите на страницу Cloud Functions в консоли Google Cloud.

Перейти к средству просмотра журналов

Просмотр прогресса экспорта

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

После завершения операции экспорта вы можете просмотреть выходные файлы в своем сегменте Cloud Storage :

Откройте браузер Cloud Storage