Sicherungen planen

In dieser Anleitung wird gezeigt, wie Sie Sicherungen mit Cloud Scheduler und Cloud Run-Funktionen für Filestore-Instanzen planen.

Clientdienstkonten für Cloud Scheduler und Cloud Run-Funktionen erstellen

  1. Klicken Sie in der Google Cloud Console auf Cloud Shell aktivieren, falls noch nicht geschehen.

  2. Erstellen Sie ein Clientdienstkonto, das Cloud Scheduler zum Aufrufen einer Cloud Run-Funktion ausführt. In diesem Beispiel verwenden wir den Befehl iam service-accounts create, um das Konto schedulerunner zu benennen und den Anzeigenamen auf „Service Account for FS Backups-Scheduler“ festzulegen:

    gcloud iam service-accounts create schedulerunner \
        --display-name="Service Account for FS Backups-Scheduler"
    
  3. Erstellen Sie ein Clientdienstkonto, das Cloud Run-Funktionen zum Aufrufen des Filestore-Endpunkts ausführt. In diesem Beispiel nennen wir das Konto backupagent und legen den Anzeigenamen auf "Service Account for FS Backups-GCF" fest:

    gcloud iam service-accounts create backupagent \
        --display-name="Service Account for FS Backups-GCF"
    

    Mit dem folgenden Befehl können Sie prüfen, ob das Dienstkonto erstellt wurde:iam service-accounts list

    gcloud iam service-accounts list
    

    Der Befehl gibt in etwa Folgendes zurück:

    NAME                                         EMAIL                                                   DISABLED
    Service Account for FS Backups-GCF           backupagent@$PROJECT_ID.iam.gserviceaccount.com         False
    Service Account for FS Backups-Scheduler     schedulerunner@$PROJECT_ID.iam.gserviceaccount.com      False
    

Umgebungsvariablen einrichten

Richten Sie in Ihrer lokalen Umgebung die folgenden Umgebungsvariablen ein:

  • Google Cloud Projekt-ID und -Projekt:

    export PROJECT_ID=`gcloud config get-value core/project`
    export PROJECT_NUMBER=`gcloud projects describe $PROJECT_ID --format="value(projectNumber)"`
    
  • Der Cloud Scheduler-Dienst-Agent und die Client-Dienstkonten für Cloud Scheduler und Cloud Run Functions:

    export SCHEDULER_SA=service-$PROJECT_NUMBER@gcp-sa-cloudscheduler.iam.gserviceaccount.com
    export SCHEDULER_CLIENT_SA=schedulerunner@$PROJECT_ID.iam.gserviceaccount.com
    export GCF_CLIENT_SA=backupagent@$PROJECT_ID.iam.gserviceaccount.com
    
  • Ihre Filestore-Instanz:

    export SOURCE_INSTANCE_LOCATION=fs-location
    export SOURCE_INSTANCE_NAME=instance-id
    export SHARE_NAME=file-share-name
    

    Ersetzen Sie Folgendes:

    • fs-location durch die Zone oder Region, in der sich die Filestore-Quellinstanz befindet.
    • instance-id durch die Instanz-ID der Filestore-Quellinstanz.
    • file-share-name durch den Namen, den Sie für die NFS-Dateifreigabe festlegen, der von der Instanz bereitgestellt wird.
  • Richten Sie Umgebungsvariablen für Ihre Filestore-Sicherung ein:

    export BACKUP_REGION=backup-region
    

    Ersetzen Sie backup-region durch die Region, in der Sie die Sicherung speichern möchten.

