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

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

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

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

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

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

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

    firebase deploy --only functions
คอนโซล Google Cloud
สร้าง Cloud Function
  1. ไปที่หน้า Cloud Functions ในคอนโซล Google Cloud

    ไปที่ 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 ด้วยชื่อ Bucket
    • แก้ไข 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 ในคอนโซล Google Cloud

    ไปที่ 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 ในการเริ่มการดำเนินการส่งออกและเขียนลงใน Bucket ของ GCS

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

PROJECT_ID@appspot.gserviceaccount.com

บัญชีบริการนี้ต้องมีสิทธิ์เริ่มการดำเนินการส่งออก และเขียนลงใน Bucket ของคุณ Cloud Storage หากต้องการให้สิทธิ์เหล่านี้ ให้กำหนดบทบาท IAM ต่อไปนี้ให้กับบัญชีบริการเริ่มต้น

  • Cloud Datastore Import Export Admin
  • Owner หรือ Storage Admin บทบาทใน Bucket

คุณสามารถใช้เครื่องมือบรรทัดคำสั่ง 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. กำหนดบทบาทผู้ดูแลระบบ Storage ใน 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

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

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

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

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

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

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

คอนโซล Firebase

ในคอนโซล Firebase ให้ไปที่โฮสติ้งและแบบไม่มีเซิร์ฟเวอร์ > ฟังก์ชัน

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

คอนโซล GCP

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

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

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

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

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

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