Restaura archivos desde una instantánea EBS

LinuxBeginner
Practicar Ahora

Introducción

Se ha eliminado un archivo de informe y tu equipo necesita recuperarlo desde una copia de seguridad probada. Prepararás datos de informe sintéticos, tomarás una instantánea EBS, eliminarás deliberadamente el archivo del ejercicio y restaurarás su contenido anterior en un volumen nuevo. Verificarás la respuesta recuperada de la aplicación antes de limpiar los recursos.

Debes conocer ya cómo crear, adjuntar, formatear y montar un volumen de datos EBS. Este entorno independiente proporciona su propia imagen, red y par de claves; no reutiliza recursos de un laboratorio anterior.

Relación con la certificación

La copia de seguridad y la recuperación mediante instantáneas apoyan los conceptos de almacenamiento de la tarea 3.6 de los objetivos del dominio 3 de AWS Certified Cloud Practitioner CLF-C02.

Lanza el servidor de recuperación

En este paso, lanzarás la instancia de la aplicación e identificarás su zona de disponibilidad.

Empieza en tu espacio de trabajo y carga los identificadores de recursos proporcionados:

cd /home/labex/project
source launch.env

Lanza una instancia llamada recovery-server. La imagen ya contiene una aplicación de informes; tu trabajo consiste en proporcionarle su volumen de datos:

aws ec2 \
  run-instances \
  --image-id "$AMI_ID" \
  --instance-type t3.micro \
  --subnet-id "$SUBNET_ID" \
  --security-group-ids "$SECURITY_GROUP_ID" \
  --key-name report-key \
  --count 1 \
  --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=recovery-server}]'

Obtén el identificador de la instancia mediante su etiqueta de nombre:

INSTANCE_ID=$(aws ec2 \
  describe-instances \
  --filters Name=tag:Name,Values=recovery-server \
  --query 'Reservations[0].Instances[0].InstanceId' \
  --output text)

Espera a que la instancia esté en ejecución:

aws ec2 \
  wait instance-running \
  --instance-ids "$INSTANCE_ID"

Una zona de disponibilidad es una ubicación aislada dentro de una región. Un volumen EBS se adjunta a una instancia de la misma zona de disponibilidad. Consulta la zona de la instancia en lugar de adivinarla:

AVAILABILITY_ZONE=$(aws ec2 \
  describe-instances \
  --instance-ids "$INSTANCE_ID" \
  --query 'Reservations[0].Instances[0].Placement.AvailabilityZone' \
  --output text)

Inspecciona el estado y la zona:

aws ec2 \
  describe-instances \
  --instance-ids "$INSTANCE_ID" \
  --query 'Reservations[].Instances[].{Instance:InstanceId,State:State.Name,Zone:Placement.AvailabilityZone}'

Confirma running. Abre AWS View, pulsa Refresh resources, selecciona recovery-server y pulsa Check application. Confirma HTTP 200 antes de añadir almacenamiento.

Prepara el informe de origen

En este paso, crearás un volumen de datos original y escribirás el informe sintético del que harás una copia de seguridad.

Amazon EBS proporciona almacenamiento de bloques para EC2. Un volumen es un recurso similar a un disco, mientras que un sistema de archivos organiza los archivos de ese disco. Adjuntar un volumen hace que su dispositivo de bloques esté disponible; no crea un sistema de archivos. La guía de volúmenes EBS describe la conexión y la persistencia de los volúmenes.

Crea un volumen SSD de uso general pequeño y vacío. gp3 selecciona el tipo de volumen, --size 1 solicita un GiB y la variable de zona lo sitúa junto a tu instancia. Guarda su identificador para las operaciones posteriores:

VOLUME_ID=$(aws ec2 \
  create-volume \
  --availability-zone "$AVAILABILITY_ZONE" \
  --size 1 \
  --volume-type gp3 \
  --tag-specifications 'ResourceType=volume,Tags=[{Key=Name,Value=source-report}]' \
  --query 'VolumeId' \
  --output text)

