Una de las principales cosas que se recomiendan al comenzar a trabajar en la nube es AUTOMATIZAR, pero comenzar este proceso puede ser un recorrido del cual no sabemos dónde comenzar. En este blog se propone que comencemos con lo que todo ambiente debe de tener en cuenta, BACKUPS, para eso usaremos la api de 2 servicios, EVS y IMS .
Antes de seguir adelante asegurarse de cumplir con los siguientes requerimientos
Como primera fase tendremos que agregar las librerías que necesitamos y configuraremos variables, al menos las siguientes para poder crear ya sea el snapshot o la imagen, en este caso será el snapshoot.
# -*- coding:utf-8 -*- import time import sys import requests import json from threading import Thread from datetime import datetime, timedelta def handler(event, context): projectId = context.getUserData(“projectId”, “”).strip() region = context.getUserData(“region”, “”).strip() volumeIds = context.getUserData(“volumeIds”, “”).strip().split(“,”) volumeNames = context.getUserData(“volumeNames”, “”).strip().split(“,”) retentionPeriod = context.getUserData(“retentionPeriod”, “”).strip() logger = context.getLogger() token = context.getToken() snapshotUrl = f”https://evs.{region}.myhuaweicloud.com/v2/{projectId}/snapshots” _create_snapshots(logger, token, volumeIds, volumeNames, snapshotUrl) |
Ahora a la función que deseo que cree los snapshots
para no tener que crear una función por cada disco, es que se maneja todo como strings de datos. para los snapshots es simple ya que solo tenemos un tipo de snapshoot.
Pero en el caso de las imágenes debemos recordar que tenemos system disk y data disk images, y aparte full ecs images.
En la documentación hay ejemplos de cada una de estos tipos.
En la primera función se encarga de ordenar cada uno de los valores de las variables de estado y luego las usamos en _create_snapshot como la API en su documentación lo muestra.
def _create_snapshots(logger, token, volumeIds, volumeNames, snapshotUrl): threads = [] for volumeNum in range(len(volumeIds)): t = Thread(target=_create_snapshot,args=(logger, token, volumeIds[volumeNum], volumeNames[volumeNum], snapshotUrl)) t.start() threads.append(t) if not threads: logger.info(“no snapshot(s) to create.”) return 0 logger.info(f”{len(threads)} snapshot(s) will be created.”) for t in threads: t.join() def _create_snapshot(logger, token, volumeId, volumeName, snapshotUrl): now = datetime.now().strftime(“%Y-%m-%d-%H:%M:%S”) snapshotName = f”{volumeName}-{now}” authHeader = {“X-Auth-Token”: token, “Content-Type” : “application/json”} snapshotRequestBody = { “snapshot”: { “name”: snapshotName, “volume_id”: volumeId, “force”: True } } snapshotRequest = requests.post( snapshotUrl, data=json.dumps(snapshotRequestBody), headers=authHeader ) statusCode = snapshotRequest.status_code if statusCode == 202: logger.info(f”Snapshot {snapshotName} created successfully.”) return 0 else: logger.info(f”Snapshot {snapshotName} wasn’t able to be created.”) logger.info(json.dumps(snapshotRequest.json())) return 2 |
Claro que podemos crear una función para eliminar o quizás manejar diferentes funciones por disco o podríamos en una misma función con diferentes DEF hacer todo.
Lo siguiente es configurar un trigger para la función.
la recomendación del blog será hacer una simple cron expressions
De necesitar apoyo haciendo tu propia función, no dudes en contactarnos clic AQUÍ
AUTOR: Juan Rafael Roque