本頁面說明如何排定匯出 Cloud Firestore 資料的排程。如要排定匯出時程,建議使用 Cloud Functions 和 Cloud Scheduler。
事前準備
排定代管資料匯出作業前,請先完成下列工作:
- 為 Google Cloud 專案啟用計費功能。只有啟用計費服務的專案才能使用匯出及匯入功能。Google Cloud
- 匯出作業需要 Cloud Storage 值區做為目的地。 在靠近資料庫位置的位置建立 Cloud Storage 值區。Cloud Firestore匯出作業不適用於要求者付費值區。
建立 Cloud 函式和 Cloud Scheduler 工作
請按照下列步驟建立 Node.js Cloud 函式,以啟動 Cloud Firestore 資料匯出作業和 Cloud Scheduler 工作,藉此呼叫該函式:
Firebase CLI
-
安裝 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
替換為您的 bucket 名稱。 - 修改
every 24 hours
即可設定匯出時間表。使用 App Engine cron.yaml 語法或 unix-cron 格式 (* * * * *
)。 -
修改
collectionIds: []
,只匯出指定的集合群組。如要匯出所有集合,請維持原狀。
- 將
-
部署排定時間執行的函式:
firebase deploy --only functions
Google Cloud 控制台
建立 Cloud 函式
-
前往 Google Cloud 控制台的「Cloud Functions」頁面:
- 按一下「建立函式」
- 輸入函式名稱,例如
firestoreExport
- 在「Trigger」(觸發條件)下方,選取「Cloud Pub/Sub」
- 在「主題」下方,選取「建立新主題」。輸入 Pub/Sub 主題的名稱,例如
initiateFirestoreExport
。請記下主題名稱,因為您需要這個名稱才能建立 Cloud Scheduler 工作。 - 在「Source code」(原始碼) 下,選取「Inline editor」(內嵌編輯器)。在
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
替換為您的 bucket 名稱。 -
修改
collectionIds: []
,只匯出指定的集合群組。如要匯出所有集合,請維持原狀。
- 將
- 在
package.json
下方新增下列依附元件:{ "dependencies": { "@google-cloud/firestore": "^1.3.0" } }
- 在「Function to execute」(要執行的函式) 底下,輸入
scheduledFirestoreExport
,也就是index.js
中的函式名稱。 - 按一下「建立」,部署 Cloud 函式。
建立 Cloud Scheduler 工作
接著,建立呼叫 Cloud Function 的 Cloud Scheduler 工作:
-
前往 Google Cloud 控制台的「Cloud Scheduler」頁面:
- 按一下 [Create Job] (建立工作)。
- 輸入工作「名稱」,例如
scheduledFirestoreExport
。 - 輸入「頻率」,例如
every 24 hours
。 - 選取「時區」。
- 在「目標」下方,選取「Pub/Sub」。在「Topic」(主題) 欄位中,輸入您在 Cloud Function 旁定義的 Pub/Sub 主題名稱,如上例中的
initiateFirestoreExport
。 - 在「Payload」(酬載) 欄位中輸入
start export
。 這項作業需要定義酬載,但上述 Cloud 函式實際上並未使用這個值。 - 點選「建立」。
設定存取權限
接著,授予 Cloud Function 啟動匯出作業和寫入 GCS bucket 的權限。
這項 Cloud Function 會使用專案的預設服務帳戶進行驗證,並授權匯出作業。建立專案時,系統會為您建立預設服務帳戶,名稱如下:
PROJECT_ID@appspot.gserviceaccount.com
這個服務帳戶需要權限才能啟動匯出作業,以及寫入 Cloud Storage 值區。如要授予這些權限,請將下列身分與存取權管理角色指派給預設服務帳戶:
Cloud Datastore Import Export Admin
-
值區的
Owner
或Storage Admin
角色
您可以使用 gcloud
和 gsutil
指令列工具指派這些角色。
如果尚未安裝,您可以在 Google Cloud 控制台中,透過 Cloud Shell 存取這些工具:
啟動 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
-
指派值區的「Storage 管理員」角色。取代 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服務帳戶,可以重新啟用,請參閱啟用服務帳戶。如果您在過去 30 天內刪除了 App Engine 服務帳戶,可以還原該帳戶,請參閱取消刪除服務帳戶。
測試 Cloud Scheduler 作業和 Cloud Function
您可以在 Google Cloud 控制台的「Cloud Scheduler」Cloud Scheduler頁面中測試工作。
前往 Google Cloud 控制台��「Cloud Scheduler」頁面。
前往 Cloud Scheduler在新的 Cloud Scheduler 工作資料列中,按一下「立即執行」。
幾秒後,Cloud Scheduler 工作應會將結果欄更新為「成功」,並將「上次執行時間」更新為目前時間。你可能需要按一下「重新整理」。
Cloud Scheduler 頁面只會確認作業已呼叫 Cloud Function。開啟 Cloud Functions 頁面,即可查看函式的記錄。
查看 Cloud Functions 記錄檔
如要查看 Cloud Function 是否成功啟動匯出作業,請開啟函式的記錄:
Firebase 主控台
前往 Firebase 控制台的「Cloud Functions」頁面。
GCP 控制台
前往 Google Cloud 控制台的「Cloud Functions」頁面。
查看匯出進度
您可以使用 gcloud firestore operations list
指令查看匯出作業的進度,請參閱管理匯出與匯入作業。
匯出作業完成後,您可以在 Cloud Storage bucket 中查看輸出檔案: