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

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

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

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

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

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

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

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

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

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

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

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

ขั้นตอนต่อไป ให้สร้างงาน Cloud Scheduler ที่เรียกใช้ Cloud Function

  1. ไปที่หน้า Cloud Scheduler ในคอนโซล GCP แล้วดำเนินการดังนี้

    ไปที่ Cloud Scheduler

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

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

  2. คลิกเรียกใช้ตอนนี้ในแถวงาน Cloud Scheduler ใหม่

    หลังจากผ่านไป 2-3 วินาที งาน Cloud Scheduler จะอัปเดตคอลัมน์ผลลัพธ์เป็นสำเร็จและการเรียกใช้ครั้งสุดท้าย เป็นเวลาปัจจุบัน คุณอาจต้องคลิกรีเฟรช

หน้า Cloud Scheduler จะยืนยันเพียงว่างานดังกล่าวเรียกใช้ Cloud Function เท่านั้น เปิดหน้า Cloud Function เพื่อดูบันทึกของฟังก์ชัน

ดูบันทึกของ Cloud Function

หากต้องการดูว่า Cloud Function เริ่มการดำเนินการส่งออกสำเร็จหรือไม่ ให้เปิดบันทึกของฟังก์ชันโดยทำดังนี้

คอนโซล Firebase

ไปที่หน้าฟังก์ชันระบบคลาวด์ในคอนโซล Firebase

ไปที่บันทึกฟังก์ชัน

คอนโซล GCP

ไปที่หน้า Cloud Functions ในคอนโซล GCP

ไปที่ผู้ดูบันทึก

ดูความคืบหน้าของการส่งออก

คุณใช้คำสั่ง gcloud firestore operations list เพื่อดูความคืบหน้าของการดำเนินการส่งออกได้ โปรดดูการจัดการการดำเนินการส่งออกและนำเข้า

หลังจากการดำเนินการส่งออกเสร็จสิ้นแล้ว คุณจะดูไฟล์เอาต์พุตในที่เก็บข้อมูล Cloud Storage ได้ โดยทำดังนี้

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