Menjadwalkan ekspor data

Halaman ini menjelaskan cara menjadwalkan ekspor data Cloud Firestore Anda. Untuk menjalankan ekspor berjadwal, sebaiknya gunakan Cloud Functions dan Cloud Scheduler.

Sebelum memulai

Sebelum menjadwalkan ekspor data terkelola, Anda harus menyelesaikan tugas-tugas berikut:

  1. Aktifkan penagihan untuk project Google Cloud Anda. Hanya project Google Cloud dengan penagihan aktif yang dapat menggunakan fitur ekspor dan impor.
  2. Operasi ekspor memerlukan bucket Cloud Storage tujuan. Buat bucket Cloud Storage di lokasi dekat lokasi database Cloud Firestore. Anda tidak dapat menggunakan bucket Requester Pays untuk operasi ekspor.

Membuat Cloud Function dan tugas Cloud Scheduler

Ikuti langkah-langkah di bawah ini untuk membuat Cloud Function Node.js yang memulai ekspor data Cloud Firestore dan tugas Cloud Scheduler untuk memanggil fungsi tersebut:

Firebase CLI
  1. Instal Firebase CLI. Di direktori baru, inisialisasi CLI untuk Cloud Functions:

    firebase init functions --project PROJECT_ID
    1. Pilih JavaScript untuk bahasa.
    2. Jika ingin, aktifkan ESLint.
    3. Masukkan y untuk menginstal dependensi.
  2. Ganti kode dalam file functions/index.js dengan yang berikut ini:

    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. Dalam kode di atas, ubah hal berikut ini:
    • Ganti BUCKET_NAME dengan nama bucket Anda.
    • Ubah every 24 hours untuk mengatur jadwal ekspor Anda. Gunakan sintaksis AppEngine cron.yaml atau format unix-cron (* * * * *).
    • Ubah collectionIds: [] untuk mengekspor grup koleksi yang ditentukan saja. Biarkan apa adanya untuk mengekspor semua koleksi.

  4. Deploy fungsi yang dijadwalkan:

    firebase deploy --only functions
GCP Console
Membuat Cloud Function
  1. Buka halaman Cloud Functions di GCP Console:

    Buka Cloud Functions

  2. Klik Create Function
  3. Masukkan nama fungsi seperti firestoreExport
  4. Pada Trigger, pilih Cloud Pub/Sub
  5. Pada Topic, pilih Create new Topic. Masukkan nama untuk topik pub/sub, seperti initiateFirestoreExport. Catat nama topik karena Anda membutuhkannya untuk membuat tugas Cloud Scheduler.
  6. Pada Source code, pilih Inline editor. Masukkan kode berikut di bagian 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);
        });
    };
    Pada kode di atas, ubah kode berikut:
    • Ganti BUCKET_NAME dengan nama bucket Anda.
    • Ubah collectionIds: [] untuk mengekspor grup koleksi yang ditentukan saja. Biarkan apa adanya untuk mengekspor semua koleksi.

  7. Di bagian package.json, tambahkan dependensi berikut:
    {
      "dependencies": {
        "@google-cloud/firestore": "^1.3.0"
      }
    }
  8. Di bagian Function to execute, masukkan scheduledFirestoreExport, nama fungsi dalam index.js.
  9. Klik Create untuk men-deploy Cloud Function.
Membuat tugas Cloud Scheduler

Selanjutnya, buat tugas Cloud Scheduler yang memanggil Cloud Function Anda:

  1. Buka halaman Cloud Scheduler di GCP Console:

    Buka Cloud Scheduler

  2. Klik Create Job.
  3. Masukkan nama di kolom Name untuk tugas seperti scheduledFirestoreExport.
  4. Masukkan frekuensi waktu di kolom Frequency, misalnya every 24 hours.
  5. Pilih zona waktu di Timezone.
  6. Pada Target, pilih Pub/Sub. Pada kolom Topic, masukkan nama topik pub/sub yang Anda tetapkan di Cloud Function, initiateFirestoreExport dalam contoh di atas.
  7. Pada kolom Payload, masukkan start export. Tugas membutuhkan penentuan payload, tetapi Cloud Function di atas tidak benar-benar menggunakan nilai ini.
  8. Klik Create.
