本頁面說明如何排定 Cloud Firestore 資料匯出作業。如要排定匯出作業,建議使用 Cloud Functions 和 Cloud Scheduler。
事前準備
安排代管資料匯出作業前,請務必完成下列工作:
- 啟用 Google Cloud 專案的計費功能。只有已啟用計費功能的 Google Cloud 專案,才能使用匯出和匯入功能。
- 匯出作業需要目的地 Cloud Storage bucket。在Cloud Firestore資料庫位置附近建立Cloud Storage bucket。您無法使用「要求者付費」值區執行匯出作業。
建立 Cloud 函式和 Cloud Scheduler 工作
請按照下列步驟建立 Node.js Cloud 函式,啟動 Cloud Firestore 資料匯出作業,並建立 Cloud Scheduler 工作來呼叫該函式:
Firebase CLI
-
安裝 Firebase CLI。 在新目錄中,初始化 Cloud Functions 的 CLI:
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替換為 bucket 名稱。 - 將
YOUR_PROJECT_ID替換為您的專案 ID - 修改
every 24 hours即可設定匯出排程。 請使用 AppEngine cron.yaml 語法或 unix-cron 格式 (* * * * *)。 -
修改
collectionIds: [],只匯出指定的集合群組。如要匯出所有集合群組,請保持原樣。
- 將
-
部署排定的函式:
firebase deploy --only functions
Google Cloud 控制台
建立 Cloud 函式
-
前往 Google Cloud 控制台的「Cloud Functions」頁面:
- 按一下「編寫函式」
- 輸入函式名稱,例如
firestore-export - 在「Trigger」(觸發條件) 下方,選取「Cloud Pub/Sub」。
- 在「主題」下方,選取「建立新主題」。輸入 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) => { // 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替換為 bucket 名稱。 -
修改
collectionIds: [],只匯出指定的集合群組。如要匯出所有集合群組,請保持原樣。 -
(選用) 如果您使用的是非預設資料庫,請務必在建立 Cloud 函式時設定
DATABASE_ID環境變數。如果您使用的執行階段不會自動設定GOOGLE_CLOUD_PROJECT,可能也需要手動設定,或在程式碼中替換成專案 ID。
- 將
- 在
package.json下方,新增下列依附元件:{ "dependencies": { "@google-cloud/firestore": "^1.3.0" } } - 在「Function to execute」(要執行的函式) 下方,輸入
index.js中的函式名稱scheduledFirestoreExport。 - 按一下「建立」,部署 Cloud 函式。
建立 Cloud Scheduler 工作
接著,建立呼叫 Cloud 函式的 Cloud Scheduler 工作:
-
前往 Google Cloud 控制台的「Cloud Scheduler」頁面:
- 點選「建立工作」。
- 輸入工作「名稱」,例如
scheduledFirestoreExport。 - 輸入「Frequency」(頻率),例如
every 24 hours。 - 選取「時區」。
- 在「Target」(目標) 下方,選取「Pub/Sub」。在「Topic」(主題) 欄位中,輸入您與 Cloud 函式一起定義的 Pub/Sub 主題名稱,在上述範例中為
initiateFirestoreExport。 - 在「Payload」欄位中輸入
start export。這項工作需要定義酬載,但上述 Cloud 函式實際上不會使用這個值。 - 點選「建立」。
設定存取權限
接著,請授予 Cloud 函式權限,以便啟動匯出作業並寫入 GCS bucket。
這個 Cloud Run 函式會使用服務帳戶,驗證及授權匯出作業。使用的服務帳戶取決於您的 Cloud Functions 設定:
- Cloud Functions (第 1 代):使用 App Engine 預設服務帳戶:
PROJECT_ID@appspot.gserviceaccount.com - Cloud Functions (第 2 代):使用預設 Compute Engine 服務帳戶:
PROJECT_NUMBER-compute@developer.gserviceaccount.com
這個服務帳戶必須具備啟動匯出作業及寫入 Cloud Storage bucket 的權限。如要授予這些權限,請將下列 IAM 角色指派給服務帳戶:
Cloud Datastore Import Export Admin- bucket 的
Storage Admin角色 Cloud Run Invoker(Cloud Functions (第 2 代) 必須具備這項權限,觸發服務才能叫用函式)
您可以使用 gcloud 和 gsutil 指令列工具指派這些角色。
如果尚未安裝,可以從 Google Cloud 控制台的 Cloud Shell 存取這些工具:
啟動 Cloud Shell
-
指派「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 -
指派 bucket 的儲存空間管理員角色。請替換 SERVICE_ACCOUNT 和 BUCKET_NAME,然後執行下列指令:
gsutil iam ch serviceAccount:SERVICE_ACCOUNT:admin \ gs://BUCKET_NAME -
(適用於 Cloud Functions (第 2 代)) 將Cloud Run叫用者角色指派給服務帳戶。請替換 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 服務帳戶,可以重新啟用,請參閱「啟用服務帳戶」。如果您在過去 30 天內刪除 App Engine 服務帳戶,可以還原服務帳戶,詳情請參閱「取消刪除服務帳戶」。
測試 Cloud Scheduler 工作和 Cloud 函式
您可以在 Google Cloud 控制台 的「Cloud Scheduler」頁面中測試 Cloud Scheduler 工作。
前往 Google Cloud 控制台的「Cloud Scheduler」頁面。
前往 Cloud Scheduler在新的 Cloud Scheduler 工作列中,按一下「Run now」(立即執行)。
幾秒後,Cloud Scheduler 工作應會將結果欄更新為「Success」(成功),並將「Last run」(上次執行時間) 更新為目前時間。您可能需要點選「重新整理」。
Cloud Scheduler 頁面只會確認工作已呼叫 Cloud 函式。開啟「Cloud 函式」頁面,查看函式記錄。
查看 Cloud 函式記錄
如要查看 Cloud 函式是否成功啟動匯出作業,請開啟函式的記錄:
Firebase 控制台
在 Firebase 控制台中,依序前往「Hosting & Serverless」 >「Functions」。
GCP 控制台
前往 Google Cloud 控制台的「Cloud Functions」頁面。
查看匯出進度
您可以使用 gcloud firestore operations list 指令查看匯出作業的進度,詳情請參閱「管理匯出和匯入作業」。
匯出作業完成後,您可以在 Cloud Storage bucket 中查看輸出檔案: