DevOps-Automation with Python 11
Project Introduction
假若前一篇的自動化建立EC2的Volume的Snapshot每天運作
那麼Shapshot就會累積越來越多,佔用AWS上的儲存空間
每天執行的結果就是會有越來越多太過老舊的Snapshot存在
所以建立新的Snapshot之餘,也要想辦法移除過於老舊的Snapshot
比如說嘗試撰寫出可以保留最新的兩個Snapshot但是其餘移除的移除程式
在每天定期的移除過舊的Snapshot
Implementation
建立新的Python程式叫:cleanup-snapshots.py
其中基本邏輯就是先找到太舊的Snapshots
然後再移除
找到相關文件:
可以看到基本用法:
我在當下把前一篇做的EC2與Snapshot全都手動移除的情況下執行以下程式:
看到超多資料:
這是因為這邊列出的還包含AWS本身建立的Snapshot
所以要仔細研究文件看到:
程式調整為:
執行後看到:
一樣先搞兩台EC2,並分別tag為dev與prod
然後用前一篇程式建立幾份snapshot
再次執行上述程式查看snapshots內容
看到多筆:
而裡面是隨機的list多筆資料
這邊要使用Python內建的排列功能 →sorted
這時候排列上要另外引用一個module叫:itemgetter
這個module存在於operator的Library內
進步一改成:
為了簡單分別差異,用兩個for迴圈來看看結果,一個是經過排列,一個沒有
執行後看到:
想要反轉排列順序可以加上reverse:
再次執行看到:
上面for迴圈就不需要了
接著想要避免最新的兩筆被移除,所以排除最新兩筆:
執行後看到:
上面清單就是依據時間最新的第三筆之後的清單
接著就要來移除,找到doc:
最終完成刪除的邏輯如下:
執行前有這麼多snapshot:
看看執行結果:
而這邊理當也可以設置成schedule型式,首先把上面做成Function
可以參考上一篇方式
而實際上我們不可能直接地使用上述程式
就這樣直接地移除所有Snapshots,卻只保留最新的兩個
而是要根據哪一些Snapshot是屬於哪一個Volume的排列
也就是要各個Volume各自保留最新的兩筆
這邊就要透過describe_snapshots中,指定特定VolumeId
這邊就要用到前一篇寫的部分Code:
這邊我將新建的EC2對應補上Tag:
但是關鍵是要在其Volume上補上tag:
重跑一次備份,出現針對prod的Volume的snapshot:
然後透過上述複製的程式提取對應特定的Volume(也就是有prod這個tag的)
在describe_snapshots Function中可以使用Filter條件在針對volume-id過濾
最終完成如下邏輯:
我嘗試將這個改為1略過,執行後真的會刪除: