กำหนดเวลาการส่งออกข้อมูล

หน้านี้จะอธิบายวิธีตั้งเวลาการส่งออกข้อมูลCloud Firestore หากต้องการเรียกใช้การส่งออกตามกำหนดการ เราขอแนะนำให้ใช้ Cloud Functions และ Cloud Scheduler

ก่อนเริ่มต้น

ก่อนกำหนดเวลาการส่งออกข้อมูลที่จัดการ คุณต้องทํางานต่อไปนี้ให้เสร็จสมบูรณ์

  1. เปิดใช้การเรียกเก็บเงินสำหรับโปรเจ็กต์ Google Cloud เฉพาะGoogle Cloudโครงการที่เปิดใช้การเรียกเก็บเงินเท่านั้นที่ใช้ฟีเจอร์การส่งออกและนําเข้าได้
  2. การดำเนินการส่งออกต้องใช้ที่เก็บข้อมูล Cloud Storage ปลายทาง สร้างที่เก็บข้อมูล Cloud Storage ในตำแหน่งที่อยู่ใกล้ตำแหน่งฐานข้อมูล Cloud Firestore คุณใช้ที่เก็บข้อมูลแบบผู้ขอชำระเงินสำหรับการดำเนินการส่งออกไม่ได้

สร้าง Cloud Function และงาน Cloud Scheduler

ทําตามขั้นตอนด้านล่างเพื่อสร้างฟังก์ชัน Node.js Cloud ที่เริ่มการส่งออกข้อมูล Cloud Firestore และงาน Cloud Scheduler เพื่อเรียกใช้ฟังก์ชันนั้น

Firebase CLI
  1. ติดตั้ง Firebase CLI ในไดเรกทอรีใหม่ ให้เริ่มต้น CLI สําหรับ Cloud Functions ดังนี้

    firebase init functions --project PROJECT_ID
    1. เลือก JavaScript สำหรับภาษา
    2. เปิดใช้ ESLint (ไม่บังคับ)
    3. ป้อน y เพื่อติดตั้งการอ้างอิง
  2. แทนที่โค้ดในไฟล์ 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');
      });
    });
  3. แก้ไขข้อมูลต่อไปนี้ในโค้ดด้านบน
    • แทนที่ BUCKET_NAME ด้วยชื่อที่เก็บข้อมูล
    • แก้ไข every 24 hours เพื่อกำหนดกำหนดเวลาการส่งออก ใช้ไวยากรณ์ cron.yaml ของ AppEngine หรือ รูปแบบ unix-cron (* * * * *)
    • แก้ไข collectionIds: [] เพื่อส่งออกเฉพาะกลุ่มคอลเล็กชันที่ระบุ ปล่อยไว้เพื่อส่งออกคอลเล็กชันทั้งหมด

  4. ทำให้ฟังก์ชันที่กำหนดเวลาไว้ใช้งานได้

    firebase deploy --only functions
คอนโซล Google Cloud
สร้างฟังก์ชันระบบคลาวด์
  1. ไปที่หน้า Cloud Functions ในคอนโซล Google Cloud

    ไปที่ Cloud Functions

  2. คลิกสร้างฟังก์ชัน
  3. ป้อนชื่อฟังก์ชัน เช่น firestoreExport
  4. ในส่วนทริกเกอร์ ให้เลือก Cloud Pub/Sub
  5. เลือกสร้างหัวข้อใหม่ในส่วนหัวข้อ ป้อนชื่อหัวข้อ Pub/Sub เช่น initiateFirestoreExport จดชื่อหัวข้อไว้เนื่องจากคุณต้องใช้เพื่อสร้างงาน Cloud Scheduler
  6. ในส่วนซอร์สโค้ด ให้เลือกเครื่องมือแก้ไขในบรรทัด ป้อนโค้ดต่อไปนี้ในส่วน 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: [] เพื่อส่งออกเฉพาะกลุ่มคอลเล็กชันที่ระบุ ปล่อยไว้เพื่อส่งออกคอลเล็กชันทั้งหมด

  7. ในส่วน package.json ให้เพิ่มข้อกําหนดต่อไปนี้
    {
      "dependencies": {
        "@google-cloud/firestore": "^1.3.0"
      }
    }
  8. ในส่วนฟังก์ชันที่จะเรียกใช้ ให้ป้อน scheduledFirestoreExport ซึ่งเป็นชื่อฟังก์ชันใน index.js
  9. คลิกสร้างเพื่อทำให้ Cloud Function ใช้งานได้
สร้างงาน Cloud Scheduler

ถัดไป ให้สร้างงาน Cloud Scheduler ที่เรียกใช้ Cloud Function โดยทำดังนี้

  1. ไปที่หน้า Cloud Scheduler ในคอนโซล Google Cloud

    ไปที่ Cloud Scheduler

  2. คลิกสร้างงาน
  3. ป้อนชื่องาน เช่น scheduledFirestoreExport
  4. ป้อนความถี่ เช่น every 24 hours
  5. เลือกเขตเวลา
  6. เลือก Pub/Sub ในส่วนเป้าหมาย ในช่อง Topic ให้ป้อนชื่อหัวข้อ pub/sub ที่คุณกำหนดไว้พร้อมกับ Cloud Function initiateFirestoreExport ในตัวอย่างด้านบน
  7. ป้อน start export ในช่อง Payload งานกำหนดให้มีการกำหนดเพย์โหลด แต่ Cloud Function ด้านบนไม่ได้ใช้ค่านี้
  8. คลิกสร้าง
ตอนนี้คุณได้ติดตั้งใช้งาน Cloud Function และงาน Cloud Scheduler แล้ว แต่ 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

  1. มอบหมายบทบาทผู้ดูแลระบบการนำเข้าและส่งออกของ Cloud Datastore แทนที่ PROJECT_ID แล้วเรียกใช้คําสั่งต่อไปนี้

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member serviceAccount:PROJECT_ID@appspot.gserviceaccount.com \
        --role roles/datastore.importExportAdmin
    

  2. มอบหมายบทบาทผู้ดูแลระบบพื้นที่เก็บข้อมูลในที่เก็บข้อมูล แทนที่ 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

  1. ไปที่หน้า Cloud Scheduler ในคอนโซล Google Cloud
    ไปที่ Cloud Scheduler

  2. ในแถวของงาน 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 ได้โดยทำดังนี้

เปิดเบราว์เซอร์ Cloud Storage