Espera a que el nuevo volumen esté disponible:

aws ec2 \
  wait volume-available \
  --volume-ids "$VOLUME_ID"

Adjúntalo con el nombre de dispositivo de la API /dev/sdf:

aws ec2 \
  attach-volume \
  --volume-id "$VOLUME_ID" \
  --instance-id "$INSTANCE_ID" \
  --device /dev/sdf

Espera a que termine la conexión:

aws ec2 \
  wait volume-in-use \
  --volume-ids "$VOLUME_ID"

Inspecciona el volumen y su conexión:

aws ec2 \
  describe-volumes \
  --volume-ids "$VOLUME_ID" \
  --query 'Volumes[].{Volume:VolumeId,State:State,Zone:AvailabilityZone,Size:Size,Type:VolumeType,Attachments:Attachments}'

Confirma in-use, el tamaño 1, el tipo gp3 y una conexión a tu instancia. Actualiza AWS View e inspecciona la fila del volumen. El volumen raíz es independiente del nuevo volumen de datos.

Consulta la dirección pública actual de la instancia:

PUBLIC_IP=$(aws ec2 \
  describe-instances \
  --instance-ids "$INSTANCE_ID" \
  --query 'Reservations[0].Instances[0].PublicIpAddress' \
  --output text)

Conéctate con la configuración SSH proporcionada:

ssh -F ssh_config ubuntu@"$PUBLIC_IP"

Dentro de la instancia, inspecciona el dispositivo recién adjuntado. Su nombre en Linux en este laboratorio es /dev/xvdf; los nombres de dispositivo pueden diferir del nombre de conexión de la API. Otras imágenes EC2 pueden mostrar nombres NVMe, por lo que debes identificar un disco antes de operar sobre él. La guía oficial de preparación de volúmenes en Linux explica esta diferencia.

lsblk -f /dev/xvdf

Confirma que el dispositivo no tenga tipo de sistema de archivos. Crea un sistema de archivos ext4 únicamente en este volumen de datos recién creado y vacío. Formatear un volumen con datos existentes los borraría:

sudo mkfs.ext4 /dev/xvdf

Un punto de montaje es el directorio a través del cual accedes a un sistema de archivos. Monta el nuevo sistema de archivos en el directorio preparado para la aplicación de informes:

sudo mount /dev/xvdf /srv/reports

Confirma el dispositivo de origen, el sistema de archivos y el punto de montaje:

findmnt /srv/reports

Busca /dev/xvdf, ext4 y /srv/reports. Crea un informe CSV con datos sintéticos. sudo tee escribe en el sistema de archivos propiedad del administrador; el documento incrustado entre comillas conserva las dos líneas:

sudo tee /srv/reports/report.csv <<'CSV'
period,total
Q1,320
CSV

Vuelve a leer el archivo:

cat /srv/reports/report.csv

Vuelve al terminal de LabEx:

exit

En AWS View, selecciona recovery-server y pulsa Read volume report. Confirma HTTP 200 y el texto CSV period,total y Q1,320. Esta respuesta demuestra que la aplicación puede leer el archivo del volumen montado.

El montaje de este laboratorio es manual. Un reinicio no restaura automáticamente un montaje manual; en producción normalmente se configura el UUID del sistema de archivos en /etc/fstab después de probar la entrada.

Toma una instantánea consistente

En este paso, pausarás el acceso al sistema de archivos y harás una copia de seguridad del volumen de origen.

Una instantánea EBS es una copia de seguridad de un volumen en un momento determinado. Una copia debe incluir los datos que necesitas, no solo mostrar un estado de recurso correcto. AWS recomienda pausar las escrituras o desmontar el volumen para mantener la consistencia, como explica la guía de creación de instantáneas. Este laboratorio desmonta el sistema de archivos de datos antes de hacer la copia.

Conéctate a la instancia:

ssh -F ssh_config ubuntu@"$PUBLIC_IP"

Desmonta el sistema de archivos de origen para vaciar las escrituras y detener el acceso al sistema de archivos:

sudo umount /srv/reports

Vuelve al terminal de LabEx:

exit

Crea una instantánea de tu volumen de origen. Guarda su identificador y etiquétala como report-backup:

SNAPSHOT_ID=$(aws ec2 \
  create-snapshot \
  --volume-id "$VOLUME_ID" \
  --description 'Report before accidental deletion' \
  --tag-specifications 'ResourceType=snapshot,Tags=[{Key=Name,Value=report-backup}]' \
  --query 'SnapshotId' \
  --output text)

La creación de instantáneas es asíncrona. Espera a que termine:

aws ec2 \
  wait snapshot-completed \
  --snapshot-ids "$SNAPSHOT_ID"

Inspecciona su estado y volumen de origen:

aws ec2 \
  describe-snapshots \
  --snapshot-ids "$SNAPSHOT_ID" \
  --query 'Snapshots[].{Snapshot:SnapshotId,State:State,SourceVolume:VolumeId}'

Confirma completed y el volumen de origen esperado. Actualiza AWS View para inspeccionar la instantánea. Probarás su contenido restaurándola después de eliminar deliberadamente un archivo.

Observa una eliminación accidental de archivo

En este paso, eliminarás el informe sintético del volumen de origen y observarás la ausencia del informe en la aplicación.

Vuelve a conectarte y a montar el volumen original:

ssh -F ssh_config ubuntu@"$PUBLIC_IP"
sudo mount /dev/xvdf /srv/reports

Elimina únicamente el archivo sintético que creaste para este ejercicio:

sudo rm /srv/reports/report.csv

Vuelve al terminal de LabEx:

exit

En AWS View, selecciona recovery-server y pulsa Read volume report. La solicitud debe seguir devolviendo HTTP 200, pero report ahora es null. La aplicación está en ejecución; falta el archivo que necesita. Esto distingue un problema de contenido del almacenamiento de un problema de servidor detenido.

Tu instantánea se creó antes de esta eliminación. Puede proporcionar un nuevo volumen con el informe anterior sin modificar el volumen original.

Restaura un volumen nuevo desde la instantánea

En este paso, restaurarás la copia de seguridad en un volumen independiente y cambiarás la aplicación al sistema de archivos recuperado.

La restauración crea un volumen nuevo; no deshace los cambios del volumen existente. Crea el sustituto en la zona de disponibilidad de la instancia usando tu instantánea completada. La guía oficial de restauración describe este flujo de sustitución:

RESTORED_VOLUME_ID=$(aws ec2 \
  create-volume \
  --availability-zone "$AVAILABILITY_ZONE" \
  --snapshot-id "$SNAPSHOT_ID" \
  --volume-type gp3 \
  --tag-specifications 'ResourceType=volume,Tags=[{Key=Name,Value=recovered-report}]' \
  --query 'VolumeId' \
  --output text)

Espera a que esté listo:

aws ec2 \
  wait volume-available \
  --volume-ids "$RESTORED_VOLUME_ID"

Adjúntalo como segundo dispositivo de datos:

aws ec2 \
  attach-volume \
  --volume-id "$RESTORED_VOLUME_ID" \
  --instance-id "$INSTANCE_ID" \
  --device /dev/sdg
aws ec2 \
  wait volume-in-use \
  --volume-ids "$RESTORED_VOLUME_ID"

Inspecciona la relación del volumen sustituto con la instantánea:

aws ec2 \
  describe-volumes \
  --volume-ids "$RESTORED_VOLUME_ID" \
  --query 'Volumes[].{Volume:VolumeId,State:State,Snapshot:SnapshotId}'

Confirma in-use y el identificador de instantánea guardado. Conéctate para cambiar el montaje de la aplicación:

