Programar copias de seguridad

En este tutorial se explica cómo programar copias de seguridad de instancias de Filestore mediante funciones de Cloud Scheduler y Cloud Run.

Crear cuentas de servicio de cliente para funciones de Cloud Scheduler y Cloud Run

  1. Si aún no lo has hecho, en la consola Google Cloud , haz clic en Activar Cloud Shell.

  2. Crea una cuenta de servicio de cliente que Cloud Scheduler ejecute para invocar una función de Cloud Run Functions. En este ejemplo, usa el comando iam service-accounts create para asignar el nombre schedulerunner a la cuenta y el nombre visible "Service Account for FS Backups-Scheduler":

    gcloud iam service-accounts create schedulerunner \
        --display-name="Service Account for FS Backups-Scheduler"
    
  3. Crea una cuenta de servicio de cliente que ejecuten las funciones de Cloud Run para llamar al endpoint de Filestore. En este ejemplo, le asignamos el nombre backupagent a la cuenta y le damos el nombre visible "Service Account for FS Backups-GCF":

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

    Para comprobar si se ha creado la cuenta de servicio, ejecuta el comando iam service-accounts list:

    gcloud iam service-accounts list
    

    El comando devuelve algo parecido a esto:

    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
    

Configurar variables de entorno

Define las siguientes variables de entorno en tu entorno local:

  • Google Cloud ID del proyecto y proyecto:

    export PROJECT_ID=`gcloud config get-value core/project`
    export PROJECT_NUMBER=`gcloud projects describe $PROJECT_ID --format="value(projectNumber)"`
    
  • El agente de servicio de Cloud Scheduler y las cuentas de servicio del cliente de las funciones de Cloud Scheduler y 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
    
    .
  • Tu instancia de Filestore:

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

    Haz los cambios siguientes:

    • fs-location por la zona o la región en la que se encuentra la instancia de Filestore de origen.
    • instance-id con el ID de instancia de la instancia de Filestore de origen.
    • file-share-name con el nombre que especifiques para el recurso compartido de archivos NFS que se sirve desde la instancia.
  • Configura las variables de entorno de tu copia de seguridad de Filestore:

    export BACKUP_REGION=backup-region
    

    Sustituye backup-region por la región en la que quieras almacenar la copia de seguridad.

Crear una función que cree una copia de seguridad

  1. En la Google Cloud consola, ve a la página de funciones de Cloud Run.

    Ve a la página de Cloud Run Functions.

  2. Haz clic en Escribir una función y configura la función de la siguiente manera:

    • Configurar:
      • Nombre del servicio: en este ejemplo, le asignamos el nombre fsbackup a la función.
      • Región: en este ejemplo, selecciona us-central1.
      • Entorno de ejecución: selecciona cualquier entorno de ejecución de Python 3 totalmente compatible con las funciones de Cloud Run en el menú.
    • Activador:
      • No es necesario definir un activador para este ejemplo.
    • Autenticación: selecciona Require authentication.
    • Ingress: selecciona All.
    • Contenedores, volúmenes, redes y seguridad
      • Ve a la pestaña Seguridad y selecciona Service Account for FS Backups-GCF (backupagent@$PROJECT_ID.iam.gserviceaccount.com) en el menú.
  3. Haga clic en Crear y siga con la configuración de la siguiente manera:

    • Punto de entrada de la función: introduce create_backup.
    • Añade las siguientes dependencias a tu archivo requirements.txt:

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

      En función de tu caso práctico, puede que tengas que especificar otras dependencias junto con sus números de versión correspondientes. Para obtener más información, consulta Paquetes preinstalados.

    • Copia el siguiente código de ejemplo de Python en el archivo main.py con el editor insertado:

      Crear una copia de seguridad

      Este código de ejemplo crea una copia de seguridad llamada mybackup- a la que se añade la hora de creación.

      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!"
      

      Haz los cambios siguientes:

      • project-id por el ID de proyecto de la instancia de Filestore de origen. Google Cloud
      • fs-location con la zona o la región de la instancia de Filestore de origen.
      • instance-id con el nombre de la instancia de Filestore de origen.
      • file-share-name con el nombre del recurso compartido de archivos.
      • backup-region con la región en la que quieras almacenar la copia de seguridad.
      1. Haz clic en Probar.

        Se abre una nueva sesión de pestañas en Cloud Shell. Si la acción se realiza correctamente, se devuelve el siguiente mensaje:

        Backup creation has begun!
        
      2. Haga clic en Guardar y volver a implementar y espere a que finalice la implementación.

      3. Vuelve a la pestaña anterior de Cloud Shell.

      Eliminar una copia de seguridad

      Este fragmento de código elimina las copias de seguridad anteriores a un periodo predefinido.

      Solo puedes eliminar una copia de seguridad por instancia de origen a la vez. Para obtener más información, consulta Copias de seguridad.

      Configure esta función de la misma forma que la función que usó para crear una copia de seguridad, pero con las siguientes modificaciones:

      • Nombre de la función: deletefsbackup.
      • Punto de entrada: 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."
      

      Haz los cambios siguientes:

      • project-id con el Google Cloud ID del proyecto de la copia de seguridad.
      • region por la región en la que se encuentra la copia de seguridad. La copia de seguridad, el trabajo del programador y la función deben estar en la misma ubicación.
      • hours con el número de horas que quieres conservar las copias de seguridad. Por ejemplo, si quieres conservar las copias de seguridad durante 10 días, introduce 240.

