Pianificazione dei backup


Questo tutorial mostra come pianificare i backup per le istanze Filestore utilizzando Cloud Scheduler e Cloud Functions.

Obiettivi

  • Crea un account di servizio client per Cloud Scheduler che disponga delle credenziali necessarie per richiamare una funzione di Cloud Functions.
  • Creare un account di servizio client per l'utilizzo da parte di Cloud Functions che disponga delle credenziali per chiamare l'endpoint Filestore.
  • Creare una funzione Cloud Functions che crea (o elimina) un backup di una condivisione file.
  • Crea un job Cloud Scheduler che esegue la funzione di creazione dei backup (o di eliminazione dei backup) a intervalli regolari.

Costi

In questo documento vengono utilizzati i seguenti componenti fatturabili di Google Cloud:

Per generare una stima dei costi in base all'utilizzo previsto, utilizza il Calcolatore prezzi. I nuovi utenti di Google Cloud possono essere idonei a una prova senza costi aggiuntivi.

Prima di iniziare

  1. Accedi al tuo account Google Cloud. Se non conosci Google Cloud, crea un account per valutare le prestazioni dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $di crediti gratuiti per l'esecuzione, il test e il deployment dei carichi di lavoro.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  4. Abilita le API Artifact Registry, Cloud Build, Filestore, Cloud Functions, Cloud Logging, Pub/Sub, Cloud Run, and Cloud Scheduler.

    Abilita le API

  5. Installa Google Cloud CLI.
  6. Per initialize gcloud CLI, esegui questo comando:

    gcloud init
  7. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  8. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  9. Abilita le API Artifact Registry, Cloud Build, Filestore, Cloud Functions, Cloud Logging, Pub/Sub, Cloud Run, and Cloud Scheduler.

    Abilita le API

  10. Installa Google Cloud CLI.
  11. Per initialize gcloud CLI, esegui questo comando:

    gcloud init
  12. Se nel progetto non è presente un'istanza Filestore, devi prima crearne una.

Crea account di servizio client per Cloud Scheduler e Cloud Functions

  1. Se non lo hai già fatto, nella console Google Cloud fai clic su Attiva Cloud Shell.

  2. Creare un account di servizio client che Cloud Scheduler esegue per richiamare una funzione di Cloud Functions. Per questo esempio, utilizza il comando iam service-accounts create per assegnare un nome all'account schedulerunner e imposta il nome visualizzato su "Service Account for FS Backups-Scheduler":

    gcloud iam service-accounts create schedulerunner \
        --display-name="Service Account for FS Backups-Scheduler"
    
  3. Creare un account di servizio client che Cloud Functions esegue per chiamare l'endpoint Filestore. Per questo esempio, assegniamo all'account il nome backupagent e impostiamo il nome visualizzato su "Account di servizio per FS Backups-GCF":

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

    Puoi verificare se l'account di servizio è stato creato eseguendo il comando iam service-accounts list:

    gcloud iam service-accounts list
    

    Il comando restituisce una risposta simile alla seguente:

    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
    

Imposta le variabili di ambiente

Configura le seguenti variabili di ambiente nel tuo ambiente locale:

  • ID progetto e progetto Google Cloud:

    export PROJECT_ID=`gcloud config get-value core/project`
    export PROJECT_NUMBER=`gcloud projects describe $PROJECT_ID --format='value(projectNumber)'`
    
  • L'agente di servizio Cloud Scheduler e gli account di servizio client per Cloud Scheduler e Cloud 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
    
  • La tua istanza Filestore:

    export FS_LOCATION=fs-location
    export INSTANCE_NAME=instance-id
    export SHARE_NAME=datafile-share-name
    

    Sostituisci quanto segue:

    • fs-location con la regione o la zona in cui si trova l'istanza Filestore.
    • instance-id con l'ID istanza dell'istanza Filestore.
    • file-share-name con il nome specificato per la condivisione file NFS gestita dall'istanza.
  • Configura le variabili di ambiente per il backup di Filestore:

    export FS_BACKUP_LOCATION=region
    

    Sostituisci region con la regione in cui vuoi archiviare il backup.