ssh -F ssh_config ubuntu@"$PUBLIC_IP"

Desmonta el sistema de archivos original:

sudo umount /srv/reports

Inspecciona el dispositivo recuperado, que aparece como /dev/xvdg en este laboratorio:

sudo lsblk -f /dev/xvdg

Ya contiene un sistema de archivos ext4 copiado de la copia de seguridad. No formatees este dispositivo: el formateo sobrescribiría los datos restaurados. Monta su sistema de archivos existente en el directorio de informes de la aplicación:

sudo mount /dev/xvdg /srv/reports

Confirma el origen activo:

findmnt /srv/reports

Busca /dev/xvdg. Lee el informe recuperado:

cat /srv/reports/report.csv

Espera las dos líneas originales, period,total y Q1,320. Vuelve al terminal de LabEx:

exit

En AWS View, pulsa Refresh resources, selecciona recovery-server y pulsa Read volume report. Confirma HTTP 200 y el texto CSV original. Una prueba de restauración correcta demuestra que esta copia contiene datos utilizables por la aplicación.

Elimina los recursos de recuperación

En este paso, limpiarás ambos volúmenes de datos, la instantánea y la instancia.

Conéctate y desmonta el sistema de archivos recuperado:

ssh -F ssh_config ubuntu@"$PUBLIC_IP"
sudo umount /srv/reports
exit

Separa el volumen recuperado:

aws ec2 \
  detach-volume \
  --volume-id "$RESTORED_VOLUME_ID" \
  --instance-id "$INSTANCE_ID" \
  --device /dev/sdg
aws ec2 \
  wait volume-available \
  --volume-ids "$RESTORED_VOLUME_ID"

El sistema de archivos de origen se desmontó durante la restauración. Separa también su volumen:

aws ec2 \
  detach-volume \
  --volume-id "$VOLUME_ID" \
  --instance-id "$INSTANCE_ID" \
  --device /dev/sdf
aws ec2 \
  wait volume-available \
  --volume-ids "$VOLUME_ID"

Elimina los dos volúmenes separados del ejercicio:

aws ec2 \
  delete-volume \
  --volume-id "$RESTORED_VOLUME_ID"
aws ec2 \
  delete-volume \
  --volume-id "$VOLUME_ID"

Elimina la copia de seguridad del ejercicio después de probar su restauración:

aws ec2 \
  delete-snapshot \
  --snapshot-id "$SNAPSHOT_ID"

Termina tu servidor y espera a que alcance su estado final:

aws ec2 \
  terminate-instances \
  --instance-ids "$INSTANCE_ID"
aws ec2 \
  wait instance-terminated \
  --instance-ids "$INSTANCE_ID"

Confirma que la instancia haya terminado:

aws ec2 \
  describe-instances \
  --instance-ids "$INSTANCE_ID" \
  --query 'Reservations[].Instances[].{Instance:InstanceId,State:State.Name}'

Enumera los volúmenes y la copia de seguridad del ejercicio mediante sus nombres:

aws ec2 \
  describe-volumes \
  --filters Name=tag:Name,Values=source-report,recovered-report \
  --query 'Volumes[].VolumeId'
aws ec2 \
  describe-snapshots \
  --filters Name=tag:Name,Values=report-backup \
  --query 'Snapshots[].SnapshotId'

Ambas listas deben ser []. Actualiza AWS View y confirma que los volúmenes y la instantánea del ejercicio hayan desaparecido y que el servidor ya no sea un destino en ejecución. Conserva la red y el par de claves preparados.

Resumen

Hiciste una copia de un volumen de informes mediante una instantánea EBS, observaste el efecto de eliminar un archivo y restauraste un volumen independiente desde la copia. Montaste el sistema de archivos recuperado existente sin formatearlo y verificaste los datos originales de la aplicación. Por último, eliminaste ambos volúmenes de datos, la instantánea y la instancia.