Planowanie eksportu danych

Na tej stronie dowiesz się, jak zaplanować eksport danych Cloud Firestore. Aby uruchamiać eksporty zgodnie z harmonogramem, zalecamy używanie Cloud Functions i Cloud Scheduler.

Zanim zaczniesz

Zanim zaplanujesz eksporty danych zarządzanych, musisz wykonać te czynności:

  1. Włącz płatności w projekcie Google Cloud. Funkcja eksportowania i importowania jest dostępna tylko w projektach Google Cloud z włączonymi płatnościami.
  2. Operacje eksportu wymagają zasobnika docelowego Cloud Storage. Utwórz zasobnik Cloud Storage w lokalizacji blisko lokalizacji bazy danych Cloud Firestore. Do operacji eksportu nie można używać zasobnika w trybie Żądający płaci.

Utwórz funkcję w Cloud Functions i zadanie Cloud Scheduler

Aby utworzyć funkcję w Cloud Functions w Node.js, która inicjuje eksport danych Cloud Firestore, oraz zadanie Cloud Scheduler, które wywołuje tę funkcję, wykonaj te czynności:

wiersz poleceń Firebase
  1. Zainstaluj interfejs wiersza poleceń Firebase. W nowym katalogu zainicjuj interfejs wiersza poleceń dla Cloud Functions:

    firebase init functions --project PROJECT_ID
    1. Wybierz język JavaScript.
    2. Opcjonalnie włącz ESLint.
    3. Wpisz y, aby zainstalować zależności.
  2. Zastąp kod w pliku functions/index.js tym kodem:

    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. W poprzednim kodzie zmodyfikuj te elementy:
    • Zastąp BUCKET_NAME nazwą zasobnika.
    • Zastąp YOUR_PROJECT_ID identyfikatorem projektu.
    • Zmodyfikuj every 24 hours, aby ustawić harmonogram eksportu. Użyj składni cron.yaml App Engine lub formatu unix-cron (* * * * *).
    • Zmodyfikuj collectionIds: [], aby wyeksportować tylko określone grupy kolekcji. Pozostaw bez zmian, aby wyeksportować wszystkie grupy kolekcji.

  4. Wdróż zaplanowaną funkcję:

    firebase deploy --only functions
Konsola Google Cloud
Utwórz funkcję w Cloud Functions
  1. W konsoli Google Cloud otwórz stronę Cloud Functions:

    Otwórz Cloud Functions

  2. Kliknij Napisz funkcję.
  3. Wpisz nazwę funkcji, np. firestore-export.
  4. W sekcji Aktywator wybierz Cloud Pub/Sub.
  5. W sekcji Temat wybierz Utwórz nowy temat. Wpisz nazwę tematu Pub/Sub, na przykład initiateFirestoreExport. Zanotuj nazwę tematu, ponieważ będzie Ci potrzebna do utworzenia zadania Cloud Scheduler.
  6. W sekcji Kod źródłowy wybierz Edytor wbudowany. Wpisz ten kod w sekcji 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);
        });
    };
    W poprzednim kodzie zmień te elementy:
    • Zastąp BUCKET_NAME nazwą zasobnika.
    • Zmodyfikuj collectionIds: [], aby wyeksportować tylko określone grupy kolekcji. Pozostaw bez zmian, aby wyeksportować wszystkie grupy kolekcji.

    • (Opcjonalnie) Jeśli używasz bazy danych innej niż domyślna, podczas tworzenia funkcji w Cloud Functions ustaw zmienną środowiskową DATABASE_ID. Jeśli używasz środowiska wykonawczego, w którym zmienna GOOGLE_CLOUD_PROJECT nie jest ustawiana automatycznie, może być konieczne ustawienie jej ręcznie lub zastąpienie jej w kodzie identyfikatorem projektu.

  7. W sekcji package.json dodaj tę zależność:
    {
      "dependencies": {
        "@google-cloud/firestore": "^1.3.0"
      }
    }
  8. W polu Funkcja do wykonania wpisz scheduledFirestoreExport, czyli nazwę funkcji w index.js.
  9. Kliknij Utwórz, aby wdrożyć funkcję w Cloud Functions.
Tworzenie zadania Cloud Scheduler

Następnie utwórz zadanie Cloud Scheduler, które wywołuje funkcję w Cloud Functions:

  1. W konsoli Google Cloud otwórz stronę Cloud Scheduler:

    Otwórz: Cloud Scheduler

  2. Kliknij Utwórz zadanie.
  3. Wpisz nazwę zadania, np. scheduledFirestoreExport.
  4. Wpisz Częstotliwość, na przykład every 24 hours.
  5. Wybierz strefę czasową.
  6. W sekcji Miejsce docelowe wybierz Pub/Sub. W polu Temat wpisz nazwę tematu Pub/Sub zdefiniowanego obok funkcji w Cloud Functions, czyli initiateFirestoreExport w poprzednim przykładzie.
  7. W polu Ładunek wpisz start export. Zadanie wymaga zdefiniowania ładunku, ale poprzednia funkcja w Cloud Functions nie używa tej wartości.
  8. Kliknij Utwórz.
