Pianificazione dei backup


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

Obiettivi

  • Crea un account di servizio client per Cloud Scheduler con le credenziali necessarie per richiamare una funzione Cloud Run.
  • Crea un account di servizio client per le funzioni Cloud Run con le credenziali per chiamare l'endpoint Filestore.
  • Crea una funzione Cloud Run che crea un backup di un'istanza Filestore.
  • Crea una funzione Cloud Run che elimina un backup di un'istanza Filestore.
  • Crea un job Cloud Scheduler che esegue una delle due funzioni a intervalli regolari.

Costi

In questo documento utilizzi i seguenti componenti fatturabili di Google Cloud:

Per generare una stima dei costi basata sull'utilizzo previsto, utilizza il Calcolatore prezzi. I nuovi utenti di Google Cloud potrebbero essere idonei per una prova gratuita.

Prima di iniziare

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Artifact Registry, Cloud Build, Filestore, Cloud Run functions, Cloud Logging, Pub/Sub, Cloud Run, and Cloud Scheduler APIs.

    Enable the APIs

  5. Install the Google Cloud CLI.
  6. To initialize the gcloud CLI, run the following command:

    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. Make sure that billing is enabled for your Google Cloud project.

  9. Enable the Artifact Registry, Cloud Build, Filestore, Cloud Run functions, Cloud Logging, Pub/Sub, Cloud Run, and Cloud Scheduler APIs.

    Enable the APIs

  10. Install the Google Cloud CLI.
  11. To initialize the gcloud CLI, run the following command:

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

Creare account di servizio client per le funzioni Cloud Scheduler e Cloud Run

  1. Se non l'hai ancora fatto, dalla console Google Cloud, fai clic su Attiva Cloud Shell.

  2. Crea un account di servizio client con cui viene eseguito Cloud Scheduler per invocare una funzione Cloud Run. Per questo esempio, utilizza il comando iam service-accounts create per assegnare all'account il nome schedulerunner e imposta il nome visualizzato su "Account di servizio per i pianificatori dei backup del file system":

    gcloud iam service-accounts create schedulerunner \
        --display-name="Service Account for FS Backups-Scheduler"
    
  3. Crea un account di servizio client in cui vengono eseguite le funzioni Cloud Run per chiamare l'endpoint Filestore. Per questo esempio, chiamiamo l'accountbackupagent e impostiamo il nome visualizzato su "Account di servizio per i backup FS-Google Cloud":

    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 qualcosa di simile al 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 nell'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 del cliente per le funzioni Cloud Scheduler e Cloud Run:

    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
    
  • L'istanza Filestore:

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

    Sostituisci quanto segue:

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

    export BACKUP_REGION=backup-region
    

    Sostituisci backup-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 delle funzioni Cloud Run.

    Vai alla pagina Funzioni Cloud Run

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

    • Nozioni di base:
      • Ambiente: per questo esempio, seleziona 2nd gen, che è l'impostazione predefinita.
      • Nome funzione: per questo esempio, chiamiamo la funzione 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 > Service account di runtime > Account di servizio: seleziona Service Account for FS Backups-GCF (backupagent@$PROJECT_ID.iam.gserviceaccount.com) dal menu.
      • Connessioni > Impostazioni di importazione: seleziona Allow all traffic.
  3. Fai clic su Avanti e continua la configurazione nel seguente modo:

    • Runtime: seleziona Python 3.8 o una versione successiva supportata completamente da Cloud Run Functions dal menu.
    • Codice sorgente: Inline editor.
    • Punto di contatto: 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, potresti dover specificare altre dipendenze insieme ai relativi numeri di versione. Per ulteriori informazioni, consulta 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- a cui viene aggiunta la data/ora di creazione.
      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 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_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!"
      

      Sostituisci quanto segue:

      • project-id con l'ID progetto Google Cloud dell'istanza Filestore di origine.
      • fs-location con la zona o la regione dell'istanza Filestore di origine.
      • instance-id 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 Testa funzione.

        In Cloud Shell si apre una nuova sessione della scheda. In caso di esito positivo, viene restituito il seguente messaggio:

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

      3. Torna alla scheda Cloud Shell precedente.

      Eliminare un backup

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

      Puoi eliminare un solo backup per istanza di origine alla volta. Per ulteriori informazioni, consulta la sezione Backup.

      Configura questa funzione nello stesso modo in cui hai configurato la funzione utilizzata per creare un backup, utilizzando le seguenti modifiche:

      • Nome funzione: deletefsbackup.
      • Punto di contatto: 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()
          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."
      

      Sostituisci quanto segue:

      • project-id con l'ID progetto Google Cloud del backup.
      • region con la regione in cui si trova il backup. Il backup, il job di pianificazione e la funzione devono trovarsi tutti nella stessa posizione.
      • hours con il numero di ore per conservare i backup. Ad esempio, se vuoi conservare i backup per 10 giorni, inserisci 240.

