Digamos que tengo una AMI con un volumen EBS adjunto.Restauración de un volumen de una instantánea
También tengo una instantánea.
Quiero "restaurar" el volumen de EBS a la instantánea.
¿Cuál es el mejor proceso para hacer esto?
Digamos que tengo una AMI con un volumen EBS adjunto.Restauración de un volumen de una instantánea
También tengo una instantánea.
Quiero "restaurar" el volumen de EBS a la instantánea.
¿Cuál es el mejor proceso para hacer esto?
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.
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.
Crear un volumen.
Coloque el volumen.
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
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
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
@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
Para reemplazar un volumen unido a una instancia con un nuevo volumen creado a partir de una instantánea:
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:
Copypasta de http://www.techrepublic.com/blog/the-enterprise-cloud/copias-up-and-restauración-instantáneas-on-EC2-máquinas amazonas/ – bwerks
'/ 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