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:
- Artifact Registry API
- Cloud Build API
- Filestore API
- Cloud Functions API
- Cloud Logging API
- Pub/Sub API
- Cloud Run Admin API
- Cloud Scheduler API
Para generar una estimación de costes basada en el uso previsto,
utiliza la calculadora de precios.
Antes de empezar
- 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.
-
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 theresourcemanager.projects.create
permission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
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 theserviceusage.services.enable
permission. Learn how to grant roles. -
Install the Google Cloud CLI.
-
Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.
-
Para inicializar gcloud CLI, ejecuta el siguiente comando:
gcloud init
-
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 theresourcemanager.projects.create
permission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
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 theserviceusage.services.enable
permission. Learn how to grant roles. -
Install the Google Cloud CLI.
-
Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.
-
Para inicializar gcloud CLI, ejecuta el siguiente comando:
gcloud init
- Si no tienes ninguna instancia de Filestore en tu proyecto, primero debes crear una.
Si aún no lo has hecho, en la consola Google Cloud , haz clic en Activar Cloud Shell.
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 nombreschedulerunner
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"
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
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.
En la Google Cloud consola, ve a la página de funciones de Cloud Run.
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ú.
- Nombre del servicio: en este ejemplo, le asignamos el nombre
- 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ú.
- Ve a la pestaña Seguridad y selecciona
- Configurar:
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.
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!
Haga clic en Guardar y volver a implementar y espere a que finalice la implementación.
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
.
- Punto de entrada de la función: introduce
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 comandoiam 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
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 comandoprojects add-iam-policy-binding
:gcloud projects add-iam-policy-binding $PROJECT_ID \ --member=serviceAccount:$GCF_CLIENT_SA \ --role=roles/file.editor
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 comandorun 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
.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.
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ónfsbackup
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.Consulta los registros de la función
fsbackup
para ver si se ejecuta correctamente y devuelve unstatus 200
.Para ver tus registros en la Google Cloud consola, usa el explorador de registros:
-
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.
-
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
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.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óndeletefsbackup
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.Consulta los registros de la función
deletefsbackup
para ver si se ejecuta correctamente y devuelve unstatus 200
.Para ver tus registros en la Google Cloud consola, usa el explorador de registros:
-
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.
-
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
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
- Consulta información sobre las capturas de Filestore.
- Más información sobre las copias de seguridad de Filestore
- Consulta cómo programar copias de Filestore Enterprise.
Crear cuentas de servicio de cliente para funciones de Cloud Scheduler y Cloud Run
Configurar variables de entorno
Define las siguientes variables de entorno en tu entorno local:
Crear una función que cree una copia de seguridad
Asignar roles de gestión de identidades y accesos a las cuentas de servicio del cliente
Crea una tarea de Cloud Scheduler que active la función según una programación específica
Crear una copia de seguridad
Eliminar una copia de seguridad
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: