从快照还原卷

时间:2011-03-11 20:02:44

标签: amazon-ec2

假设我有一个附有EBS卷的AMI。

我也有快照。

我想将EBS卷“恢复”到快照中。

执行此操作的最佳流程是什么?

5 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分: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

答案 2 :(得分:1)

使用从快照创建的新卷替换附加到实例的卷:

  1. 从实例所在的同一可用区域中的快照创建一个卷(右键单击快照,然后单击&#34;从快照创建卷&#34;)
  2. 最好停止实例以避免任何应用程序崩溃。等到实例停止。
  3. 记下原始卷的确切设备名称(在实例视图或卷视图下写入AWS控制台)
  4. 取出旧卷,如果您不需要,请将其删除。
  5. 将新创建的卷(从快照)附加到具有相同设备名称的实例。
  6. 再次启动实例

答案 3 :(得分:1)

我已经修改了@algal提供的脚本来使用aws cli和polling而不是sleep。它还将查找给定音量的最新快照。

#!/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

如果您想了解此脚本的最新信息或做出贡献:

https://github.com/karimtabet/ebs_snapshot_recovery

答案 4 :(得分:0)

从快照创建卷以在现有EC2计算机上装入卷并从中复制文件。

检查EC2机器。

  1. 选择一个实例。 EC2标签|实例|实例。
  2. 记下EC2机器的可用区域。
  3. 创建一个卷。

    1. 找到要从中复制文件的快照,然后勾选方框。弹性块商店|快照
    2. 单击“创建音量”按钮并填写字段。 o大小必须大于快照大小(免费的微实例大小为8GB)。 o可用区必须与EC2机器相同。 o已经选择了快照,或多或少像snap12345678 - 我的描述。
    3. 单击是,创建按钮。 Volumes表中将出现一个新行。弹性块商店|卷
    4. 附上音量。

      1. 单击“附加音量”按钮并填写字段。
      2. 音量值已经存在。
      3. 从实例的下拉列表中选择您的机器名称i-12345678(正在运行)。
      4. “设备”字段显示第一个可用的设备名称,例如/ dev / sdf。有人打扰改变这个值吗?
      5. 单击是,创建按钮。一台新设备神奇地出现在EC2机器上。
      6. 关闭AWS控制台。