Расписание экспорта данных

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

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

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

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

Создайте облачную функцию и задание облачного планировщика.

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

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

    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
Консоль GCP
Создайте облачную функцию
  1. Перейдите на страницу «Облачные функции» в консоли GCP:

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

  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. Нажмите «Создать» , чтобы развернуть облачную функцию.
Создание задания облачного планировщика

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

  1. Перейдите на страницу облачного планировщика в консоли GCP:

    Зайдите в облачный планировщик

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

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

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

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

PROJECT_ID@appspot.gserviceaccount.com

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

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

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

Если они еще не установлены, вы можете получить доступ к этим инструментам из Cloud Shell в консоли Google Cloud Platform:
Запустить 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 дней, вы можете восстановить свою учетную запись службы, см. восстановление учетной записи службы .

Проверьте работу облачного планировщика и облачную функцию.

Вы можете протестировать свое задание облачного планировщика на странице облачного планировщика консоли Google Cloud Platform.

  1. Перейдите на страницу облачного планировщика в консоли GCP.
    Зайдите в облачный планировщик

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

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

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

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

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

Консоль Firebase

Перейдите на страницу облачных функций в консоли Firebase.

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

Консоль GCP

Перейдите на страницу «Облачные функции» в консоли GCP.

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

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

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

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

Откройте браузер облачного хранилища.