Crea una funzione che crea un backup

  1. Nella console Google Cloud, vai alla pagina Cloud Functions.

    Vai alla pagina Cloud Functions

  2. Fai clic su Crea funzione e configura la funzione come segue:

    • Nozioni di base:
      • Ambiente: per questo esempio seleziona 2nd gen, che è il valore predefinito.
      • Nome funzione: per questo esempio, abbiamo assegnato alla funzione il nome fsbackup.
      • Regione: per questo esempio, seleziona us-central1.
    • Attivazione:
      • Tipo di attivatore: seleziona HTTPS dal menu.
      • Autenticazione: seleziona Require authentication.
    • Impostazioni di runtime, build, connessioni e sicurezza:
      • Runtime > Account di servizio di runtime > Account di servizio: seleziona Service Account for FS Backups-GCF (backupagent@$PROJECT_ID.iam.gserviceaccount.com) dal menu.
      • Connections (Connessioni) > Impostazioni in entrata: seleziona Allow all traffic.
  3. Fai clic su Avanti e continua la configurazione come segue:

    • Runtime: seleziona Python 3.8 o una versione successiva completamente supportata da Cloud Functions dal menu.
    • Codice sorgente: Inline editor.
    • Entry point (Punto di ingresso): inserisci create_backup.
    • Aggiungi le seguenti dipendenze al file requirements.txt:

      google-auth==2.29.0
      requests==2.31.0
      

      A seconda del caso d'uso, potrebbe essere necessario specificare altre dipendenze insieme ai numeri di versione corrispondenti. Per maggiori informazioni, consulta la sezione Pacchetti preinstallati.

    • Copia il seguente esempio di codice Python nel file main.py utilizzando l'editor in linea:

      Crea backup

      1. Questo esempio di codice crea un backup denominato mybackup- aggiunto con l'ora di creazione.
      PROJECT_ID = 'project-id'
      SOURCE_INSTANCE_ZONE = 'filestore-zone'
      SOURCE_INSTANCE_NAME = 'filestore-name'
      SOURCE_FILE_SHARE_NAME = 'file-share-name'
      BACKUP_REGION = 'backup-region'
      
      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")
      
      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_ZONE, 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!"
      

      Sostituisci quanto segue:

      • project-id con l'ID progetto Google Cloud dell'istanza Filestore di origine.
      • filestore-zone con la zona dell'istanza Filestore di origine.
      • filestore-name con il nome dell'istanza Filestore di origine.
      • file-share-name con il nome della condivisione file.
      • backup-region con la regione in cui archiviare il backup.
      1. Fai clic su Esegui test funzione.

        In Cloud Shell si apre una nuova sessione di schede. Al suo interno viene restituito il seguente messaggio, in caso di esito positivo:

        Function is ready to test.
        
      2. Fai clic su Esegui il deployment e attendi il completamento del deployment.

      3. Torna alla scheda precedente di Cloud Shell.

      Elimina backup

      Questo esempio di codice elimina i backup precedenti a un periodo predefinito.

      Configura questa funzione come la funzione di creazione backup, tranne quanto segue:

      • Nome funzione: deletefsbackups.
      • Punto di ingresso: delete_backup.
      PROJECT_ID = 'project-id'
      BACKUP_REGION = 'region'
      BACKUP_RETENTION_TIME_HRS = hours
      
      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
      
      def delete_backup(request):
          now = time.time()
          list = []
          trigger_run_url = "https://file.googleapis.com/v1beta1/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:
              list.extend(data['backups'])
              while 'nextPageToken' in data.keys():
                  nextPageToken = data['nextPageToken']
                  trigger_run_url_next = "https://file.googleapis.com/v1beta1/projects/{}/locations/{}/backups?pageToken={}".format(PROJECT_ID, BACKUP_REGION, nextPageToken)
                  r = authed_session.get(trigger_run_url_next)
                  data = r.json()
                  list.extend(data['backups'])
          for i in 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")))
              if now - backup_time > retention_seconds:
                  print("Deleting " + i['name'] + " in the background.")
                  r = authed_session.delete("https://file.googleapis.com/v1beta1/{}".format(i['name']))
                  data = r.json()
                  print(data)
                  if r.status_code == requests.codes.ok:
                    print(str(r.status_code) + ": Deleting " + i['name'] + " in the background.")
                  else:
                    raise RuntimeError(data['error'])
          return "Backup deletion has begun!"
      

      Sostituisci quanto segue:

      • project-id con l'ID progetto Google Cloud del backup.
      • region con la regione in cui si trovano i backup.
      • hours con il numero di ore per conservare i backup. Ad esempio, se vuoi conservare i backup per 10 giorni, inserisci 240.

