DevOps-Automation with Python 11

Automate cleanup of old Snapshots

ZONGRU Li
Nov 12, 2023

Project Introduction

假若前一篇的自動化建立EC2的Volume的Snapshot每天運作

那麼Shapshot就會累積越來越多,佔用AWS上的儲存空間

每天執行的結果就是會有越來越多太過老舊的Snapshot存在

所以建立新的Snapshot之餘,也要想辦法移除過於老舊的Snapshot

比如說嘗試撰寫出可以保留最新的兩個Snapshot但是其餘移除的移除程式

在每天定期的移除過舊的Snapshot

Implementation

建立新的Python程式叫:cleanup-snapshots.py

其中基本邏輯就是先找到太舊的Snapshots

然後再移除

找到相關文件:

LINK

可以看到基本用法:

我在當下把前一篇做的EC2與Snapshot全都手動移除的情況下執行以下程式:

看到超多資料:

這是因為這邊列出的還包含AWS本身建立的Snapshot

所以要仔細研究文件看到:

程式調整為:

執行後看到:

一樣先搞兩台EC2,並分別tag為dev與prod

然後用前一篇程式建立幾份snapshot

再次執行上述程式查看snapshots內容

看到多筆:

而裡面是隨機的list多筆資料

這邊要使用Python內建的排列功能 →sorted

這時候排列上要另外引用一個module叫:itemgetter

這個module存在於operator的Library內

進步一改成:

為了簡單分別差異,用兩個for迴圈來看看結果,一個是經過排列,一個沒有

執行後看到:

想要反轉排列順序可以加上reverse:

再次執行看到:

上面for迴圈就不需要了

接著想要避免最新的兩筆被移除,所以排除最新兩筆:

執行後看到:

上面清單就是依據時間最新的第三筆之後的清單

接著就要來移除,找到doc:

LINK

最終完成刪除的邏輯如下:

執行前有這麼多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過濾

LINK

最終完成如下邏輯:

我嘗試將這個改為1略過,執行後真的會刪除:

參考課程reference

--

--

ZONGRU Li

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