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

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

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

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

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

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

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

Firebase CLI
  1. ติดตั้ง Firebase CLI ในไดเรกทอรีใหม่ ให้เริ่มต้น CLI สำหรับ ฟังก์ชันระบบคลาวด์:

    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 เพื่อตั้งเวลาการส่งออก ใช้อย่างใดอย่างหนึ่ง ไวยากรณ์ cron.yaml ของ AppEngine หรือแท็ก รูปแบบ 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 ใช้งานได้แล้ว แต่ 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