Asignar roles de gestión de identidades y accesos a las cuentas de servicio del cliente

  1. Añade el agente de servicio de Cloud Scheduler a la política de IAM de la cuenta de servicio de cliente de Cloud Scheduler con el rol roles/cloudscheduler.serviceAgent. De esta forma, el agente de servicio puede suplantar la cuenta de servicio del cliente para invocar la función que crea una copia de seguridad. Ejecuta el 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. Asigna el rol roles/file.editor a la cuenta de servicio de cliente de las funciones de Cloud Run para que pueda hacer llamadas al endpoint de Filestore. Ejecuta el comando projects add-iam-policy-binding:

    gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member=serviceAccount:$GCF_CLIENT_SA \
        --role=roles/file.editor
    
  3. Asigna a la cuenta de servicio de cliente de Cloud Scheduler el rol roles/run.invoker de la función que quieras usar. Ejecuta el siguiente comando run services add-iam-policy-binding:

    Crear una copia de seguridad

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

    Ahora, solo la cuenta de servicio de cliente de Cloud Scheduler puede invocar fsbackup.

    Eliminar una copia de seguridad

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

    Ahora, solo la cuenta de servicio de cliente de Cloud Scheduler puede invocar deletefsbackup.

Crea una tarea de Cloud Scheduler que active la función según una programación específica

Crear una copia de seguridad

  1. En el ejemplo de este tutorial, si quieres programar una copia de seguridad todos los días laborables a las 22:00, debes usar el 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
    

    En la marca --schedule, se especifica la frecuencia con la que se ejecuta el trabajo mediante el formato cron de Unix. Para obtener más información, consulta Configurar programaciones de tareas cron.

    Puedes crear un máximo de seis copias de seguridad por instancia y hora.

  2. Inicia la tarea de Cloud Scheduler que has creado en el paso anterior. En nuestro ejemplo, usa el comando scheduler jobs runs para ejecutarlo inmediatamente:

    gcloud scheduler jobs run fsbackupschedule
    

    El trabajo fsbackupschedule invoca la función fsbackup inmediatamente después de ejecutar el comando y, a continuación, la vuelve a invocar todos los días laborables a las 22:00 hasta que se pausa el trabajo.

  3. Consulta los registros de la función fsbackup para ver si se ejecuta correctamente y devuelve un status 200.

    Para ver tus registros en la Google Cloud consola, usa el explorador de registros:

    1. En la Google Cloud consola, ve a la página Explorador de registros:

      Ve al Explorador de registros.

      Si usas la barra de búsqueda para encontrar esta página, selecciona el resultado cuya sección sea Registro.

      Los registros más recientes se muestran en el panel Resultados de la consulta.

  4. Consulta el estado de las copias de seguridad que ya tengas con el comando backups list:

    gcloud filestore backups list
    

    El comando devuelve algo similar a lo siguiente:

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

Eliminar una copia de seguridad

  1. En el ejemplo de este tutorial, si quieres programar una operación para eliminar una copia de seguridad todos los días de entre semana a las 22:00, debes usar el 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
    

    En la marca --schedule, se especifica la frecuencia con la que se ejecuta el trabajo mediante el formato cron de Unix. Para obtener más información, consulta Configurar programaciones de tareas cron.

    Las operaciones de copia de seguridad delete asociadas a la misma instancia de origen deben realizarse de una en una. Para obtener más información, consulta Copias de seguridad.

  2. Inicia la tarea de Cloud Scheduler que has creado en el paso anterior. En nuestro ejemplo, usamos el comando scheduler jobs runs para ejecutarlo inmediatamente:

    gcloud scheduler jobs run deletefsbackupschedule
    

    El trabajo deletefsbackupschedule invoca la función deletefsbackup inmediatamente después de ejecutar el comando y, a continuación, la vuelve a invocar todos los días laborables a las 22:00 hasta que se pausa el trabajo.

  3. Consulta los registros de la función deletefsbackup para ver si se ejecuta correctamente y devuelve un status 200.

    Para ver tus registros en la Google Cloud consola, usa el explorador de registros:

    1. En la Google Cloud consola, ve a la página Explorador de registros:

      Ve al Explorador de registros.

      Si usas la barra de búsqueda para encontrar esta página, selecciona el resultado cuya sección sea Registro.

      Los registros más recientes se muestran en el panel Resultados de la consulta.

  4. Consulta el estado de las copias de seguridad que ya tengas con el comando backups list:

    gcloud filestore backups list
    

    El comando devuelve algo similar a lo siguiente:

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

Alertas de cuota baja para copias de seguridad

Si tu implementación de la programación de copias de seguridad te pone en riesgo de quedarte sin cuota de copias de seguridad, te recomendamos que configures alertas de cuota de copias de seguridad baja. De esta forma, recibirás una notificación cuando te quede poco espacio de almacenamiento para las copias de seguridad.