Amazon ec2 从快照还原卷

Amazon ec2 从快照还原卷,amazon-ec2,Amazon Ec2,假设我有一个附带EBS卷的AMI 我还有一张快照 我想将EBS卷“还原”到快照 执行此操作的最佳过程是什么?我不知道有什么方法可以“恢复”连接的卷,但我会这样做,即从快照创建一个卷,然后分离原始卷并连接新卷 从快照创建一个卷,以便在现有EC2计算机上装载该卷并从中复制文件 检查EC2机器 选择一个例子。EC2选项卡|实例|实例 记下EC2机器的可用区域 创建一个卷 找到要从中复制文件的快照并勾选该框。弹性块存储|快照 单击“创建卷”按钮并填写字段。 o大小必须大于快照大小(免费微实例获得8GB卷

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

我还有一张快照

我想将EBS卷“还原”到快照


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

我不知道有什么方法可以“恢复”连接的卷,但我会这样做,即从快照创建一个卷,然后分离原始卷并连接新卷

从快照创建一个卷,以便在现有EC2计算机上装载该卷并从中复制文件

检查EC2机器

  • 选择一个例子。EC2选项卡|实例|实例
  • 记下EC2机器的可用区域
  • 创建一个卷

  • 找到要从中复制文件的快照并勾选该框。弹性块存储|快照
  • 单击“创建卷”按钮并填写字段。 o大小必须大于快照大小(免费微实例获得8GB卷)。 o可用性区域必须与EC2机器的相同。 o已选择快照,或多或少类似于snap12345678-我的描述
  • 单击是,创建按钮。卷表中将显示一个新行。弹性块存储|卷
  • 把这个卷接上

  • 单击“附加音量”按钮并填写字段
  • 体积值已经存在
  • 从实例下拉列表中选择您的计算机名i-12345678(正在运行)
  • Devices字段显示第一个可用的设备名称,如/dev/sdf。有人费心修改这个值吗
  • 单击是,创建按钮。EC2机器上神奇地出现了一个新设备
  • 关闭AWS控制台

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

    如果从命令行而不是从AWSWebUI执行,那么逻辑可能更容易理解

    下面的bash脚本不适合生产使用,因为它缺少任何错误检查,并且只使用
    睡眠
    而不是轮询来确保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
    
    #/bin/bash
    set-e
    #在PARAMS中
    实例ID=
    快照ID=
    #外参数
    卷号=
    #开始执行
    echo“收集有关实例的信息”
    DEVICE_NAME=`ec2 descripe实例属性${instance_ID}--块设备映射| awk'{print$2}'`
    OLD_VOLUME_ID=`ec2 descripe实例属性${instance_ID}--块设备映射| awk'{print$3}'`
    echo“发现实例${instance\u ID}在设备${device\u NAME}上有卷${OLD\u volume\u ID}”
    回显“从快照创建新卷”
    AVAILABILITY|u ZONE=`ec2 descripe AVAILABILITY zones--filter state=available | head-n1 | awk'{print$2}'`
    VOLUME_ID=`ec2 create VOLUME--availability zone${availability_zone}--snapshot${snapshot_ID}awk'{print$2}'`
    echo“已创建新卷:${volume\u ID}”
    睡20
    回显“停止实例”
    ec2停止实例$INSTANCE\u ID
    睡20
    回显“分离当前卷”
    ec2分离卷$OLD\u volume\u ID--实例$instance\u ID--设备$device\u NAME
    睡20
    回显“附加新卷”
    ec2附加卷$volume\u ID--实例$instance\u ID--设备$device\u NAME
    睡20
    回显“启动实例”
    ec2启动实例$INSTANCE\u ID
    
    要使用从快照创建的新卷替换连接到实例的卷,请执行以下操作:

  • 从实例所在的同一可用性区域中的快照创建卷(右键单击快照并单击“从快照创建卷”)
  • 最好停止实例以避免任何应用程序崩溃。等待实例停止
  • 写下原始卷的确切设备名称(它写在AWS控制台的“实例”视图或“卷”视图下)
  • 拆离旧卷,如果不需要,请在以后将其删除
  • 将新创建的卷(从快照)附加到具有相同设备名称的实例
  • 再次启动实例

  • 我修改了@algal提供的脚本,使用aws cli和轮询代替睡眠。它还将查找给定卷的最新快照

    #!/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
    
    如果您想更新此脚本或贡献:


    哇。。。谢谢你。。。我正在检查,它实际上正在工作,除了:ec2 start实例和ec2 stop实例现在似乎可以作为ec2start和ec2stop工作。此外,我还必须在所有命令中使用--region指定区域,因为for me不是默认的区域。此外,我发现我无法将卷附加到不在同一可用性区域的实例,因此我必须修改脚本以使用该实例的同一可用性区域。@Rafael感谢这些评论。我修复了ec2-{start,stop}-实例,它应该是ec2-{start,stop}-实例。但你是对的:这还应该查询和检查可用性区域。最后,我编写了一个python脚本来处理这个问题,并使用轮询代替睡眠。Bash变得相当笨拙。@algal由于我试图为您的答案添加到AWS CLI的链接而感到特别沮丧,我希望您能从
    /dev/sdf
    “有人愿意更改此值吗?”-是的,如果我要替换根卷,我会将其设置为
    /dev/sda1
    (这是我的根卷设置)