2011-03-11 20 views

Respuesta

7

No sé de qué forma puede 'restaurar' un volumen adjunto, pero la forma en que lo haría es crear un volumen a partir de la instantánea, luego separar el original y adjuntar el nuevo.

0

Cree un volumen a partir de la instantánea para montar el volumen en una máquina EC2 existente y copiar archivos desde ella.

Compruebe la máquina EC2.

  1. Elija una instancia. Pestaña EC2 | INSTANCES | Instancias.
  2. Anote la zona de disponibilidad de la máquina EC2.

Crear un volumen.

  1. Busque la instantánea desde la que desea copiar los archivos y marque la casilla. TIENDA BLOQUE ELÁSTICA | Instantáneas
  2. Haga clic en el botón Crear volumen y rellene los campos. o El tamaño debe ser mayor que el tamaño de la instantánea (las microinstancias gratuitas obtienen un volumen de 8 GB). o La zona de disponibilidad debe ser la misma que la de la máquina EC2. o La instantánea ya está seleccionada, más o menos como snap12345678 - mi descripción.
  3. Haga clic en Sí, botón Crear. Aparece una nueva línea en la tabla de Volúmenes. TIENDA BLOQUE ELÁSTICA | Volúmenes

Coloque el volumen.

  1. Haga clic en el botón Adjuntar volumen y rellene los campos.
  2. El valor de volumen ya está allí.
  3. Seleccione el nombre de su máquina i-12345678 (ejecutándose) de la lista desplegable de instancias.
  4. El campo Dispositivos muestra el primer nombre de dispositivo disponible, como/dev/sdf. ¿Alguien se molesta en cambiar este valor?
  5. Haga clic en Sí, botón Crear. Un nuevo dispositivo aparece mágicamente en la máquina EC2.
  6. Cierre la consola de AWS.
+0

Copypasta de http://www.techrepublic.com/blog/the-enterprise-cloud/copias-up-and-restauración-instantáneas-on-EC2-máquinas amazonas/ – bwerks

+0

'/ dev/sdf' "¿alguien se molestó en cambiar este valor?" - Sí, si estoy reemplazando el volumen raíz, lo fijo a '/ dev/sda1' (que era mi configuración de volumen de raíz) – Randall

7

Si tiene una instancia de EC2 en ejecución y desea restaurarla al estado capturado en una instantánea anterior, debe detener la instancia, separar su volumen actual, crear un nuevo volumen a partir de la instantánea, adjunte el nuevo volumen a su instancia y reinicie su instancia. Además, hay un par de sutilezas alrededor de la especificación de la zona de disponibilidad del nuevo volumen y el nombre del dispositivo al desconectar/volver a conectar el volumen.

La lógica podría ser más fácil de ver si lo hace desde la línea de comandos, en lugar de desde la interfaz de usuario web de AWS.

el siguiente script bash es no aptos para su uso en producción, ya que carece de cualquier comprobación de errores y que sólo se utiliza sleep lugar de votación para garantizar comandos de AWS han completado. Pero lo hace ejecutar todos los puntos con éxito:

#!/bin/bash 

set -e 

# IN PARAMS 
INSTANCE_ID=<YOUR_INSTANCE_ID_HERE> 
SNAPSHOT_ID=<YOUR_SNAPSHOT_ID_HERE> 
# OUT PARAMS 
VOLUME_ID= 

# begin execution 

echo "Gathering information about the instance" 
DEVICE_NAME=`ec2-describe-instance-attribute ${INSTANCE_ID} --block-device-mapping | awk '{print $2}'` 
OLD_VOLUME_ID=`ec2-describe-instance-attribute ${INSTANCE_ID} --block-device-mapping | awk '{print $3}'` 
echo "Found instance ${INSTANCE_ID} has volume ${OLD_VOLUME_ID} on device ${DEVICE_NAME}" 

echo "Creating new volume from snapshot" 
AVAILABILITY_ZONE=`ec2-describe-availability-zones --filter state=available | head -n 1 | awk '{print $2}'` 
VOLUME_ID=`ec2-create-volume --availability-zone ${AVAILABILITY_ZONE} --snapshot ${SNAPSHOT_ID} | awk '{print $2}'` 
echo "Created new volume: ${VOLUME_ID}" 

sleep 20 

echo "Stopping the instance" 
ec2-stop-instances $INSTANCE_ID 

sleep 20 

echo "Detaching current volume" 
ec2-detach-volume $OLD_VOLUME_ID --instance $INSTANCE_ID --device $DEVICE_NAME 

sleep 20 

echo "Attaching new volume" 
ec2-attach-volume $VOLUME_ID --instance $INSTANCE_ID --device $DEVICE_NAME 

sleep 20 

echo "Starting the instance" 
ec2-start-instances $INSTANCE_ID 
+0

