หน้านี้จะอธิบายวิธีตั้งเวลาการส่งออกข้อมูลCloud Firestore หากต้องการเรียกใช้การส่งออกตามกำหนดการ เราขอแนะนำให้ใช้ Cloud Functions และ Cloud Scheduler
ก่อนเริ่มต้น
ก่อนกำหนดเวลาการส่งออกข้อมูลที่จัดการ คุณต้องทํางานต่อไปนี้ให้เสร็จสมบูรณ์
- เปิดใช้การเรียกเก็บเงินสำหรับโปรเจ็กต์ Google Cloud เฉพาะGoogle Cloudโครงการที่เปิดใช้การเรียกเก็บเงินเท่านั้นที่ใช้ฟีเจอร์การส่งออกและนําเข้าได้
- การดำเนินการส่งออกต้องใช้ที่เก็บข้อมูล Cloud Storage ปลายทาง สร้างที่เก็บข้อมูล Cloud Storage ในตำแหน่งที่อยู่ใกล้ตำแหน่งฐานข้อมูล Cloud Firestore คุณใช้ที่เก็บข้อมูลแบบผู้ขอชำระเงินสำหรับการดำเนินการส่งออกไม่ได้
สร้าง Cloud Function และงาน 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
ด้วยชื่อที่เก็บข้อมูล - แก้ไข
every 24 hours
เพื่อกำหนดกำหนดเวลาการส่งออก ใช้ไวยากรณ์ cron.yaml ของ AppEngine หรือ รูปแบบ unix-cron (* * * * *
) -
แก้ไข
collectionIds: []
เพื่อส่งออกเฉพาะกลุ่มคอลเล็กชันที่ระบุ ปล่อยไว้เพื่อส่งออกคอลเล็กชันทั้งหมด
- แทนที่
-
ทำให้ฟังก์ชันที่กำหนดเวลาไว้ใช้งานได้
firebase deploy --only functions
คอนโซล Google Cloud
สร้างฟังก์ชันระบบคลาวด์
-
ไปที่หน้า Cloud Functions ในคอนโซล Google Cloud
- คลิกสร้างฟังก์ชัน
- ป้อนชื่อฟังก์ชัน เช่น
firestoreExport
- ในส่วนทริกเกอร์ ให้เลือก 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) => { 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 Function ใช้งานได้
สร้างงาน Cloud Scheduler
ถัดไป ให้สร้างงาน Cloud Scheduler ที่เรียกใช้ Cloud Function โดยทำดังนี้
-
ไปที่หน้า Cloud Scheduler ในคอนโซล Google Cloud
- คลิกสร้างงาน
- ป้อนชื่องาน เช่น
scheduledFirestoreExport
- ป้อนความถี่ เช่น
every 24 hours
- เลือกเขตเวลา
- เลือก Pub/Sub ในส่วนเป้าหมาย ในช่อง Topic ให้ป้อนชื่อหัวข้อ pub/sub ที่คุณกำหนดไว้พร้อมกับ Cloud Function
initiateFirestoreExport
ในตัวอย่างด้านบน - ป้อน
start export
ในช่อง Payload งานกำหนดให้มีการกำหนดเพย์โหลด แต่ Cloud Function ด้านบนไม่ได้ใช้ค่านี้ - คลิกสร้าง
กำหนดค่าสิทธิ์การเข้าถึง
ถัดไป ให้สิทธิ์ Cloud Function เพื่อเริ่มการดำเนินการส่งออกและเขียนลงในที่เก็บข้อมูล GCS
Cloud Function นี้ใช้บัญชีบริการเริ่มต้นของโปรเจ็กต์เพื่อตรวจสอบสิทธิ์และอนุญาตให้ดำเนินการส่งออก เมื่อคุณสร้างโปรเจ็กต์ ระบบจะสร้างบัญชีบริการเริ่มต้นให้คุณโดยใช้ชื่อต่อไปนี้
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 Function
คุณสามารถทดสอบงาน Cloud Scheduler ในหน้า Cloud Scheduler ของคอนโซล Google Cloud
ไปที่หน้า Cloud Scheduler ในคอนโซล Google Cloud
ไปที่ Cloud Schedulerในแถวของงาน Cloud Scheduler ใหม่ ให้คลิกเรียกใช้เลย
หลังจากผ่านไป 2-3 วินาที งาน Cloud Scheduler ควรอัปเดตคอลัมน์ผลลัพธ์เป็นสำเร็จ และการเรียกใช้ครั้งล่าสุดเป็นเวลาปัจจุบัน คุณอาจต้องคลิกรีเฟรช
หน้า Cloud Scheduler จะยืนยันเพียงว่างานเรียกใช้ฟังก์ชัน Cloud ของคุณ เปิดหน้า Cloud Function เพื่อดูบันทึกของฟังก์ชัน
ดูบันทึก Cloud Function
หากต้องการดูว่า Cloud Functions เริ่มการดำเนินการส่งออกสำเร็จหรือไม่ ให้เปิดบันทึกของฟังก์ชันโดยทำดังนี้
คอนโซล Firebase
ไปที่หน้า Cloud Functions ในคอนโซล Firebase
คอนโซล GCP
ไปที่หน้า Cloud Functions ในคอนโซล Google Cloud
ดูความคืบหน้าในการส่งออก
คุณสามารถใช้คำสั่ง gcloud firestore operations list
เพื่อดูความคืบหน้าของการดำเนินการส่งออก โปรดดูการจัดการการดำเนินการส่งออกและนำเข้า
หลังจากการดำเนินการส่งออกเสร็จสมบูรณ์แล้ว คุณสามารถดูไฟล์เอาต์พุตในที่เก็บข้อมูล Cloud Storage ได้โดยทำดังนี้