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

На этой странице описано, как запланировать экспорт данных 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 , чтобы настроить расписание экспорта. Используйте синтаксис cron.yaml AppEngine или формат 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 Function и Cloud Scheduler , но вашей Cloud Function по-прежнему требуются разрешения на доступ для выполнения операций экспорта.

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

Затем дайте облачной функции разрешение на запуск операций экспорта и запись в ваш контейнер 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 . Замените 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