Veri dışa aktarma işlemlerini planlayın

Bu sayfada, Cloud Firestore verilerinizin dışa aktarma işlemlerini nasıl planlayacağınız açıklanmaktadır. Dışa aktarma işlemlerini planlı bir şekilde çalıştırmak için Cloud Functions ve Cloud Scheduler kullanmanızı öneririz.

Başlamadan önce

Yönetilen veri dışa aktarma işlemlerini planlamadan önce aşağıdaki görevleri tamamlamanız gerekir:

  1. Google Cloud projeniz için faturalandırmayı etkinleştirin. Yalnızca faturalandırmanın etkin olduğu projeler dışa ve içe aktarma özelliğini kullanabilir.Google Cloud
  2. Dışa aktarma işlemleri için hedef Cloud Storage paketi gerekir. Cloud Firestore veritabanı konumunuza yakın bir konumda Cloud Storage paketi oluşturun. Dışa aktarma işlemleri için Ödeyen Tarafın İstek Sahibi Olduğu bir paket kullanamazsınız.

Cloud Functions işlevi ve Cloud Scheduler işi oluşturma

Cloud Firestore veri dışa aktarma işlemini başlatan bir Node.js Cloud Functions işlevi ve bu işlevi çağıracak bir Cloud Scheduler işi oluşturmak için aşağıdaki adımları uygulayın:

Firebase CLI
  1. Firebase CLI'yı yükleyin. Yeni bir dizinde Cloud Functions için CLI'yı başlatın:

    firebase init functions --project PROJECT_ID
    1. Dil için JavaScript'i seçin.
    2. İsteğe bağlı olarak ESLint'i etkinleştirin.
    3. Bağımlılıkları yüklemek için y komutunu girin.
  2. functions/index.js dosyasındaki kodu aşağıdakiyle değiştirin:

    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. Yukarıdaki kodda şunları değiştirin:
    • BUCKET_NAME ifadesini paketinizin adıyla değiştirin.
    • YOUR_PROJECT_ID yerine proje kimliğinizi yazın.
    • Dışa aktarma planınızı ayarlamak için every 24 hours dosyasını değiştirin. AppEngine cron.yaml söz dizimini veya unix-cron biçimini (* * * * *) kullanın.
    • Yalnızca belirtilen koleksiyon gruplarını dışa aktarmak için collectionIds: [] değerini değiştirin. Tüm koleksiyon gruplarını dışa aktarmak için olduğu gibi bırakın.

  4. Programlanmış işlevi dağıtın:

    firebase deploy --only functions
Google Cloud konsolu
Cloud Functions işlevi oluştur
  1. Google Cloud Console'da Cloud Functions sayfasına gidin:

    Cloud Functions'a git

  2. İşlev yaz'ı tıklayın.
  3. firestore-export gibi bir işlev adı girin
  4. Tetikleyici bölümünde Cloud Pub/Sub'ı seçin.
  5. Konu bölümünde Yeni konu oluştur'u seçin. Pub/Sub konusu için initiateFirestoreExport gibi bir ad girin. Cloud Scheduler işinizi oluşturmak için ihtiyacınız olacağından konu adını not edin.
  6. Kaynak kodu bölümünde Satır içi düzenleyici'yi seçin. index.js bölümüne aşağıdaki kodu girin:
    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);
        });
    };
    Yukarıdaki kodda şunları değiştirin:
    • BUCKET_NAME ifadesini paketinizin adıyla değiştirin.
    • Yalnızca belirtilen koleksiyon gruplarını dışa aktarmak için collectionIds: [] değerini değiştirin. Tüm koleksiyon gruplarını dışa aktarmak için olduğu gibi bırakın.

    • (İsteğe bağlı) Varsayılan olmayan bir veritabanı kullanıyorsanız Cloud Functions işlevini oluştururken DATABASE_ID ortam değişkenini ayarladığınızdan emin olun. GOOGLE_CLOUD_PROJECT değerinin otomatik olarak ayarlanmadığı bir çalışma zamanı kullanıyorsanız bu değeri manuel olarak ayarlamanız veya kodda proje kimliğinizle değiştirmeniz gerekebilir.

  7. package.json bölümüne aşağıdaki bağımlılığı ekleyin:
    {
      "dependencies": {
        "@google-cloud/firestore": "^1.3.0"
      }
    }
  8. Yürütülecek işlev bölümüne index.js içindeki işlevin adı olan scheduledFirestoreExport değerini girin.
  9. Cloud Functions işlevini dağıtmak için Create'i (Oluştur) tıklayın.
Cloud Scheduler işi oluşturma

Ardından, Cloud Functions işlevinizi çağıran bir Cloud Scheduler işi oluşturun:

  1. Google Cloud Console'da Cloud Scheduler sayfasına gidin:

    Cloud Scheduler sitesine gidin

  2. Create Job'u (İş Oluştur) tıklayın.
  3. İş için scheduledFirestoreExport gibi bir ad girin.
  4. Sıklık girin (ör. every 24 hours).
  5. Saat dilimi seçin.
  6. Target (Hedef) bölümünde Pub/Sub'ı seçin. Konu alanına, Cloud Functions işlevinizle birlikte tanımladığınız Pub/Sub konusunun adını girin. Önceki örnekte bu ad initiateFirestoreExport idi.
  7. Yük alanına start export değerini girin. İş için bir yük tanımlanması gerekir ancak önceki Cloud Functions işlevi bu değeri kullanmaz.
  8. Oluştur'u tıklayın.