Pada tahap ini, Anda telah men-deploy Cloud Function dan tugas Cloud Scheduler, tetapi Cloud Function masih memerlukan izin akses untuk menjalankan operasi ekspor.

Mengonfigurasi izin akses

Selanjutnya, beri izin Cloud Function untuk memulai operasi ekspor dan menulis ke bucket GCS Anda.

Cloud Function ini menggunakan akun layanan default project Anda untuk mengautentikasi dan mengizinkan operasi ekspornya. Saat Anda membuat project, akun layanan default dibuat dengan nama berikut:

PROJECT_ID@appspot.gserviceaccount.com

Akun layanan ini memerlukan izin untuk memulai operasi ekspor dan menulis ke bucket Cloud Storage Anda. Untuk memberikan izin ini, tetapkan peran IAM berikut ke akun layanan default:

  • Cloud Datastore Import Export Admin
  • Peran Owner atau Storage Admin di bucket

Anda dapat menggunakan alat command line gcloud dan gsutil untuk menetapkan peran ini.

Jika belum diinstal, alat ini dapat diakses dari Cloud Shell di Google Cloud Platform Console:
Mulai Cloud Shell

  1. Tetapkan peran Cloud Datastore Import Export Admin. Ganti PROJECT_ID, dan jalankan perintah berikut:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member serviceAccount:PROJECT_ID@appspot.gserviceaccount.com \
        --role roles/datastore.importExportAdmin
    

  2. Tetapkan peran Storage Admin pada bucket Anda. Ganti PROJECT_ID dan BUCKET_NAME, dan jalankan perintah berikut:

    gsutil iam ch serviceAccount:PROJECT_ID@appspot.gserviceaccount.com:admin \
        gs://BUCKET_NAME
    

Jika Anda menonaktifkan atau menghapus akun layanan default App Engine, aplikasi App Engine akan kehilangan akses ke database Cloud Firestore Anda. Jika telah menonaktifkan akun layanan App Engine, Anda dapat mengaktifkannya kembali. Lihat mengaktifkan akun layanan. Jika telah menghapus akun layanan App Engine dalam 30 hari terakhir, Anda dapat memulihkannya. Lihat membatalkan penghapusan akun layanan.

Menguji tugas Cloud Scheduler dan Cloud Function

Anda dapat menguji tugas Cloud Scheduler di halaman Cloud Scheduler di Google Cloud Platform Console.

  1. Buka halaman Cloud Scheduler di GCP Console.
    Buka Cloud Scheduler

  2. Di baris untuk tugas Cloud Scheduler baru, klik Run now.

    Setelah beberapa detik, tugas Cloud Scheduler akan mengupdate kolom hasil menjadi Success dan mengupdate kolom Last run menjadi waktu saat ini. Anda mungkin perlu mengklik Refresh.

Halaman Cloud Scheduler hanya mengonfirmasi bahwa tugas tersebut memanggil Cloud Function Anda. Buka halaman Cloud Function untuk melihat log fungsi Anda.

Melihat log Cloud Function

Untuk melihat apakah Cloud Function berhasil memulai operasi ekspor, buka log fungsi:

Firebase Console

Buka halaman Cloud Functions di Firebase console.

Buka Function Logs

GCP Console

Buka halaman Cloud Functions di GCP Console.

Buka Logs Viewer

Melihat progres ekspor

Anda dapat menggunakan perintah gcloud firestore operations list untuk melihat progres operasi ekspor Anda. Lihat mengelola operasi ekspor dan impor.

Setelah operasi ekspor selesai, Anda dapat melihat file output-nya di bucket Cloud Storage:

Buka browser Cloud Storage