Funktion erstellen, die eine Sicherung erstellt

  1. Wechseln Sie in der Google Cloud Console zur Seite „Cloud Run-Funktionen“.

    Zur Übersicht "Cloud Run-Funktionen"

  2. Klicken Sie auf Funktion schreiben und konfigurieren Sie die Funktion so:

    • Konfigurieren:
    • Trigger:
      • Für dieses Beispiel muss kein Trigger festgelegt werden.
    • Authentifizierung: Wählen Sie Require authentication aus.
    • Eingehend: Wählen Sie All aus.
    • Container, Volumes, Netzwerk, Sicherheit
      • Rufen Sie den Tab Sicherheit auf und wählen Sie im Menü Service Account for FS Backups-GCF (backupagent@$PROJECT_ID.iam.gserviceaccount.com) aus.
  3. Klicken Sie auf Erstellen und fahren Sie mit der Konfiguration wie folgt fort:

    • Funktionseinstiegspunkt: Geben Sie create_backup ein.
    • Fügen Sie der Datei requirements.txt die folgenden Abhängigkeiten hinzu:

      functions-framework==3.*
      google-auth==2.29.0
      requests==2.31.0
      

      Je nach Anwendungsfall müssen Sie möglicherweise andere Abhängigkeiten zusammen mit den entsprechenden Versionsnummern angeben. Weitere Informationen finden Sie unter Vorinstallierte Pakete.

    • Kopieren Sie das folgende Python-Codebeispiel mit dem Inline-Editor in die Datei main.py:

      Sicherung erstellen

      In diesem Codebeispiel wird eine Sicherung mit dem Namen mybackup- erstellt, gefolgt von der Erstellungszeit.

      PROJECT_ID = 'project-id'
      SOURCE_INSTANCE_LOCATION = 'fs-location'
      SOURCE_INSTANCE_NAME = 'instance-id'
      SOURCE_FILE_SHARE_NAME = 'file-share-name'
      BACKUP_REGION = 'backup-region'
      
      import functions_framework
      import google.auth
      import google.auth.transport.requests
      from google.auth.transport.requests import AuthorizedSession
      import time
      import requests
      import json
      
      credentials, project = google.auth.default()
      request = google.auth.transport.requests.Request()
      credentials.refresh(request)
      authed_session = AuthorizedSession(credentials)
      
      def get_backup_id():
          return "mybackup-" + time.strftime("%Y%m%d-%H%M%S")
      
      @functions_framework.http
      def create_backup(request):
          trigger_run_url = "https://file.googleapis.com/v1/projects/{}/locations/{}/backups?backupId={}".format(PROJECT_ID, BACKUP_REGION, get_backup_id())
          headers = {
            'Content-Type': 'application/json'
          }
          post_data = {
            "description": "my new backup",
            "source_instance": "projects/{}/locations/{}/instances/{}".format(PROJECT_ID, SOURCE_INSTANCE_LOCATION, SOURCE_INSTANCE_NAME),
            "source_file_share": "{}".format(SOURCE_FILE_SHARE_NAME)
          }
          print("Making a request to " + trigger_run_url)
          r = authed_session.post(url=trigger_run_url, headers=headers, data=json.dumps(post_data))
          data = r.json()
          print(data)
          if r.status_code == requests.codes.ok:
            print(str(r.status_code) + ": The backup is uploading in the background.")
          else:
            raise RuntimeError(data['error'])
          return "Backup creation has begun!"
      

      Ersetzen Sie Folgendes:

      • project-id durch die Google Cloud Projekt-ID der Filestore-Quellinstanz.
      • fs-location durch die Zone oder Region der Filestore-Quellinstanz.
      • instance-id durch den Namen der Filestore-Quellinstanz.
      • file-share-name durch den Namen der Dateifreigabe.
      • backup-region durch die Region, in der die Sicherung gespeichert wird.
      1. Klicken Sie auf Testen.

        In Cloud Shell wird eine neue Tabsitzung geöffnet. Bei Erfolg wird die folgende Meldung zurückgegeben:

        Backup creation has begun!
        
      2. Klicken Sie auf Speichern und wieder bereitstellen und warten Sie, bis die Bereitstellung abgeschlossen ist.

      3. Wechseln Sie zurück zum vorherigen Cloud Shell-Tab.

      Sicherung löschen

      In diesem Codebeispiel werden Sicherungen gelöscht, die älter als ein vordefinierter Zeitraum sind.

      Sie können jeweils nur eine Sicherung pro Quellinstanz löschen. Weitere Informationen finden Sie unter Sicherungen.

      Konfigurieren Sie diese Funktion auf die gleiche Weise wie die Funktion, mit der Sie eine Sicherung erstellt haben, mit den folgenden Änderungen:

      • Funktionsname: deletefsbackup.
      • Einstiegspunkt: delete_backup.
      PROJECT_ID = 'project-id'
      BACKUP_REGION = 'region'
      BACKUP_RETENTION_TIME_HRS = hours
      
      import functions_framework
      import google.auth
      import google.auth.transport.requests
      from google.auth.transport.requests import AuthorizedSession
      import time
      import requests
      import json
      
      credentials, project = google.auth.default()
      request = google.auth.transport.requests.Request()
      credentials.refresh(request)
      authed_session = AuthorizedSession(credentials)
      
      retention_seconds = BACKUP_RETENTION_TIME_HRS * 60 * 60
      
      @functions_framework.http
      def delete_backup(request):
          now = time.time()
          backup_list = []
          trigger_run_url = "https://file.googleapis.com/v1/projects/{}/locations/{}/backups".format(PROJECT_ID, BACKUP_REGION)
          r = authed_session.get(trigger_run_url)
          data = r.json()
          if not data:
              print("No backups to delete.")
              return "No backups to delete."
          else:
              backup_list.extend(data['backups'])
              while "nextPageToken" in data.keys():
                  nextPageToken = data['nextPageToken']
                  trigger_run_url_next = "https://file.googleapis.com/v1/projects/{}/locations/{}/backups?pageToken={}".format(PROJECT_ID, BACKUP_REGION, nextPageToken)
                  r = authed_session.get(trigger_run_url_next)
                  data = r.json()
                  backup_list.extend(data['backups'])
          for i in backup_list:
              backup_time = i['createTime']
              backup_time = backup_time[:-4]
              backup_time = float(time.mktime(time.strptime(backup_time, "%Y-%m-%dT%H:%M:%S.%f")))
              i['backup_timestamp'] = backup_time
          sorted_backup_list = sorted(backup_list, key=lambda d: d['backup_timestamp'])
          oldest_backup = sorted_backup_list[0]
          if now - oldest_backup['backup_timestamp'] > retention_seconds:
              print(oldest_backup['name'] + " is older than the indicated retention time.")
              r = authed_session.delete("https://file.googleapis.com/v1/{}".format(oldest_backup['name']))
              data = r.json()
              print(data)
              if r.status_code == requests.codes.ok:
                  print(str(r.status_code) + ": Deleting " + oldest_backup['name'] + " in the background.")
              else:
                  raise RuntimeError(data['error'])
              return "Backup deletion has begun!"
          return "All backups are within the indicated retention period."
      

      Ersetzen Sie Folgendes:

      • project-id durch die Google Cloud Projekt-ID der Sicherung.
      • region durch die Region, in der sich die Sicherung befindet. Das Backup, der Scheduler-Job und die Funktion sollten sich alle am selben Ort befinden.
      • hours durch die Anzahl der Stunden, für die Sicherungen aufbewahrt werden sollen. Wenn Sie beispielsweise Sicherungen 10 Tage lang aufbewahren möchten, geben Sie 240 ein.