Bu noktada Cloud Functions işlevinizi ve Cloud Scheduler işinizi dağıttınız ancak Cloud Functions işlevinizin dışa aktarma işlemlerini yürütmek için erişim izinlerine ihtiyacı var.

Erişim izinlerini yapılandırma

Ardından, Cloud Functions işlevine dışa aktarma işlemlerini başlatma ve GCS paketinize yazma izni verin.

Bu Cloud Run işlevi, dışa aktarma işlemlerinin kimliğini doğrulamak ve yetkilendirmek için bir hizmet hesabı kullanır. Kullanılan hizmet hesabı, Cloud Functions yapılandırmanıza bağlıdır:

  • Cloud Functions (1. nesil): App Engine varsayılan hizmet hesabını kullanır: PROJECT_ID@appspot.gserviceaccount.com
  • Cloud Functions (2. nesil): Varsayılan Compute Engine hizmet hesabını kullanır: PROJECT_NUMBER-compute@developer.gserviceaccount.com

Bu hizmet hesabının, dışa aktarma işlemi başlatmak ve Cloud Storage paketinize yazmak için izne ihtiyacı vardır. Bu izinleri vermek için hizmet hesabına aşağıdaki IAM rollerini atayın:

  • Cloud Datastore Import Export Admin
  • Pakette Storage Admin rolü
  • Cloud Run Invoker (Tetikleyici hizmetin işlevi çağırmasına izin vermek için Cloud Functions (2. nesil) için gereklidir)

Bu rolleri atamak için gcloud ve gsutil komut satırı araçlarını kullanabilirsiniz.

Henüz yüklenmemişse bu araçlara Google Cloud Console'daki Cloud Shell bölümünden erişebilirsiniz:
Başlat Cloud Shell

  1. Cloud Datastore İçe/Dışa Aktarma Yöneticisi rolünü atayın. PROJECT_ID ve SERVICE_ACCOUNT değerlerini (ör. PROJECT_ID@appspot.gserviceaccount.com veya PROJECT_NUMBER-compute@developer.gserviceaccount.com) değiştirin ve aşağıdaki komutu çalıştırın:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member serviceAccount:SERVICE_ACCOUNT \
        --role roles/datastore.importExportAdmin
  2. Paketinize Depolama Alanı Yöneticisi rolünü atayın. SERVICE_ACCOUNT ve BUCKET_NAME değerlerini değiştirip aşağıdaki komutu çalıştırın:

    gsutil iam ch serviceAccount:SERVICE_ACCOUNT:admin \
        gs://BUCKET_NAME
  3. (Cloud Functions (2. nesil) için) Hizmet hesabına Cloud Run Çağırıcı rolünü atayın. PROJECT_ID ve SERVICE_ACCOUNT değerlerini değiştirip aşağıdaki komutu çalıştırın:

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

App Engine varsayılan hizmet hesabınızı devre dışı bırakır veya silerseniz App Engine uygulamanız, Cloud Firestore veritabanınıza erişimi kaybeder. App Engine hizmet hesabınızı devre dışı bıraktıysanız yeniden etkinleştirebilirsiniz. Hizmet hesabını etkinleştirme başlıklı makaleyi inceleyin. App Engine hizmet hesabınızı son 30 gün içinde sildiyseniz hizmet hesabınızı geri yükleyebilirsiniz. Hizmet hesabını silme işlemini geri alma başlıklı makaleyi inceleyin.

Cloud Scheduler işinizi ve Cloud Functions işlevinizi test etme

Cloud Scheduler işinizi Google Cloud Console'un Cloud Scheduler sayfasında test edebilirsiniz.

  1. Google Cloud Console'da Cloud Scheduler sayfasına gidin.
    Cloud Scheduler sayfasına gidin

  2. Yeni Cloud Scheduler işinizin satırında Şimdi çalıştır'ı tıklayın.

    Birkaç saniye sonra Cloud Scheduler işi, sonuç sütununu Başarılı, Son çalıştırma sütununu ise geçerli saat olarak günceller. Yenile'yi tıklamanız gerekebilir.

Cloud Scheduler sayfası yalnızca işin Cloud Functions işlevinizi çağırdığını onaylar. İşlevinizin günlüklerini görmek için Cloud Functions sayfasını açın.

Cloud Functions işlevi günlüklerini görüntüleme

Cloud Functions işlevinin bir dışa aktarma işlemini başarıyla başlatıp başlatmadığını görmek için işlevin günlüklerini açın:

Firebase konsolu

Firebase konsolunda Hosting & Serverless (Barındırma ve Sunucusuz) > Functions'a (İşlevler) gidin.

İşlev Günlükleri'ne gidin

GCP Console

Google Cloud Console'da Cloud Functions sayfasına gidin.

Günlük Görüntüleyici'ye git

Dışa aktarma işleminin ilerleme durumunu görüntüleme

Dışa aktarma işlemlerinizin ilerleme durumunu görüntülemek için gcloud firestore operations list komutunu kullanabilirsiniz. Dışa ve içe aktarma işlemlerini yönetme başlıklı makaleyi inceleyin.

Dışa aktarma işlemi tamamlandıktan sonra çıkış dosyalarını Cloud Storage paketinizde görüntüleyebilirsiniz:

Cloud Storage tarayıcısını açın