Programar copias de seguridad


En este instructivo, se muestra cómo programar copias de seguridad para instancias de Filestore de nivel HDD básico y SSD básico con Cloud Scheduler y Cloud Functions.

Objetivos

  • Crear una cuenta de servicio de cliente para Cloud Scheduler que tenga las credenciales necesarias a fin de invocar una función de Cloud Functions.
  • Crear una cuenta de servicio de cliente a fin de que la use Cloud Functions con las credenciales para llamar al extremo de Filestore.
  • Crear una función de Cloud Functions que cree (o borre) una copia de seguridad de un archivo compartido.
  • Crear un trabajo de Cloud Scheduler que ejecute la función de crear copias de seguridad (o borre copias de seguridad) a intervalos regulares.

Costos

En este documento, usarás los siguientes componentes facturables de Google Cloud:

Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios. Es posible que los usuarios nuevos de Google Cloud califiquen para obtener una prueba gratuita.

Antes de comenzar

  1. Accede a tu cuenta de Google Cloud. Si eres nuevo en Google Cloud, crea una cuenta para evaluar el rendimiento de nuestros productos en situaciones reales. Los clientes nuevos también obtienen $300 en créditos gratuitos para ejecutar, probar y, además, implementar cargas de trabajo.
  2. En la página del selector de proyectos de la consola de Google Cloud, selecciona o crea un proyecto de Google Cloud.

    Ir al selector de proyectos

  3. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.

  4. Habilita las API de Cloud Scheduler, Cloud Functions, and Filestore.

    Habilita las API

  5. Instala Google Cloud CLI.
  6. Para inicializar la CLI de gcloud, ejecuta el siguiente comando:

    gcloud init
  7. En la página del selector de proyectos de la consola de Google Cloud, selecciona o crea un proyecto de Google Cloud.

    Ir al selector de proyectos

  8. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.

  9. Habilita las API de Cloud Scheduler, Cloud Functions, and Filestore.

    Habilita las API

  10. Instala Google Cloud CLI.
  11. Para inicializar la CLI de gcloud, ejecuta el siguiente comando:

    gcloud init
  12. Si no tienes una instancia de Filestore en tu proyecto, primero debes crear una.

Crea cuentas de servicio de cliente para Cloud Scheduler y Cloud Functions

  1. Crea una cuenta de servicio de cliente que Cloud Scheduler ejecute para invocar una función de Cloud Functions. En este ejemplo, usa el comando iam service-accounts create para asignarle el nombre schedulerunner a la cuenta y establecer el nombre visible en "Cuenta de servicio para el programador de copias de seguridad de FS":

    gcloud iam service-accounts create schedulerunner \
        --display-name="Service Account for FS Backups-Scheduler"
    
  2. Crea una cuenta de servicio de cliente que Cloud Functions ejecute para llamar al extremo de Filestore. Para este ejemplo, asignaremos un nombre a la cuenta backupagent y estableceremos el nombre comercial como “Cuenta de servicio para FS Backups-GCF”:

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

    Para verificar si se creó la cuenta de servicio, ejecuta el comando iam service-accounts list:

    gcloud iam service-accounts list
    

    El comando muestra algo como lo siguiente:

    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
    

Configura variables de entorno

Configura las siguientes variables de entorno en tu entorno local:

  • ID del proyecto y proyecto de Google Cloud:

    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 de cliente de Cloud Scheduler y Cloud Functions deben hacer lo siguiente:

    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 FS_ZONE=zone
    export INSTANCE_NAME=instance-id
    export SHARE_NAME=datafile-share-name
    

    Reemplaza lo siguiente:

    • zone por la zona en la que se encuentra la instancia de Filestore.
    • instance-id por el ID de la instancia de la instancia de Filestore.
    • file-share-name por el nombre que especificas para el recurso compartido de archivos NFS que se entrega desde la instancia.
  • Configura las variables de entorno para la copia de seguridad de Filestore:

    export FS_BACKUP_LOCATION=region
    

    Reemplaza region por la región en la que deseas almacenar la copia de seguridad.

