2011-03-11 69 views
9

假設我有一個帶有附加EBS卷的AMI。從快照恢復卷

我也有一個快照。

我想將EBS卷「還原」到快照。

這樣做的最佳過程是什麼?

回答

7

我不知道一種方法可以「恢復」連接的卷,但我會這樣做的方式是從快照創建卷,然後分離原始文件並附加新卷。

0

從快照創建卷以在現有EC2計算機上掛載卷並從中複製文件。

檢查EC2機器。

  1. 挑選一個實例。 EC2選項卡|實例|實例。
  2. 記下EC2機器的可用區域。

創建一個卷。

  1. 找到您想要複製文件的快照並勾選此框。 ELASTIC BLOCK STORE |快照
  2. 單擊創建音量按鈕並填寫字段。 o大小必須大於快照大小(免費微型實例獲得8GB卷)。 o可用區域必須與EC2機器相同。 o快照已被選中,或多或少像snap12345678 - 我的描述。
  3. 單擊是,創建按鈕。一個新行出現在「卷」表中。 ELASTIC BLOCK STORE |卷

附加捲。

  1. 單擊附加音量按鈕並填寫字段。
  2. Volume值已經存在。
  3. 從Instances的下拉列表中選擇您的計算機名稱i-12345678(正在運行)。
  4. 設備字段顯示第一個可用的設備名稱,如/ dev/sdf。有人打擾改變這個價值嗎?
  5. 單擊是,創建按鈕。神奇的EC2機器上出現一個新的設備。
  6. 關閉AWS控制檯。
+0

Copypasta /備份和恢復 - 快照 - 亞馬遜-EC2-機器/ – bwerks 2015-09-09 18:47:21

+0

'/ dev/sdf'「有沒有人打擾改變這個值? - 是的,如果我正在更換根音量,我將它設置爲'/ dev/sda1'(這是我的根音量設置) – Randall 2016-03-23 18:17:10

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 
+0

哇......謝謝! ...我正在討論,它實際上是工作,除了:ec2-start-instance和ec2-stop-instances似乎現在作爲ec2start和ec2stop工作。另外我不得不用--region在所有命令中指定區域,因爲對我來說不是默認的。 – Rafael 2013-09-12 16:48:15

+0

另外我發現我無法將卷附加到不在相同可用區域的實例,因此我必須修改腳本以使用與該實例相同的可用區域。 – Rafael 2013-09-12 17:02:00

+0

@Rafael感謝您的評論。我修正了ec2- {start,stop} -instance,這應該是ec2- {start,stop} -instances。但你是對的:這也應該查詢和檢查可用性區域。最後,我寫了一個python腳本來處理這個腳本,並使用輪詢而不是睡眠。 Bash變得相當笨拙。 – algal 2013-09-14 00:55:57

1

要更換連接到一個實例從快照創建新卷的卷:

  1. 在同一個可用性區域從快照創建卷實例是(右鍵點擊快照,然後單擊「創建快照卷」)
  2. 最好停止實例,以避免崩潰的應用程序。等到實例停止。
  3. 寫下原體積的準確設備名(它是寫在AWS控制檯下的情況下,查看或卷查看)
  4. 拆下舊卷,刪除之後,如果你不需要它。
  5. 將新創建的卷(從快照)附加到具有相同設備名稱的實例。
  6. 啓動實例再次
0

,我摸到了由@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 

如果你想保持最新與此腳本或貢獻:從http://www.techrepublic.com/blog/the-enterprise-cloud

https://github.com/karimtabet/ebs_snapshot_recovery

相關問題