从快照还原卷

Dav*_*ave 9 amazon-ec2

假设我有一个带有附加EBS卷的AMI.

我也有快照.

我想将EBS卷"恢复"到快照.

这样做的最佳方法是什么?

Jas*_*ley 7

我不知道你可以"恢复"附加卷的方式,但我这样做的方法是从快照创建一个卷,然后分离原始卷并附加新卷.


alg*_*gal 7

如果您有一个正在运行的EC2实例,并且要将其还原到先前快照中捕获的状态,则需要停止该实例,分离其当前卷,从快照创建新卷,将新卷附加到您的实例,然后重新启动您的实例.此外,在指定新卷的可用区域和分离/重新附加卷时的设备名称方面存在一些细微之处.

如果您从命令行而不是从AWS Web UI执行此操作,则可以更容易地看到逻辑.

以下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
Run Code Online (Sandbox Code Playgroud)