Assegna i ruoli IAM agli account di servizio client

  1. Aggiungi l'agente di servizio Cloud Scheduler al criterio IAM dell'account di servizio client Cloud Scheduler con il ruolo roles/cloudscheduler.serviceAgent. In questo modo, l'agente di servizio può simulare l'identità dell'account di servizio del cliente 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 delle funzioni Cloud Run il ruolo roles/file.editor in modo che possa effettuare chiamate all'endpoint 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 roles/cloudfunctions.invoker per la funzione che vuoi utilizzare. Esegui il seguente comando functions add-iam-policy-binding:

    Crea backup

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

    Viene visualizzato un messaggio che indica che il ruolo roles/run.invoker deve essere concesso al servizio Cloud Run sottostante e che puoi eseguire il comando gcloud functions add-invoker-policy-binding per applicarlo. Quando ti viene chiesto di rispondere, inserisci Y.

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

    Eliminare un backup

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

    Viene visualizzato un messaggio che indica che il ruolo roles/run.invoker deve essere concesso al servizio Cloud Run sottostante e che puoi eseguire il comando gcloud functions add-invoker-policy-binding per applicarlo. Quando ti viene chiesto di rispondere, inserisci Y.

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

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

Crea backup

  1. Nell'esempio di questo tutorial, se vuoi pianificare un backup ogni giorno della settimana alle 22:00, dovresti 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 con cui viene eseguito il job utilizzando il formato unix-cron. Per maggiori dettagli, consulta Configurare le pianificazioni dei job cron.

    Puoi creare un massimo di sei backup per istanza all'ora.

  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 invoca la funzione fsbackup immediatamente dopo l'esecuzione del comando e poi la invoca di nuovo ogni giorno feriale alle 22:00 fino a quando il job non viene messo in pausa.

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

    Per visualizzare i log nella console Google Cloud, utilizza Esplora log:

    1. Nella console Google Cloud, vai alla pagina Esplora log:

      Vai a Esplora log

      Se utilizzi la barra di ricerca per trovare questa pagina, seleziona il risultato con il sottotitolo Logging.

      I log più recenti vengono visualizzati nel riquadro Risultati query.

  4. Controlla lo stato dei backup esistenti utilizzando il comando backups list:

    gcloud filestore backups list
    

    Il comando restituisce qualcosa di simile al seguente:

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

Eliminare un backup

  1. Nell'esempio di questo tutorial, se vuoi pianificare un'operazione per eliminare un backup ogni giorno feriale alle 22:00, devi utilizzare il comando 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
    

    Il flag --schedule consente di specificare la frequenza con cui viene eseguito il job utilizzando il formato unix-cron. Per maggiori dettagli, consulta Configurare le pianificazioni dei job cron.

    Le operazioni di backup delete associate alla stessa istanza di origine devono avvenire una alla volta. Per ulteriori informazioni, consulta Backup.

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

    gcloud scheduler jobs run deletefsbackupschedule
    

    Il job deletefsbackupschedule invoca la funzione deletefsbackup immediatamente dopo l'esecuzione del comando e poi la invoca di nuovo ogni giorno feriale alle 22:00 finché il job non viene messo in pausa.

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

    Per visualizzare i log nella console Google Cloud, utilizza Esplora log:

    1. Nella console Google Cloud, vai alla pagina Esplora log:

      Vai a Esplora log

      Se utilizzi la barra di ricerca per trovare questa pagina, seleziona il risultato con il sottotitolo Logging.

      I log più recenti vengono visualizzati nel riquadro Risultati query.

  4. Controlla lo stato dei backup esistenti utilizzando il comando backups list:

    gcloud filestore backups list
    

    Il comando restituisce qualcosa di simile al seguente:

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

Avvisi di quota ridotta per i backup

Se l'implementazione della pianificazione dei backup rischia di farti esaurire la quota di backup, ti consigliamo di configurare gli avvisi relativi alla quota di backup ridotta. In questo modo, riceverai una notifica quando la quota dei backup sta per esaurirsi.

Esegui la pulizia

Al termine del tutorial, puoi eliminare le risorse che hai creato in modo che smettano di utilizzare la quota e di generare addebiti. Le sezioni seguenti descrivono come eliminare o disattivare queste risorse.

Elimina il progetto

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

Per eliminare il progetto:

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

Passaggi successivi