wow ... gracias por esto! ... estaba haciendo un chequeo y en realidad está funcionando, excepto por: ec2-start-instance y ec2-stop-instances parece funcionar ahora como ec2start y ec2stop. También tuve que especificar la región en todos los comandos con --region ya que para mí no era la predeterminada. – Rafael

+0

También me di cuenta que no podía conectar los volúmenes a los casos que no están en la misma zona de disponibilidad así que tuve que modificar el script para usar la misma zona de disponibilidad esa instancia. – Rafael

+0

@Rafael Gracias por estos comentarios. Arreglé ec2- {start, stop} -instance, que debería haber sido ec2- {start, stop} -instances. Pero tienes razón: esto también debería consultar y verificar la zona de disponibilidad. Al final, escribí un script de python que maneja eso, y usa encuestas en lugar de sleep. Bash se vuelve bastante difícil de manejar. – algal

1

Para reemplazar un volumen unido a una instancia con un nuevo volumen creado a partir de una instantánea:

  1. crear un volumen de la instantánea en la misma zona de disponibilidad la instancia está en (clic derecho en la instantánea y haga clic en "crear el volumen de instantánea")
  2. posible para detener la instancia para evitar cualquier aplicación de estrellarse. Espere hasta que la instancia se detenga.
  3. Escriba el nombre exacto del dispositivo del volumen original (está escrito en la consola de AWS en vista de instancias o volúmenes)
  4. Separe el volumen anterior, elimínelo después si no lo necesita.
  5. Acople el volumen recién creado (de la instantánea) a la instancia con el mismo nombre del dispositivo.
  6. iniciar la instancia de nuevo
0

He retocado el guión proporcionado por @algal utilizar la CLI AWS y el sondeo en lugar de sueño. También buscará la última instantánea del volumen dado.

#!/bin/bash 

set -e 

# IN PARAMS 
RECOVERY_INSTANCE_ID= 
SNAPSHOT_VOLUME_ID= 

echo "Gathering information about the instance" 
BLOCK_DEVICE_MAPPING=`aws ec2 describe-instance-attribute --instance-id ${RECOVERY_INSTANCE_ID} --attribute blockDeviceMapping` 
DEVICE_NAME=`echo ${BLOCK_DEVICE_MAPPING} | jq '.BlockDeviceMappings[0].DeviceName' | tr -d '"'` 
OLD_VOLUME_ID=`echo ${BLOCK_DEVICE_MAPPING} | jq '.BlockDeviceMappings[0].Ebs.VolumeId' | tr -d '"'` 
AVAILABILITY_ZONE=`aws ec2 describe-instances --filters "Name=instance-id,Values='${RECOVERY_INSTANCE_ID}'" | jq '.Reservations[0].Instances[0].Placement.AvailabilityZone' | tr -d '"'` 
LATEST_SNAPSHOT_ID=`aws ec2 describe-snapshots --filter "Name=volume-id,Values='${SNAPSHOT_VOLUME_ID}'" | jq '.[]|max_by(.StartTime)|.SnapshotId' | tr -d '"'` 
echo "Found instance ${RECOVERY_INSTANCE_ID} in ${AVAILABILITY_ZONE} has volume ${OLD_VOLUME_ID} on device ${DEVICE_NAME}" 

echo "Creating new volume from snapshot ${LATEST_SNAPSHOT_ID}" 
NEW_VOLUME_ID=`aws ec2 create-volume --region eu-west-1 --availability-zone ${AVAILABILITY_ZONE} --snapshot-id ${LATEST_SNAPSHOT_ID} | jq '.VolumeId' | tr -d '"'` 
echo "Created new volume ${NEW_VOLUME_ID}" 

aws ec2 wait volume-available --volume-ids $NEW_VOLUME_ID 

echo "Stopping the instance" 
aws ec2 stop-instances --instance-ids $RECOVERY_INSTANCE_ID 

aws ec2 wait instance-stopped --instance-ids $RECOVERY_INSTANCE_ID 

echo "Detaching current volume" 
aws ec2 detach-volume --volume-id $OLD_VOLUME_ID --instance-id $RECOVERY_INSTANCE_ID 

aws ec2 wait volume-available --volume-ids $OLD_VOLUME_ID 

echo "Attaching new volume" 
aws ec2 attach-volume --volume-id $NEW_VOLUME_ID --instance-id $RECOVERY_INSTANCE_ID --device $DEVICE_NAME 

aws ec2 wait volume-in-use --volume-ids $NEW_VOLUME_ID 

echo "Starting the instance" 
aws ec2 start-instances --instance-ids $RECOVERY_INSTANCE_ID 

Si desea estar al día con este script o contribuir:

https://github.com/karimtabet/ebs_snapshot_recovery

Cuestiones relacionadas