Как настроить экспорт данных по расписанию

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

Подготовка

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

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

Создайте функцию Cloud Functions и задание Cloud Scheduler

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

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

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

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

    Перейти к Cloud Functions

  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 названием своего сегмента.
    • Измените collectionIds: [], чтобы экспортировать только указанные группы коллекций. Если вы хотите экспортировать все группы коллекций, оставьте это поле пустым.

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

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

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

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

    Перейти: Cloud Scheduler

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

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

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

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

  • Cloud Functions (первое поколение). Использует сервисный аккаунт по умолчанию App Engine: PROJECT_ID@appspot.gserviceaccount.com
  • Cloud Functions (второе поколение). Используется сервисный аккаунт Compute Engine по умолчанию: PROJECT_NUMBER-compute@developer.gserviceaccount.com.

Сервисному аккаунту требуется разрешение на запуск операции экспорта и запись в сегмент Cloud Storage. Для этого назначьте сервисному аккаунту следующие роли IAM:

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

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

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

  1. Назначьте роль Администратор импорта и экспорта Cloud Datastore. Замените 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 (второе поколение) назначьте сервисному аккаунту роль 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 Functions

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

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

  2. В строке с новым заданием Cloud Scheduler нажмите Запустить.

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

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

Как посмотреть журналы Cloud Functions

Чтобы проверить, удалось ли функции Cloud Functions запустить операцию экспорта, откройте журналы функции:

Консоль Firebase

В консоли Firebase выберите Hosting & Serverless (Хостинг и бессерверные технологии) > Functions (Функции).

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

GCP Console

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

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

Как посмотреть ход выполнения экспорта

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

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

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