DevOps-Automation with Python 12

Automate restoring EC2 Volume from the Backup (另有mount研究)

ZONGRU Li
Nov 13, 2023

Project:Restore EC2 Server Data

前面已經有建立了Snapshot,接下來就是要考量怎麼使用Snapshot還原

考量到有一台EC2機台運作一陣子後上面的資料毀壞了,進而導致機台壞了:

再來就要想辦法恢復到前一個正常運作的狀態

就要透過某一個時間的備份Snapshot來建立可運作的新Volume

然後用這個可以使用的新Volume來恢復EC2機台的運作

當前我們有以下Volumes:

然後有這兩個Snapshots:

假設上面那個prod的volume出現異常甚至損毀了

我們要想辦法從近期最新建立的Snapshot(且確保是穩定版的)

來還原出新的Volume,並掛回去EC2機台上使用

所以接下來作業就是:

Implementation

這邊一樣建立新的Python程式叫restore-volume.py

這邊先基本寫為如下:

程式邏輯上,我們會針對指定的instance-id進行還原

1.Get Volumes of EC2 Instance

首先就要先給到指定的instance-id

2.Get Snapshots of Volume

拿到該Volume對應的Snapshot

這邊首先要看文件怎麼拿到Volume,找到describe_volumes的API文件:

補上印出後執行就可以看到:

如上已經拿到唯一希望拿到的指定Volume

接著就要透過這個Volume拿到其最新一個穩定的Snapshot

可能是最新的一筆Snapshot,透過前面學過的describe_snapshots的API

但是注意到上面拿到的是多筆該VolumeSnapshots

所以接著就依樣使用itemgetter的library進行sorted

並只取第一筆,也就是最新的Snapshot

如上可以執行看到:

接著就是還沒使用過的API

也就是要透過上述拿到的Snapshot來建立Volume:

找到文件 →create_volume:

LINK

接著就是要幫EC2掛上這個新建的Volume

透過ec2_resource拿到EC2

LINK

其中要先給id:

LINK
LINK

所以變成:

再來上面關鍵的必傳參數Device如文件範例參考對應就是:

但是我們不能直接使用/dev/xvda,這個是舊的Volume的Device名稱

所以直接換個名子改成:

大致上上述程式就初步完成,但是會撞到一個問題是執行時間

尤其是在建置新的Volume的時候,緊接著跑掛Volume給EC2 instance

建立新的Volume可沒那麼快!!!

也就是要Volume可以被Attached給instance,需要是AVAIABLE的狀態:

LINK

這邊可以嘗試先執行看看:

但是過了幾秒去AWS上面看到:

但是在程式執行上就會過短

這邊先手動移除上述新建的Volume:

這邊就要想辦法等待新建的Volume的狀態是AVAIABLE

最終會有while迴圈判斷直到狀態是AVAIABLE才執行:

然後記得要有break!!!!

再次執行看到:

接著確認:

到EC2 instance頁面看到:

以上該程式就完成了

完整Code如下:

個人mount新的Volume Device研究

後面研究一下,實際這個新的Volume Device掛到EC2後面成怎麼樣

#先看看掛載的Volume Device:
lsblk

如上,有掛進去這個8G的Device了,但是實際沒有Linux機台內目錄使用到

另外上圖有個重點是原始的Volume是有分割的(partitioned)

可以注意到是xvda1掛到機台根目錄,而不是xvda直接掛上去

#另外可以用以下指令看driver硬碟:
sudo fdisk -l
#可以先透過指令檢視新增的Volume的Device是否有data:
sudo file -s /dev/xvdb1

如果是顯示/dev/xvdb1: data則就表示是空的,沒有資料

#順便檢視FileSystem的type等其他資訊:
sudo lsblk --output NAME,TYPE,SIZE,FSTYPE,MOUNTPOINT,UUID,LABEL
#如下是xfs,其他也可能是ext4等type

接著嘗試掛上目錄

比如說機台內的/app目錄

#首先先把目錄建立出來:
sudo mkdir /app

#然後用以下指令把剛剛新增的Volume掛給機台內的/app目錄:
sudo mount -t xfs -o nouuid {Device名稱,可能跟lsblk顯示的不一樣,然後記得是用partitioned} {機台上的目錄,就是/app}
#實際上指令變成(如上/dev/xvdb的partitioned是/dev/xvdb1):
sudo mount -t xfs -o nouuid /dev/xvdb1 /app

上面是嘗試過後的結果,因應到xfs的FileSystem type有重複uuid問題

也就是既有Volume跟新掛的Volume Device的xfs uuid重複

最終看到:

檢視一下其他資訊,可以看到裡面是一套完整的EC2根目錄:

相關參考LINK1:

相關參考LINK2(xfs重複uuid問題):

參考課程reference

--

--

ZONGRU Li

2022/11/17 開源部分個人筆記給LINE "Java程式語言討論區"社群,希望能對社群的技術學習做一點點貢獻.(掩面....記得退訂閱!