Crea una función que cree una copia de seguridad

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

    Ir a la página Cloud Functions

  2. Haz clic en Crear función y configúrala como se muestra a continuación:

    • Conceptos básicos:
      • Nombre de la función: Para este ejemplo, se llama a la función fsbackup.
      • Región: En este ejemplo, usamos us-central1.
    • Activador:
      • Tipo de activador: HTTP
      • Autenticación: Require authentication
    • Configuración de entorno de ejecución, compilación y conexión:
      • Cuenta de servicio del entorno de ejecución: Service Account for FS Backups-GCF (backupagent@$PROJECT_ID.iam.gserviceaccount.com).
      • Configuración de entrada: Allow all traffic
    • Código fuente: Inline editor.
    • Entorno de ejecución: Python 3.7.
    • Punto de entrada: create_backup.
    • En requirements.txt, agrega las siguientes dependencias:

      google-auth==1.19.2
      requests==2.24.0
      
    • Copia la siguiente muestra de código de Python en el editor directo main.py:

      Crea copias de seguridad

      Esta muestra de código crea una copia de seguridad llamada mybackup- anexada a la hora de creación.

      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/v1beta1/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'])
      

      Reemplaza lo siguiente:

      • project-id por el ID del proyecto de Google Cloud de la instancia de origen de Filestore
      • filestore-zone por la zona de la instancia de Filestore de origen
      • filestore-name por el nombre de la instancia de Filestore de origen
      • file-share-name por el nombre del recurso compartido de archivos
      • backup-region por la región para almacenar la copia de seguridad

      Borra copias de seguridad

      En esta muestra de código, se borran las copias de seguridad que son más antiguas que un período predefinido.

      Configura esta función de la misma manera que la función de crear copias de seguridad, excepto la siguiente:

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

      Reemplaza lo siguiente:

      • project-id por el ID del proyecto de Google Cloud de la copia de seguridad
      • region por la región en la que residen las copias de seguridad
      • hours por la cantidad de horas que se retendrán las copias de seguridad Por ejemplo, si deseas conservar las copias de seguridad durante 10 días, ingresa 240.

Asigna funciones de IAM a las cuentas de servicio de cliente

  1. Agrega el agente de servicio de Cloud Scheduler a la política de IAM de la cuenta de servicio del cliente de Cloud Scheduler con la función roles/cloudscheduler.serviceAgent. Esto permite que el agente de servicio suplante la identidad de 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. Otorga a la cuenta de servicio del cliente de Cloud Functions la función roles/file.editor para que pueda realizar llamadas al extremo 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. Otorga a la cuenta de servicio cliente de Cloud Scheduler el rol roles/cloudfunctions.invoker para la función fsbackup. Ejecuta el siguiente comando functions add-iam-policy-binding:

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

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

Crea un trabajo de Cloud Scheduler que active la función fsbackup según un programa específico

  1. En el ejemplo de este instructivo, si quisieras programar una copia de seguridad todos los días de la semana a las 10 p.m., deberías usar el comando scheduler jobs create http:

    gcloud beta 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
    

    La marca --schedule es la ubicación en la que especificas la frecuencia en la que se ejecuta el trabajo con el formato unix-cron. Para obtener más información, consulta Configura programas de trabajos cron.

  2. Inicia el trabajo de Cloud Scheduler que creaste en el paso anterior. En nuestro ejemplo, usa el comando scheduler jobs runs:

    gcloud scheduler jobs run fsbackupschedule
    

    El trabajo fsbackupschedule invoca la función “fsbackups” de inmediato una vez que ejecutas el comando y, luego, la vuelve a invocar todos los días de la semana a las 10 p.m. hasta que se pausa el trabajo.

  3. Verifica los registros de la función fsbackups para ver si la función se ejecuta de forma correcta y muestra una status 200.

  4. Verifica si la copia de seguridad se creó con el comando backups list:

    gcloud beta filestore backups list
    

    El comando muestra 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 implica un riesgo de que se agote la cuota de copias de seguridad, te recomendamos que configures las alertas de cuota de copias de seguridad bajas. De esta manera, se te notificará cuando se agote la cuota de copias de seguridad.

Limpia

Una vez que completes el instructivo, puedes limpiar los recursos que creaste para que dejen de usar la cuota y generar cargos. En las siguientes secciones, se describe cómo borrar o desactivar estos recursos.

Borra el proyecto

La manera más fácil de eliminar la facturación es borrar el proyecto que creaste para el instructivo.

Para borrar el proyecto, haz lo siguiente:

  1. En la consola de Google Cloud, ve a la página Administrar recursos.

    Ir a Administrar recursos

  2. En la lista de proyectos, elige el proyecto que quieres borrar y haz clic en Borrar.
  3. En el diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrar el proyecto.

¿Qué sigue?