Если у вас есть работающий экземпляр EC2, и вы хотите восстановить его в состояние, захваченное в более раннем снимке, вам необходимо остановить экземпляр, отсоединить его текущий том, создать новый том из снимка, присоединить новыйОбъем вашего экземпляра и перезапустите свой экземпляр.Кроме того, существует несколько тонкостей, связанных с указанием зоны доступности нового тома и имени устройства при отсоединении / повторном подключении тома.
Логика может быть легче увидеть, если вы сделаете это из командной строкивместо веб-интерфейса AWS.
Следующий скрипт bash не подходит для производственного использования , так как в нем отсутствует проверка ошибок, и он просто использует sleep
вместо опросаубедитесь, что команды AWS выполнены.Но он успешно выполняет все эти шаги:
#!/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