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

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

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

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

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

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

ทําตามขั้นตอนด้านล่างเพื่อสร้าง Cloud Functions ของ 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 ด้วยชื่อบัคเก็ตของคุณ
    • แทนที่ YOUR_PROJECT_ID ด้วยรหัสโปรเจ็กต์ ของคุณ
    • แก้ไข every 24 hours เพื่อตั้งค่ากำหนดเวลาการส่งออก ใช้ ไวยากรณ์ cron.yaml ของ App Engine หรือ รูปแบบ unix-cron (* * * * *)
    • แก้ไข collectionIds: [] เพื่อส่งออกเฉพาะกลุ่มคอลเล็กชันที่ระบุ เท่านั้น ปล่อยให้เป็นอย่างนั้นเพื่อส่งออกกลุ่มคอลเลกชันทั้งหมด

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

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

    ไปที่ Cloud Functions

  2. คลิกเขียนฟังก์ชัน
  3. ป้อนชื่อฟังก์ชัน เช่น firestore-export
  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(
        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 ด้วยชื่อบัคเก็ตของคุณ
    • แก้ไข collectionIds: [] เพื่อส่งออกเฉพาะกลุ่มคอลเลกชันที่ระบุเท่านั้น ปล่อยให้เป็นอย่างนั้นเพื่อส่งออกกลุ่มคอลเลกชันทั้งหมด

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

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

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

    ไปที่ Cloud Scheduler

  2. คลิกสร้างงาน
  3. ป้อนชื่อสำหรับงาน เช่น scheduledFirestoreExport
  4. ป้อนความถี่ เช่น every 24 hours
  5. เลือกเขตเวลา
  6. ภายใต้เป้าหมาย เลือกเผยแพร่/เผยแพร่ ในช่องหัวข้อ ให้ป้อนชื่อหัวข้อ pub/sub ที่คุณกำหนดไว้ควบคู่ไปกับ Cloud Function ของคุณ initiateFirestoreExport ในตัวอย่างด้านบน
  7. ในช่อง Payload ให้ป้อน start export งานต้องมีเพย์โหลดที่กำหนดไว้ แต่ Cloud Function ด้านบนไม่ได้ใช้ค่านี้จริงๆ
  8. คลิกสร้าง
ตอนนี้คุณได้ติดตั้งใช้งาน Cloud Function และงาน Cloud Scheduler แล้ว แต่ Cloud Function ยังคงต้องมีสิทธิ์เข้าถึงเพื่อดำเนินการ ส่งออก

กำหนดค่าสิทธิ์การเข้าถึง

จากนั้นให้สิทธิ์ Cloud Functions ในการเริ่มการส่งออก และการเขียนไปยังที่เก็บข้อมูล 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 แอปของคุณจะเสียสิทธิ์เข้าถึงฐานข้อมูล Cloud FirestoreApp Engine หากปิดใช้บัญชีบริการ App Engine คุณจะเปิดใช้บัญชีอีกครั้งได้ ดูการเปิดใช้บัญชีบริการ หากคุณลบบัญชีบริการ App Engine ภายใน 30 วันที่ผ่านมา คุณสามารถกู้คืนบัญชีบริการได้ โปรดดูการยกเลิกการลบบัญชีบริการ

ทดสอบงาน Cloud Scheduler และ Cloud Function

คุณสามารถทดสอบงาน Cloud Scheduler ของคุณได้ในหน้า Cloud Scheduler ของคอนโซล Google Cloud

  1. ไปที่หน้า Cloud Scheduler ใน Google Cloud Console
    ไปที่ Cloud Scheduler

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

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

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

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

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

คอนโซล Firebase

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

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

คอนโซล GCP

ไปที่หน้า Cloud Functions ใน Google Cloud Console

ไปที่ตัวดูบันทึก

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

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

หลังจากการดำเนินการส่งออกเสร็จสมบูรณ์ คุณสามารถดูไฟล์เอาต์พุตในบัคเก็ต Cloud Storage ของคุณได้:

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