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.

Objetivos

  • Crea una cuenta de servicio de cliente para Cloud Scheduler que tenga las credenciales necesarias para invocar una función de Cloud Run Functions.
  • Crea una cuenta de servicio de cliente para las funciones de Cloud Run que tenga las credenciales para llamar al endpoint de Filestore.
  • Crea una función de Cloud Run Functions que cree una copia de seguridad de una instancia de Filestore.
  • Crea una función de Cloud Run Functions que elimine una copia de seguridad de una instancia de Filestore.
  • Crea una tarea de Cloud Scheduler que ejecute cualquiera de las funciones a intervalos regulares.

Costes

En este documento, se utilizan los siguientes componentes facturables de Google Cloud:

Para generar una estimación de costes basada en el uso previsto, utiliza la calculadora de precios.

Los usuarios nuevos Google Cloud pueden disfrutar de una prueba gratuita.

Antes de empezar

  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.

    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 (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. Install the Google Cloud CLI.

  6. Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

  7. Para inicializar gcloud CLI, ejecuta el siguiente 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 (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. Install the Google Cloud CLI.

  12. Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

  13. Para inicializar gcloud CLI, ejecuta el siguiente comando:

    gcloud init
  14. Si no tienes ninguna instancia de Filestore en tu proyecto, primero debes crear una.
  15. 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 ningún 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. En él, se devuelve el siguiente mensaje si la acción se realiza correctamente:

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

    Limpieza

    Cuando hayas terminado el tutorial, puedes eliminar los recursos que has creado para que dejen de usar cuota y generar cargos. En las siguientes secciones se explica cómo eliminar o desactivar dichos recursos.

    Eliminar el proyecto

    La forma más fácil de evitar que te cobren es eliminar el proyecto que has creado para el tutorial.

    Para ello, sigue las instrucciones que aparecen a continuación:

    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.

    Siguientes pasos