Pianificazione dei backup

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

Per informazioni sulla creazione di backup utilizzando un servizio di pianificazione gestito, consulta Backup avanzati di Filestore.

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 che disponga delle credenziali per chiamare l'endpoint Filestore.
  • Crea una funzione Cloud Run Functions che crea un backup di un'istanza Filestore.
  • Crea una funzione Cloud Run Functions che elimina un backup di un'istanza Filestore.
  • Crea un job Cloud Scheduler che esegua una delle due funzioni 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 potrebbero avere diritto a una prova senza costi.

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 senza costi per l'esecuzione, il test e il deployment dei workload.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify 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.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  5. Installa Google Cloud CLI.

  6. Se utilizzi un provider di identità (IdP) esterno, devi prima accedere a gcloud CLI con la tua identità federata.

  7. Per inizializzare gcloud CLI, esegui questo comando:

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

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  9. Verify that billing is enabled for your Google Cloud project.

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

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  11. Installa Google Cloud CLI.

  12. Se utilizzi un provider di identità (IdP) esterno, devi prima accedere a gcloud CLI con la tua identità federata.

  13. Per inizializzare gcloud CLI, esegui questo comando:

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

Crea service account client per Cloud Scheduler e Cloud Run Functions

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

  2. Crea un account di servizio client che Cloud Scheduler esegue per richiamare una funzione Cloud Run Functions. Per questo esempio, utilizza il comando iam service-accounts create per denominare l'account schedulerunner e impostare 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. Crea un account di servizio client con cui vengono eseguite le funzioni Cloud Run per chiamare l'endpoint Filestore. Per questo esempio, chiamiamo l'account backupagent e impostiamo il nome visualizzato su "Service Account for FS Backups-GCF":

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

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

    gcloud iam service-accounts list
    

    Il comando restituisce un output 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

Imposta le seguenti variabili di ambiente nel tuo ambiente locale:

  • Google Cloud ID progetto e progetto:

    export PROJECT_ID=`gcloud config get-value core/project`
    export PROJECT_NUMBER=`gcloud projects describe $PROJECT_ID --format="value(projectNumber)"`
    
  • Il service agent Cloud Scheduler e i service account client per Cloud Scheduler e 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
    
  • La tua 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 si trova l'istanza Filestore di origine.
    • instance-id con l'ID istanza dell'istanza Filestore di origine.
    • file-share-name con il nome specificato per la condivisione di file NFS servita dall'istanza.
  • Imposta le variabili di ambiente per il backup 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 Cloud Run Functions.

    Vai alla pagina Cloud Run Functions

  2. Fai clic su Scrivi una funzione e configura la funzione nel seguente modo:

    • Configura:
    • Trigger:
      • Per questo esempio non è necessario impostare il trigger.
    • Autenticazione: seleziona Require authentication.
    • Ingress: seleziona All.
    • Container, volumi, networking, sicurezza
      • Vai alla scheda Sicurezza e seleziona Service Account for FS Backups-GCF (backupagent@$PROJECT_ID.iam.gserviceaccount.com) dal menu.
  3. Fai clic su Crea e continua la configurazione nel seguente modo:

    • Entry point della funzione: inserisci create_backup.
    • Aggiungi le seguenti dipendenze al file requirements.txt:

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

      A seconda del tuo caso d'uso, potresti dover specificare altre dipendenze insieme ai numeri di versione corrispondenti. Per ulteriori informazioni, vedi Pacchetti preinstallati.

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

      Crea backup

      Questo esempio di codice crea un backup denominato mybackup- a cui viene aggiunta la data e l'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 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!"
      

      Sostituisci quanto segue:

      • project-id con l' Google Cloud ID progetto 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: la regione in cui archiviare il backup.
      1. Fai clic su Test.

        Si apre una nuova sessione di schede in Cloud Shell. Se l'operazione ha esito positivo, viene restituito il seguente messaggio:

        Backup creation has begun!
        
      2. Fai clic su Salva e riesegui il deployment e attendi il completamento del deployment.

      3. Torna alla scheda precedente di Cloud Shell.

      Eliminare un backup

      Questo esempio di codice elimina i backup più vecchi di un periodo predefinito.

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

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

      • Nome della funzione: deletefsbackup.
      • Entry point: 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."
      

      Sostituisci quanto segue:

      • project-id con l' Google Cloud ID progetto del backup.
      • region con la regione in cui si trova il backup. Il backup, il job dello scheduler e la funzione devono trovarsi 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 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 di roles/cloudscheduler.serviceAgent. In questo modo, il service agent può simulare l'identità delaccount di serviziot 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 al account di servizio client di Cloud Run Functions 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 al account di servizio client di Cloud Scheduler il ruolo roles/run.invoker per la funzione che vuoi utilizzare. Esegui questo comando run services add-iam-policy-binding:

    Crea backup

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

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

    Eliminare un backup

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

    Ora, solo il account di servizio client di Cloud Scheduler può richiamare deletefsbackup.

Crea un job Cloud Scheduler che attiva 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, devi utilizzare il comando 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
    

    Il flag --schedule specifica la frequenza con cui viene eseguito il job utilizzando la formattazione unix-cron. Per maggiori dettagli, vedi Configurazione di pianificazioni cron job.

    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 richiama la funzione fsbackup immediatamente dopo l'esecuzione del comando e poi la 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 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 un output 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 volessi pianificare un'operazione per eliminare un backup ogni giorno feriale alle 22:00, utilizzeresti 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 specifica la frequenza con cui viene eseguito il job utilizzando la formattazione unix-cron. Per maggiori dettagli, vedi Configurazione di pianificazioni cron job.

    Le operazioni di backup delete associate alla stessa istanza di origine devono essere eseguite una alla volta. Per saperne di più, 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 richiama la funzione deletefsbackup immediatamente dopo l'esecuzione del comando e poi la richiama 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 un output 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 bassa per i backup

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

Esegui la pulizia

Al termine del tutorial, puoi eliminare le risorse che hai creato in modo che non utilizzino più la quota generando addebiti. Le seguenti sezioni descrivono come eliminare o disattivare queste risorse.

Elimina il progetto

Il modo più semplice per eliminare la fatturazione è eliminare il progetto 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 quello 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