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

На этой странице описано, как запланировать экспорт данных из 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 CLI
  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 на имя вашего хранилища (bucket).
    • Замените YOUR_PROJECT_ID на идентификатор вашего проекта.
    • Для настройки расписания экспорта изменяйте его every 24 hours . Используйте либо синтаксис cron.yaml в AppEngine , либо формат unix-cron ( * * * * * ).
    • Измените collectionIds: [] , чтобы экспортировать только указанные группы коллекций. Оставьте как есть, чтобы экспортировать все группы коллекций.

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

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

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

  2. Нажмите «Написать функцию».
  3. Введите имя функции, например, firestore-export
  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) => {
      // Access the GCLOUD_PROJECT environment variable set by the runtime.
      const projectId =
        process.env.GOOGLE_CLOUD_PROJECT || process.env.GCLOUD_PROJECT;
      // Use the DATABASE_ID environment variable if set,
      // otherwise default to '(default)'
      const databaseId = process.env.DATABASE_ID || '(default)';
      const databaseName = client.databasePath(
        projectId,
        databaseId
      );
    
      return client
        .exportDocuments({
          name: databaseName,
          outputUriPrefix: bucket,
          // Leave collectionIds empty to export all collection groups
          // or define a list of collection group 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 на имя вашего хранилища (bucket).
    • Измените collectionIds: [] , чтобы экспортировать только указанные группы коллекций. Оставьте как есть, чтобы экспортировать все группы коллекций.

    • (Необязательно) Если вы используете нестандартную базу данных, убедитесь, что вы установили переменную среды DATABASE_ID при создании облачной функции. Если вы используете среду выполнения, в которой переменная GOOGLE_CLOUD_PROJECT не устанавливается автоматически, вам также может потребоваться установить ее вручную или заменить ее идентификатором вашего проекта в коде.

  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» . В поле «Тема» введите имя темы pub/sub, которую вы определили вместе с вашей облачной функцией, например, initiateFirestoreExport как в предыдущем примере.
  7. В поле «Полезная нагрузка» введите start export . Для выполнения задания требуется определенная полезная нагрузка, но предыдущая облачная функция фактически не использует это значение.
  8. Нажмите «Создать» .
На данном этапе вы развернули свою облачную функцию и задание Cloud Scheduler , но вашей облачной функции по-прежнему требуются права доступа для выполнения операций экспорта.

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

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

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

  • Облачные функции (1-го поколения): Использует учетную запись службы App Engine по умолчанию: PROJECT_ID @appspot.gserviceaccount.com
  • Cloud Functions (2-го поколения): Использует учетную запись службы Compute Engine по умолчанию: PROJECT_NUMBER -compute@developer.gserviceaccount.com

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

  • Cloud Datastore Import Export Admin
  • Роль Storage Admin для корзины
  • Cloud Run Invoker (необходим для Cloud Functions (2-го поколения), чтобы позволить службе-инициатору вызывать функцию)

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

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

  1. Назначьте роль администратора импорта/экспорта в облачное хранилище данных . Замените PROJECT_ID и SERVICE_ACCOUNT (например, PROJECT_ID @appspot.gserviceaccount.com или PROJECT_NUMBER -compute@developer.gserviceaccount.com ) и выполните следующую команду:

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

    gsutil iam ch serviceAccount:SERVICE_ACCOUNT:admin \
        gs://BUCKET_NAME
  3. (Для Cloud Functions (2-го поколения)) Назначьте учетной записи службы роль Cloud Run Invoker . Замените PROJECT_ID и SERVICE_ACCOUNT и выполните следующую команду:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member serviceAccount:SERVICE_ACCOUNT \
        --role roles/run.invoker

Если вы отключите или удалите свою учетную запись службы 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

В консоли Firebase перейдите в раздел «Хостинг и бессерверные вычисления» > «Функции» .

Перейдите в раздел «Журналы функций».

Консоль GCP

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

Перейдите в раздел «Просмотр журналов».

Отслеживание хода экспорта

Для просмотра хода выполнения операций экспорта можно использовать команду gcloud firestore operations list см. раздел «Управление операциями экспорта и импорта») .

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

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