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

На этой странице описывается, как запланировать экспорт данных 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 на имя вашего контейнера.
    • Изменяйте 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. В разделе Тема выберите Создать новую тему . Введите имя для темы pub/sub, например, 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. В разделе Target выберите Pub/Sub . В поле Topic введите название темы pub/sub, которую вы определили вместе с функцией Cloud, initiateFirestoreExport в примере выше.
  7. В поле Payload введите start export . Задание требует определения payload, но функция Cloud выше фактически не использует это значение.
  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 Import Export Admin . Замените 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 должно обновить столбец результатов до Success , а Last run — до текущего времени. Возможно, вам придется нажать Refresh .

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

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

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

Консоль Firebase

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

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

Консоль GCP

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

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

Посмотреть ход экспорта

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

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

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