Assegnare ruoli IAM agli account di servizio client

  1. Aggiungi l'agente di servizio Cloud Scheduler al criterio IAM dell'account di servizio client di Cloud Scheduler con il ruolo roles/cloudscheduler.serviceAgent. Ciò consente all'agente di servizio di impersonare l'account di servizio client per richiamare la funzione che crea un backup. Esegui il comando iam service-accounts add-iam-policy-binding:

    gcloud iam service-accounts add-iam-policy-binding $SCHEDULER_CLIENT_SA \
        --member=serviceAccount:$SCHEDULER_SA \
        --role=roles/cloudscheduler.serviceAgent
    
  2. Assegna all'account di servizio client di Cloud Functions il ruolo roles/file.editor in modo che possa effettuare chiamate all'endpoint di Filestore. Esegui il comando projects add-iam-policy-binding:

    gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member=serviceAccount:$GCF_CLIENT_SA \
        --role=roles/file.editor
    
  3. Concedi all'account di servizio client di Cloud Scheduler il ruolo di roles/cloudfunctions.invoker per la funzione che vuoi utilizzare. Esegui questo comando functions add-iam-policy-binding:

    Crea backup

    gcloud functions add-iam-policy-binding fsbackup \
        --member serviceAccount:$SCHEDULER_CLIENT_SA \
        --role roles/cloudfunctions.invoker
    

    Ora, solo l'account di servizio client di Cloud Scheduler può richiamare fsbackup.

    Elimina backup

    gcloud functions add-iam-policy-binding deletefsbackups \
        --member serviceAccount:$SCHEDULER_CLIENT_SA \
        --role roles/cloudfunctions.invoker
    

    Ora, solo l'account di servizio client di Cloud Scheduler può richiamare deletefsbackups.

Crea un job Cloud Scheduler che attivi la funzione fsbackup in base a una pianificazione specificata

  1. Nel nostro esempio per questo tutorial, se vuoi pianificare un backup ogni giorno feriale alle 22:00, puoi utilizzare il comando scheduler jobs create http:

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

    Il flag --schedule consente di specificare la frequenza di esecuzione del job utilizzando la formattazione unix-cron. Per maggiori dettagli, consulta Configurazione di pianificazioni cron job.

  2. Avvia il job Cloud Scheduler creato nel passaggio precedente. Nel nostro esempio, utilizza il comando scheduler jobs runs per eseguirlo immediatamente:

    gcloud scheduler jobs run fsbackupschedule
    

    Il job fsbackupschedule richiama la funzione fsbackups immediatamente dopo che hai eseguito il comando, quindi lo richiama di nuovo ogni giorno feriale alle 22:00 fino a quando il job non viene messo in pausa.

  3. Controlla i log della funzione fsbackups per verificare se la funzione viene eseguita correttamente e restituisce un status 200.

  4. Verifica se il backup è stato creato utilizzando il comando backups list:

    gcloud filestore backups list
    

    Il comando restituisce un risultato simile a questo:

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

Avvisi di quota bassa per i backup

Se l'implementazione della pianificazione dei backup rischi di esaurire la quota di backup, ti consigliamo di configurare avvisi relativi a quota di backup bassa. In questo modo riceverai una notifica quando la quota di backup è in esaurimento.

Esegui la pulizia

Dopo aver completato il tutorial, puoi eseguire la pulizia delle risorse che hai creato in modo che smettano di utilizzare la quota e generino addebiti. Le sezioni seguenti descrivono come eliminare o disattivare queste risorse.

Elimina il progetto

Il modo più semplice per eliminare la fatturazione è quello di eliminare il progetto che hai creato per il tutorial.

Per eliminare il progetto:

  1. Nella console Google Cloud, vai alla pagina Gestisci risorse.

    Vai a Gestisci risorse

  2. Nell'elenco dei progetti, seleziona il progetto che vuoi eliminare, quindi fai clic su Elimina.
  3. Nella finestra di dialogo, digita l'ID del progetto e fai clic su Chiudi per eliminare il progetto.

Passaggi successivi