DevOps-Automation with Python 12
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
但是注意到上面拿到的是多筆該Volume的Snapshots
所以接著就依樣使用itemgetter的library進行sorted
並只取第一筆,也就是最新的Snapshot
如上可以執行看到:
接著就是還沒使用過的API
也就是要透過上述拿到的Snapshot來建立Volume:
找到文件 →create_volume:
接著就是要幫EC2掛上這個新建的Volume
透過ec2_resource拿到EC2
其中要先給id:
所以變成:
再來上面關鍵的必傳參數Device如文件範例參考對應就是:
但是我們不能直接使用/dev/xvda,這個是舊的Volume的Device名稱
所以直接換個名子改成:
大致上上述程式就初步完成,但是會撞到一個問題是執行時間
尤其是在建置新的Volume的時候,緊接著跑掛Volume給EC2 instance
建立新的Volume可沒那麼快!!!
也就是要Volume可以被Attached給instance,需要是AVAIABLE的狀態:
這邊可以嘗試先執行看看:
但是過了幾秒去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問題):