W tym momencie masz już wdrożoną funkcję w Cloud Functions i zadanie Cloud Scheduler, ale funkcja w Cloud Functions nadal potrzebuje uprawnień dostępu do wykonywania operacji eksportu.

Konfigurowanie uprawnień dostępu

Następnie przyznaj funkcji w Cloud Functions uprawnienia do rozpoczynania operacji eksportu i zapisywania w zasobniku GCS.

Ta funkcja Cloud Run używa konta usługi do uwierzytelniania i autoryzowania operacji eksportu. Używane konto usługi zależy od konfiguracji Cloud Functions:

  • Cloud Functions (1 generacji): używa domyślnego konta usługi App Engine: PROJECT_ID@appspot.gserviceaccount.com
  • Cloud Functions (2 generacji): używa domyślnego konta usługi Compute Engine: PROJECT_NUMBER-compute@developer.gserviceaccount.com

To konto usługi wymaga uprawnień do rozpoczęcia operacji eksportu i zapisu w zasobniku Cloud Storage. Aby przyznać te uprawnienia, przypisz do konta usługi te role uprawnień:

  • Cloud Datastore Import Export Admin
  • rola Storage Admin w zasobniku,
  • Cloud Run Invoker (wymagane w przypadku Cloud Functions (2 generacji), aby umożliwić usłudze wywołującej wywołanie funkcji)

Do przypisania tych ról możesz użyć narzędzi wiersza poleceń gcloud i gsutil.

Jeśli nie masz jeszcze zainstalowanych tych narzędzi, możesz uzyskać do nich dostęp z poziomu Cloud Shell w konsoli Google Cloud:
Uruchom Cloud Shell

  1. Przypisz rolę Administrator eksportu i importu w Cloud Datastore. Zastąp PROJECT_ID i SERVICE_ACCOUNT (np. PROJECT_ID@appspot.gserviceaccount.com lub PROJECT_NUMBER-compute@developer.gserviceaccount.com) i uruchom to polecenie:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member serviceAccount:SERVICE_ACCOUNT \
        --role roles/datastore.importExportAdmin
  2. Przypisz rolę Administrator pamięci masowej do zasobnika. Zastąp SERVICE_ACCOUNT i BUCKET_NAME, a następnie uruchom to polecenie:

    gsutil iam ch serviceAccount:SERVICE_ACCOUNT:admin \
        gs://BUCKET_NAME
  3. (W przypadku Cloud Functions (2 generacji)) Przypisz do konta usługi rolę wywołującego Cloud Run. Zastąp PROJECT_ID i SERVICE_ACCOUNT, a następnie uruchom to polecenie:

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

Jeśli wyłączysz lub usuniesz domyślne konto usługi App Engine, aplikacja App Engine utraci dostęp do bazy danych Cloud Firestore. Jeśli konto usługi App Engine zostało wyłączone, możesz je ponownie włączyć. Zobacz Włączanie konta usługi. Jeśli konto usługi App Engine zostało usunięte w ciągu ostatnich 30 dni, możesz je przywrócić. Więcej informacji znajdziesz w artykule o przywracaniu konta usługi.

Testowanie zadania Cloud Scheduler i funkcji w Cloud Functions

Zadanie Cloud Scheduler możesz przetestować na stronie Cloud Scheduler w konsoli Google Cloud.

  1. Otwórz stronę Cloud Scheduler w konsoli Google Cloud.
    Otwórz Cloud Scheduler

  2. W wierszu nowego zadania Cloud Scheduler kliknij Uruchom teraz.

    Po kilku sekundach zadanie Cloud Scheduler powinno zaktualizować kolumnę wyniku na Sukces, a kolumnę Ostatnie uruchomienie na bieżącą godzinę. Konieczne może być kliknięcie przycisku Odśwież.

Strona Cloud Scheduler potwierdza tylko, że zadanie wywołało funkcję w Cloud Functions. Otwórz stronę funkcji w Cloud Functions, aby wyświetlić jej logi.

Wyświetlanie logów funkcji w Cloud Functions

Aby sprawdzić, czy funkcja w Cloud Functions pomyślnie rozpoczęła operację eksportu, otwórz logi funkcji:

Konsola Firebase

W konsoli Firebase kliknij Hosting i bezserwerowość > Funkcje.

Otwórz logi funkcji

konsola GCP

Otwórz stronę Cloud Functions w konsoli Google Cloud.

Otwórz przeglądarkę logów

Wyświetlanie postępu eksportu

Aby wyświetlić postęp operacji eksportu, możesz użyć polecenia gcloud firestore operations list. Więcej informacji znajdziesz w artykule o zarządzaniu operacjami eksportu i importu.

Po zakończeniu operacji eksportowania możesz wyświetlić pliki wyjściowe w zasobniku Cloud Storage:

Otwórz przeglądarkę Cloud Storage