IAM-Rollen zu Clientdienstkonten zuweisen

  1. Fügen Sie den Cloud Scheduler-Dienst-Agent der IAM-Richtlinie des Cloud Scheduler-Clientdienstkontos mit der Rolle roles/cloudscheduler.serviceAgent hinzu. Dadurch kann der Dienst-Agent die Identität des Clientdienstkontos übernehmen, um die Funktion aufzurufen, die eine Sicherung erstellt. Führen Sie den Befehl iam service-accounts add-iam-policy-binding aus:

    gcloud iam service-accounts add-iam-policy-binding $SCHEDULER_CLIENT_SA \
        --member=serviceAccount:$SCHEDULER_SA \
        --role=roles/cloudscheduler.serviceAgent
    
  2. Weisen Sie dem Clientdienstkonto von Cloud Run-Funktionen die Rolle roles/file.editor zu, damit es Aufrufe an den Filestore-Endpunkt senden kann. Führen Sie den Befehl projects add-iam-policy-binding aus:

    gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member=serviceAccount:$GCF_CLIENT_SA \
        --role=roles/file.editor
    
  3. Weisen Sie dem Clientdienstkonto von Cloud Scheduler die Rolle roles/run.invoker für die Funktion zu, die Sie verwenden möchten. Führen Sie den folgenden run services add-iam-policy-binding-Befehl aus:

    Sicherung erstellen

    gcloud run services add-iam-policy-binding fsbackup \
        --member serviceAccount:$SCHEDULER_CLIENT_SA \
        --role roles/run.invoker \
        --region=us-central1
    

    Jetzt kann nur das Clientdienstkonto von Cloud Scheduler fsbackup aufrufen.

    Sicherung löschen

    gcloud run services add-iam-policy-binding deletefsbackup \
        --member serviceAccount:$SCHEDULER_CLIENT_SA \
        --role roles/run.invoker
    

    Jetzt kann nur das Clientdienstkonto von Cloud Scheduler deletefsbackup aufrufen.

Cloud Scheduler-Job erstellen, der die Funktion nach einem bestimmten Zeitplan auslöst

