Trang này mô tả cách lên lịch xuất dữ liệu Cloud Firestore. Để chạy các lệnh xuất theo lịch, bạn nên sử dụng Cloud Functions và Cloud Scheduler.
Trước khi bắt đầu
Trước khi lên lịch xuất dữ liệu được quản lý, bạn phải hoàn thành các việc sau:
- Bật tính năng thanh toán cho dự án Google Cloud của bạn. Chỉ những dự án Google Cloud đã bật tính năng thanh toán mới có thể sử dụng tính năng xuất và nhập.
- Thao tác xuất yêu cầu một bộ chứa Cloud Storage đích. Tạo một bộ chứa Cloud Storage ở một vị trí gần vị trí cơ sở dữ liệu Cloud Firestore của bạn. Bạn không thể sử dụng bộ chứa Người yêu cầu thanh toán cho các thao tác xuất.
Tạo một Cloud Function và một công việc Cloud Scheduler
Hãy làm theo các bước sau để tạo một Cloud Function Node.js bắt đầu xuất dữ liệu Cloud Firestore và một công việc Cloud Scheduler để gọi hàm đó:
Giao diện dòng lệnh (CLI) của Firebase
-
Cài đặt Giao diện dòng lệnh (CLI) của Firebase. Trong một thư mục mới, hãy khởi chạy CLI cho Cloud Functions:
firebase init functions --project PROJECT_ID
- Chọn JavaScript cho ngôn ngữ.
- Bật ESLint (không bắt buộc).
- Nhập
yđể cài đặt các phần phụ thuộc.
-
Thay thế mã trong tệp
functions/index.jsbằng đoạn mã sau: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'); }); });
-
Trong đoạn mã trước, hãy sửa đổi những thông tin sau:
- Thay thế
BUCKET_NAMEbằng tên của bộ chứa. - Thay thế
YOUR_PROJECT_IDbằng mã dự án của bạn - Sửa đổi
every 24 hoursđể đặt lịch xuất. Sử dụng cú pháp cron.yaml của AppEngine hoặc định dạng unix-cron (* * * * *). -
Sửa đổi
collectionIds: []để chỉ xuất các nhóm tập hợp được chỉ định. Giữ nguyên để xuất tất cả các nhóm bộ sưu tập.
- Thay thế
-
Triển khai hàm theo lịch:
firebase deploy --only functions
Google Cloud Console
Tạo một Cloud Function
-
Chuyển đến trang Cloud Functions trong Google Cloud Console:
- Nhấp vào Viết hàm
- Nhập tên hàm, chẳng hạn như
firestore-export - Trong phần Trigger (Trình kích hoạt), hãy chọn Cloud Pub/Sub
- Trong mục Chủ đề, hãy chọn Tạo chủ đề mới. Nhập tên cho chủ đề pub/sub, chẳng hạn như
initiateFirestoreExport. Hãy ghi lại tên chủ đề vì bạn cần tên này để tạo công việc Cloud Scheduler. - Trong mục Mã nguồn, hãy chọn Trình chỉnh sửa nội dòng. Nhập mã sau đây trong
index.js: Trong đoạn mã trước, hãy sửa đổi những thông tin sau: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); }); };
- Thay thế
BUCKET_NAMEbằng tên của bộ chứa. -
Sửa đổi
collectionIds: []để chỉ xuất các nhóm tập hợp được chỉ định. Giữ nguyên để xuất tất cả các nhóm bộ sưu tập. -
(Không bắt buộc) Nếu bạn đang sử dụng một cơ sở dữ liệu không phải mặc định, hãy đảm bảo bạn đặt biến môi trường
DATABASE_IDkhi tạo Cloud Function. Nếu đang sử dụng một môi trường thời gian chạy mà trong đóGOOGLE_CLOUD_PROJECTkhông được đặt tự động, thì bạn cũng có thể cần phải đặt biến này theo cách thủ công hoặc thay thế bằng mã dự án trong mã.
- Thay thế
- Trong
package.json, hãy thêm phần phụ thuộc sau:{ "dependencies": { "@google-cloud/firestore": "^1.3.0" } } - Trong phần Hàm cần thực thi, hãy nhập
scheduledFirestoreExport, tên của hàm trongindex.js. - Nhấp vào Create (Tạo) để triển khai Cloud Function.
Tạo một công việc Cloud Scheduler
Tiếp theo, hãy tạo một công việc Cloud Scheduler gọi Cloud Function của bạn:
-
Chuyển đến trang Cloud Scheduler trong Google Cloud Console:
- Nhấp vào Tạo công việc.
- Nhập Tên cho công việc, chẳng hạn như
scheduledFirestoreExport. - Nhập Tần suất, ví dụ:
every 24 hours. - Chọn Múi giờ.
- Trong phần Target (Mục tiêu), hãy chọn Pub/Sub. Trong trường Chủ đề, hãy nhập tên của chủ đề pub/sub mà bạn đã xác định cùng với Cloud Function,
initiateFirestoreExporttrong ví dụ trước. - Trong trường Payload (Trọng tải), hãy nhập
start export. Công việc này yêu cầu xác định tải trọng, nhưng Cloud Function trước đó không thực sự sử dụng giá trị này. - Nhấp vào Tạo.
Định cấu hình quyền truy cập
Tiếp theo, hãy cấp cho Cloud Function quyền bắt đầu các thao tác xuất và ghi vào bộ chứa GCS.
Hàm Cloud Run này sử dụng một tài khoản dịch vụ để xác thực và uỷ quyền cho các hoạt động xuất. Tài khoản dịch vụ được sử dụng phụ thuộc vào cấu hình Cloud Functions của bạn:
- Cloud Functions (thế hệ thứ 1): Sử dụng tài khoản dịch vụ mặc định App Engine:
PROJECT_ID@appspot.gserviceaccount.com - Cloud Functions (thế hệ thứ 2): Sử dụng tài khoản dịch vụ Compute Engine mặc định:
PROJECT_NUMBER-compute@developer.gserviceaccount.com
Tài khoản dịch vụ này cần có quyền để bắt đầu thao tác xuất và ghi vào bộ chứa Cloud Storage của bạn. Để cấp các quyền này, hãy chỉ định các vai trò IAM sau cho tài khoản dịch vụ:
Cloud Datastore Import Export Admin- Vai trò
Storage Adminđối với bộ chứa Cloud Run Invoker(Bắt buộc đối với Cloud Functions (thế hệ thứ 2) để cho phép dịch vụ kích hoạt gọi hàm)
Bạn có thể sử dụng các công cụ dòng lệnh gcloud và gsutil để chỉ định các vai trò này.
Nếu chưa cài đặt, bạn có thể truy cập vào các công cụ này trong Cloud Shell trong Google Cloud Console:
Bắt đầu Cloud Shell
-
Chỉ định vai trò Quản trị viên xuất nhập Cloud Datastore. Thay thế PROJECT_ID và SERVICE_ACCOUNT (ví dụ:
PROJECT_ID@appspot.gserviceaccount.comhoặcPROJECT_NUMBER-compute@developer.gserviceaccount.com) rồi chạy lệnh sau:gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:SERVICE_ACCOUNT \ --role roles/datastore.importExportAdmin -
Chỉ định vai trò Quản trị viên bộ nhớ cho bộ chứa của bạn. Thay thế SERVICE_ACCOUNT và BUCKET_NAME, rồi chạy lệnh sau:
gsutil iam ch serviceAccount:SERVICE_ACCOUNT:admin \ gs://BUCKET_NAME -
(Đối với Cloud Functions (thế hệ thứ 2)) Chỉ định vai trò Cloud Run Invoker cho tài khoản dịch vụ. Thay thế PROJECT_ID và SERVICE_ACCOUNT, rồi chạy lệnh sau:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:SERVICE_ACCOUNT \ --role roles/run.invoker
Nếu bạn vô hiệu hoá hoặc xoá tài khoản dịch vụ mặc định của App Engine, thì ứng dụng App Engine của bạn sẽ mất quyền truy cập vào cơ sở dữ liệu Cloud Firestore. Nếu đã vô hiệu hoá tài khoản dịch vụ App Engine, bạn có thể bật lại tài khoản đó, xem phần bật tài khoản dịch vụ. Nếu đã xoá tài khoản dịch vụ App Engine trong vòng 30 ngày qua, bạn có thể khôi phục tài khoản dịch vụ đó, hãy xem bài viết huỷ xoá tài khoản dịch vụ.
Kiểm thử công việc Cloud Scheduler và Cloud Function
Bạn có thể kiểm thử công việc Cloud Scheduler trong trang Cloud Scheduler của Google Cloud Console.
Chuyển đến trang Cloud Scheduler trong Google Cloud Console.
Chuyển đến Cloud SchedulerTrong hàng chứa công việc Cloud Scheduler mới, hãy nhấp vào Chạy ngay.
Sau vài giây, công việc Cloud Scheduler sẽ cập nhật cột kết quả thành Thành công và Lần chạy gần đây nhất thành thời gian hiện tại. Bạn có thể cần phải nhấp vào Làm mới.
Trang Cloud Scheduler chỉ xác nhận rằng công việc đã gọi Cloud Function của bạn. Mở trang Cloud Function để xem nhật ký của hàm.
Xem nhật ký Cloud Function
Để xem Cloud Function có bắt đầu thành công một thao tác xuất hay không, hãy mở nhật ký của hàm:
bảng điều khiển của Firebase
Trong bảng điều khiển của Firebase, hãy chuyển đến phần Hosting & Serverless (Lưu trữ và không máy chủ) > Functions (Hàm).
Bảng điều khiển GCP
Chuyển đến trang Cloud Functions trong Google Cloud Console.
Xem tiến trình xuất
Bạn có thể sử dụng lệnh gcloud firestore operations list để xem tiến trình của các thao tác xuất, xem phần quản lý thao tác xuất và nhập.
Sau khi thao tác xuất hoàn tất, bạn có thể xem các tệp đầu ra trong bộ chứa Cloud Storage: