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

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

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

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

  1. เปิดใช้ การเรียกเก็บเงินสำหรับโปรเจ็กต์ Google Cloud เฉพาะGoogle Cloud โปรเจ็กต์ที่เปิดใช้การเรียกเก็บเงินเท่านั้นที่ใช้ฟีเจอร์การส่งออกและนำเข้าได้
  2. การดำเนินการส่งออกต้องใช้ Bucket 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 เพื่อติดตั้งการขึ้นต่อกัน
  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 ด้วยรหัสโปรเจ็กต์
    • แก้ไข every 24 hours เพื่อตั้งค่ากำหนดเวลาการส่งออก ใช้ ไวยากรณ์ cron.yaml ของ AppEngine หรือ รูปแบบ 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) => {
      // Access the GCLOUD_PROJECT environment variable set by the runtime.
      const projectId =
        process.env.GOOGLE_CLOUD_PROJECT || process.env.GCLOUD_PROJECT;
      // Use the DATABASE_ID environment variable if set,
      // otherwise default to '(default)'
      const databaseId = process.env.DATABASE_ID || '(default)';
      const databaseName = client.databasePath(
        projectId,
        databaseId
      );
    
      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: [] เพื่อส่งออกเฉพาะกลุ่มคอลเล็กชันที่ระบุ เท่านั้น ปล่อยไว้ตามเดิมเพื่อส่งออกกลุ่มคอลเล็กชันทั้งหมด

    • (ไม่บังคับ) หากคุณใช้ฐานข้อมูลที่ไม่ใช่ค่าเริ่มต้น ให้ตรวจสอบว่าได้ตั้งค่า ตัวแปรสภาพแวดล้อม DATABASE_ID เมื่อสร้าง Cloud Function หากคุณใช้รันไทม์ที่ไม่ได้ตั้งค่า GOOGLE_CLOUD_PROJECT โดยอัตโนมัติ คุณอาจต้องตั้งค่าด้วยตนเองหรือแทนที่ด้วยรหัสโปรเจ็กต์ ในโค้ด

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

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

จากนั้นให้สิทธิ์ Cloud Function ในการเริ่มการส่งออก และเขียนไปยัง Bucket ของ GCS

ฟังก์ชัน Cloud Run นี้ใช้บัญชีบริการเพื่อตรวจสอบสิทธิ์และ ให้สิทธิ์การดำเนินการส่งออก บัญชีบริการที่ใช้จะขึ้นอยู่กับ Cloud Functionsการกำหนดค่าของคุณ ดังนี้

  • Cloud Functions (รุ่นที่ 1): ใช้บัญชีบริการApp Engineเริ่มต้น ดังนี้ PROJECT_ID@appspot.gserviceaccount.com
  • Cloud Functions (รุ่นที่ 2): ใช้Compute Engine บัญชีบริการPROJECT_NUMBER-compute@developer.gserviceaccount.comเริ่มต้น

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

  • Cloud Datastore Import Export Admin
  • บทบาท Storage Admin ใน Bucket
  • Cloud Run Invoker (ต้องระบุสำหรับ Cloud Functions (รุ่นที่ 2) เพื่ออนุญาตให้บริการทริกเกอร์เรียกใช้ ฟังก์ชัน)

คุณใช้เครื่องมือบรรทัดคำสั่ง gcloud และ gsutil เพื่อมอบหมายบทบาทเหล่านี้ได้

หากยังไม่ได้ติดตั้ง คุณสามารถเข้าถึงเครื่องมือเหล่านี้ได้จาก Cloud Shell ในคอนโซล Google Cloud
เริ่ม Cloud Shell

  1. มอบหมายบทบาทผู้ดูแลระบบการนำเข้าส่งออกของ Cloud Datastore แทนที่ PROJECT_ID และ SERVICE_ACCOUNT (เช่น PROJECT_ID@appspot.gserviceaccount.com หรือ PROJECT_NUMBER-compute@developer.gserviceaccount.com) แล้วเรียกใช้คำสั่งต่อไปนี้

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member serviceAccount:SERVICE_ACCOUNT \
        --role roles/datastore.importExportAdmin
  2. มอบหมายบทบาทผู้ดูแลระบบพื้นที่เก็บข้อมูลใน Bucket แทนที่ SERVICE_ACCOUNT และ BUCKET_NAME แล้วเรียกใช้ คำสั่งต่อไปนี้

    gsutil iam ch serviceAccount:SERVICE_ACCOUNT:admin \
        gs://BUCKET_NAME
  3. (สำหรับ Cloud Functions (รุ่นที่ 2)) มอบหมายบทบาท Cloud Run ผู้เรียกใช้ให้กับบัญชีบริการ แทนที่ PROJECT_ID และ SERVICE_ACCOUNT แล้วเรียกใช้ คำสั่งต่อไปนี้

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member serviceAccount:SERVICE_ACCOUNT \
        --role roles/run.invoker

หากปิดใช้หรือลบบัญชีบริการเริ่มต้น 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งานใหม่ ให้คลิกเรียกใช้ตอนนี้

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

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

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

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

คอนโซล Firebase

ในคอนโซล Firebase ให้ไปที่ Hosting และ Serverless > ฟังก์ชัน

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

คอนโซล GCP

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

ไปที่เครื่องมือดูบันทึก

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

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

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

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