Sicherung erstellen

  1. Wenn Sie in unserem Beispiel für diese Anleitung jeden Wochentag um 22:00 Uhr eine Sicherung planen möchten, verwenden Sie den Befehl scheduler jobs create http:

    gcloud scheduler jobs create http fsbackupschedule \
        --schedule "0 22 * * 1-5" \
        --http-method=GET \
        --uri=https://fsbackup-$PROJECT_NUMBER.us-central1.run.app \
        --oidc-service-account-email=$SCHEDULER_CLIENT_SA \
        --location=us-central1
    

    Im Flag --schedule geben Sie die Häufigkeit an, mit der der Job ausgeführt wird. Verwenden Sie dazu die unix-cron-Formatierung. Weitere Informationen finden Sie unter Cronjob-Zeitpläne konfigurieren.

    Sie können maximal sechs Sicherungen pro Instanz und Stunde erstellen.

  2. Starten Sie den Cloud Scheduler-Job, der im vorherigen Schritt erstellt wurde. Verwenden Sie in unserem Beispiel den Befehl scheduler jobs runs, um ihn sofort auszuführen:

    gcloud scheduler jobs run fsbackupschedule
    

    Der Job fsbackupschedule ruft die Funktion fsbackup sofort auf, nachdem Sie den Befehl ausgeführt haben, und ruft sie dann jeden Wochentag um 22:00 Uhr noch einmal auf, bis der Job pausiert wird.

  3. Prüfen Sie die Logs für die Funktion fsbackup, um zu sehen, ob sie ordnungsgemäß ausgeführt wird und einen status 200-Wert zurückgibt.

    So rufen Sie Ihre Logs in der Google Cloud Console auf:

    1. Rufen Sie in der Google Cloud Console die Seite Log-Explorer auf:

      Zum Log-Explorer

      Wenn Sie diese Seite über die Suchleiste suchen, wählen Sie das Ergebnis aus, dessen Zwischenüberschrift Logging ist.

      Die neuesten Logs werden im Bereich Abfrageergebnisse angezeigt.

  4. Prüfen Sie den Status Ihrer vorhandenen Back-ups mit dem Befehl backups list:

    gcloud filestore backups list
    

    Der Befehl gibt in etwa Folgendes zurück:

    NAME                      LOCATION     SRC_INSTANCE                        SRC_FILE_SHARE  STATE
    mybackup-20201123-184500  us-central1  us-central1-c/instances/nfs-server  vol1            READY
    

Sicherung löschen

  1. Wenn Sie in unserem Beispiel für diese Anleitung einen Vorgang zum Löschen einer Sicherung an jedem Wochentag um 22:00 Uhr planen möchten, verwenden Sie den Befehl scheduler jobs create http:

    gcloud scheduler jobs create http deletefsbackupschedule \
        --schedule "0 22 * * 1-5" \
        --http-method=GET \
        --uri=https://us-central1-$PROJECT_ID.cloudfunctions.net/deletefsbackup \
        --oidc-service-account-email=$SCHEDULER_CLIENT_SA    \
        --oidc-token-audience=https://us-central1-$PROJECT_ID.cloudfunctions.net/deletefsbackup
    

    Im Flag --schedule geben Sie die Häufigkeit an, mit der der Job ausgeführt wird. Verwenden Sie dazu die unix-cron-Formatierung. Weitere Informationen finden Sie unter Cronjob-Zeitpläne konfigurieren.

    delete-Sicherungsvorgänge, die mit derselben Quellinstanz verknüpft sind, müssen einzeln ausgeführt werden. Weitere Informationen finden Sie unter Sicherungen.

  2. Starten Sie den Cloud Scheduler-Job, der im vorherigen Schritt erstellt wurde. In unserem Beispiel verwenden wir den Befehl scheduler jobs runs, um ihn sofort auszuführen:

    gcloud scheduler jobs run deletefsbackupschedule
    

    Der Job deletefsbackupschedule ruft die Funktion deletefsbackup sofort auf, nachdem Sie den Befehl ausgeführt haben, und ruft sie dann jeden Wochentag um 22:00 Uhr noch einmal auf, bis der Job pausiert wird.

  3. Prüfen Sie die Logs für die Funktion deletefsbackup, um zu sehen, ob sie ordnungsgemäß ausgeführt wird und einen status 200-Wert zurückgibt.

    So rufen Sie Ihre Logs in der Google Cloud Console auf:

    1. Rufen Sie in der Google Cloud Console die Seite Log-Explorer auf:

      Zum Log-Explorer

      Wenn Sie diese Seite über die Suchleiste suchen, wählen Sie das Ergebnis aus, dessen Zwischenüberschrift Logging ist.

      Die neuesten Logs werden im Bereich Abfrageergebnisse angezeigt.

  4. Prüfen Sie den Status Ihrer vorhandenen Back-ups mit dem Befehl backups list:

    gcloud filestore backups list
    

    Der Befehl gibt in etwa Folgendes zurück:

    NAME                      LOCATION     SRC_INSTANCE                        SRC_FILE_SHARE  STATE
    mybackup-20201123-184500  us-central1  us-central1-c/instances/nfs-server  vol1            READY
    

Benachrichtigungen zu niedrigen Kontingenten für Sicherungen

Wenn bei Ihrer Implementierung von geplanten Sicherungen das Risiko besteht, das Kontingent von Sicherungen zu überschreiten, empfehlen wir die Einrichtung von Benachrichtigungen zu niedrigen Sicherungskontingenten. So werden Sie benachrichtigt, wenn das Sicherungskontingent knapp wird.