На этой странице описано, как запланировать экспорт данных Cloud Firestore . Чтобы выполнять экспорт по расписанию, мы рекомендуем использовать Cloud Functions и Cloud Scheduler .
Прежде чем начать
Прежде чем запланировать управляемый экспорт данных, необходимо выполнить следующие задачи:
- Включите оплату для своего проекта Google Cloud . Только проекты Google Cloud с включенной оплатой могут использовать функцию экспорта и импорта.
- Для операций экспорта требуется целевой сегмент Cloud Storage . Создайте корзину Cloud Storage рядом с расположением вашей базы данных Cloud Firestore . Вы не можете использовать корзину Requester Pays для операций экспорта.
Создайте облачную функцию и задание Cloud Scheduler .
Выполните следующие шаги, чтобы создать облачную функцию Node.js, которая инициирует экспорт данных Cloud Firestore , и задание Cloud Scheduler для вызова этой функции:
Интерфейс командной строки Firebase
Установите Firebase CLI . В новом каталоге инициализируйте CLI для Cloud Functions :
firebase init functions --project PROJECT_ID
- Выберите JavaScript для языка.
- При желании включите ESLint.
- Введите
y
, чтобы установить зависимости.
Замените код в файле
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'); }); });
- В приведенном выше коде измените следующее:
- Замените
BUCKET_NAME
на имя вашего сегмента. - Вносите изменения
every 24 hours
чтобы установить график экспорта. Используйте либо синтаксис AppEngine cron.yaml , либо формат unix-cron (* * * * *
). Измените
collectionIds: []
, чтобы экспортировать только указанные группы коллекций. Оставьте как есть, чтобы экспортировать все коллекции.
- Замените
Разверните запланированную функцию:
firebase deploy --only functions
Консоль Google Cloud
Создайте облачную функцию
Перейдите на страницу «Функции облака» в консоли Google Cloud:
- Нажмите Создать функцию.
- Введите имя функции, например
firestoreExport
- В разделе «Триггер» выберите Cloud Pub/Sub.
- В разделе «Тема» выберите «Создать новую тему» . Введите имя для темы публикации/подписки, например
initiateFirestoreExport
. Запишите название темы, так как оно понадобится вам для создания задания Cloud Scheduler . - В разделе «Исходный код» выберите «Встроенный редактор» . Введите следующий код в
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: []
, чтобы экспортировать только указанные группы коллекций. Оставьте как есть, чтобы экспортировать все коллекции.
- Замените
- В
package.json
добавьте следующую зависимость:{ "dependencies": { "@google-cloud/firestore": "^1.3.0" } }
- В разделе «Функция для выполнения» введите
scheduledFirestoreExport
— имя функции вindex.js
. - Нажмите «Создать» , чтобы развернуть облачную функцию.
Создание задания Cloud Scheduler
Затем создайте задание Cloud Scheduler , которое вызывает вашу облачную функцию:
Перейдите на страницу Cloud Scheduler в консоли Google Cloud:
- Нажмите Создать вакансию .
- Введите имя задания, например,
scheduledFirestoreExport
. - Введите частоту , например,
every 24 hours
. - Выберите часовой пояс .
- В разделе «Цель» выберите «Pub/Sub» . В поле «Тема» введите название темы публикации/подписки, которую вы определили вместе с облачной функцией,
initiateFirestoreExport
в приведенном выше примере. - В поле Полезная нагрузка введите
start export
. Для задания требуется определенная полезная нагрузка, но облачная функция, указанная выше, фактически не использует это значение. - Нажмите Создать .
Настройте права доступа
Затем дайте облачной функции разрешение на запуск операций экспорта и запись в корзину 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
Назначьте роль администратора импорта и экспорта Cloud Datastore . Замените PROJECT_ID и выполните следующую команду:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:PROJECT_ID@appspot.gserviceaccount.com \ --role roles/datastore.importExportAdmin
Назначьте роль администратора хранилища в своем сегменте. Замените 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.
Перейдите на страницу Cloud Scheduler в консоли Google Cloud.
Зайдите в Cloud SchedulerВ строке нового задания Cloud Scheduler нажмите «Выполнить сейчас» .
Через несколько секунд задание Cloud Scheduler должно обновить столбцы результатов для значений «Успешно» и «Последний запуск» до текущего времени. Возможно, вам придется нажать «Обновить» .
Страница Cloud Scheduler только подтверждает, что задание называется вашей облачной функцией. Откройте страницу облачных функций, чтобы просмотреть журналы вашей функции.
Просмотр журналов облачных функций
Чтобы узнать, успешно ли облачная функция запустила операцию экспорта, откройте журналы функции:
Консоль Firebase
Перейдите на страницу Cloud Functions в консоли Firebase.
Консоль GCP
Перейдите на страницу Cloud Functions в консоли Google Cloud.
Просмотр прогресса экспорта
Вы можете использовать команду gcloud firestore operations list
чтобы просмотреть ход выполнения операций экспорта, см. Управление операциями экспорта и импорта .
После завершения операции экспорта вы можете просмотреть выходные файлы в своем сегменте Cloud Storage :
Откройте браузер Cloud Storage