หน้านี้อธิบายวิธีตั้งเวลาการส่งออกCloud Firestoreข้อมูล Cloud Firestore หากต้องการเรียกใช้การส่งออกตามกำหนดเวลา เราขอแนะนำให้ใช้ Cloud Functions และ Cloud Scheduler
ก่อนเริ่มต้น
ก่อนกำหนดเวลาการส่งออกข้อมูลที่มีการจัดการ คุณต้องดำเนินงานต่อไปนี้ให้เสร็จสมบูรณ์
- เปิดใช้ การเรียกเก็บเงินสำหรับโปรเจ็กต์ Google Cloud เฉพาะGoogle Cloud โปรเจ็กต์ที่เปิดใช้การเรียกเก็บเงินเท่านั้นที่ใช้ฟีเจอร์ส่งออกและนำเข้าได้
- การดำเนินการส่งออกต้องมี Bucket ปลายทาง Cloud Storage สร้าง Cloud Storageที่เก็บข้อมูลในตำแหน่งที่อยู่ใกล้ ตำแหน่งฐานข้อมูลCloud Firestore คุณใช้ที่เก็บข้อมูลที่ต้องชำระเงินโดยผู้ขอสำหรับการส่งออก ไม่ได้
สร้าง Cloud Function และงาน Cloud Scheduler
ทําตามขั้นตอนด้านล่างเพื่อสร้าง Cloud Function ของ Node.js ที่ เริ่มต้นCloud Firestoreการส่งออกข้อมูลและงาน Cloud Scheduler เพื่อเรียกใช้ฟังก์ชันดังกล่าว
Firebase CLI
-
ติดตั้ง Firebase CLI ในไดเรกทอรีใหม่ ให้เริ่มต้น CLI สำหรับ Cloud Functions:
firebase init functions --project PROJECT_ID
- เลือก JavaScript สำหรับภาษา
- เปิดใช้ ESLint (ไม่บังคับ)
- ป้อน
yเพื่อติดตั้งทรัพยากร Dependency
-
แทนที่โค้ดในไฟล์
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เพื่อตั้งค่ากำหนดเวลาการส่งออก ใช้ ไวยากรณ์ cron.yaml ของ AppEngine หรือ รูปแบบ unix-cron (* * * * *) -
แก้ไข
collectionIds: []เพื่อส่งออกเฉพาะกลุ่มคอลเล็กชันที่ระบุ เท่านั้น ปล่อยไว้ตามเดิมเพื่อส่งออกกลุ่มคอลเล็กชันทั้งหมด
- แทนที่
-
ทำให้ฟังก์ชันที่กำหนดเวลาไว้ใช้งานได้
firebase deploy --only functions
คอนโซล Google Cloud
สร้างฟังก์ชันระบบคลาวด์
-
ไปที่หน้า Cloud Functions ในคอนโซล Google Cloud
- คลิกเขียนฟังก์ชัน
- ป้อนชื่อฟังก์ชัน เช่น
firestore-export - ในส่วนทริกเกอร์ ให้เลือก 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( YOUR_PROJECT_ID, '(default)' ); 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: []เพื่อส่งออกเฉพาะกลุ่มคอลเล็กชันที่ระบุ เท่านั้น ปล่อยไว้ตามเดิมเพื่อส่งออกกลุ่มคอลเล็กชันทั้งหมด
- แทนที่
- เพิ่มทรัพยากร Dependency ต่อไปนี้ในส่วน
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 ในช่องหัวข้อ
ให้ป้อนชื่อหัวข้อ Pub/Sub ที่คุณกำหนดไว้ข้าง
Cloud Function
initiateFirestoreExportในตัวอย่าง ด้านบน - ในช่องเพย์โหลด ให้ป้อน
start exportงานต้องมีเพย์โหลดที่กำหนด แต่ Cloud Function ด้านบนไม่ได้ใช้ค่านี้จริงๆ - คลิกสร้าง
กำหนดค่าสิทธิ์การเข้าถึง
จากนั้นให้สิทธิ์ Cloud Function ในการเริ่มการส่งออก และการเขียนไปยัง Bucket ของ 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
-
มอบหมายบทบาทผู้ดูแลระบบพื้นที่เก็บข้อมูลใน Bucket แทนที่ 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 Function ของคุณเท่านั้น เปิดหน้า Cloud Function เพื่อดูบันทึกของฟังก์ชัน
ดูบันทึกของ Cloud Function
หากต้องการดูว่า Cloud Function เริ่มการดำเนินการส่งออกสำเร็จหรือไม่ ให้ เปิดบันทึกของฟังก์ชัน
คอนโซล Firebase
ในคอนโซล Firebase ให้ไปที่ Hosting และ Serverless > ฟังก์ชัน
คอนโซล GCP
ไปที่หน้า Cloud Functions ในคอนโซล Google Cloud
ดูความคืบหน้าในการส่งออก
คุณใช้คำสั่ง gcloud firestore operations list เพื่อดูความคืบหน้าของการดำเนินการส่งออกได้ โปรดดูการจัดการการดำเนินการส่งออกและนำเข้า
หลังจากดำเนินการส่งออกเสร็จแล้ว คุณจะดูไฟล์เอาต์พุตใน Cloud Storage บัคเก็ตได้โดยทำดังนี้