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
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
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
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 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ú.
- 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. Si la acción se realiza correctamente, se devuelve el siguiente mensaje:
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 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
.
- Punto de entrada de la función: introduce
Asignar roles de gestión de identidades y accesos a las cuentas de servicio del cliente
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
.
Crea una tarea de Cloud Scheduler que active la función según una programación específica
Crear una copia de seguridad
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
Eliminar una copia de seguridad
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
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.