S3 有個 bucket level 的功能叫做 versioning ,號稱開下去之後就可以避免檔案被意外的刪除。他是怎麼做到的? 實際上真的是這樣嗎?
一開始,會以為 S3 的 versioning 只有打開或關閉兩個選項。但實際上背後有三種狀態要考慮。
- Unversioned (the default)
- Versioning-enabled
- Versioning-suspended
有幾條原則
- object key + version id 決定唯一 object
- versioning suspend 之後新增/刪除會產生 version id 為 null 的 object/deleteMarker
- versioning 僅對狀態變更後的新增/刪除有效果
在 versioning 啟用之後,所有的 object 都會有個 version id 。有可能是 null (啟用之前已經存在的 objects ) 或是一串隨機數 (啟用之後新增的 objects )。
也因為這樣,如果你的 object 是在啟用前就有了,那他在啟用後會變成 version id null
。如果 suspend versioning 後刪除,S3 會建立一個 version id 為 null 的 Delete marker 取代掉原本的 object 。以下是實際的測試。
aws s3 cp object-before-versioning s3://dub-bucket-20201110
aws s3api put-bucket-versioning --bucket dub-bucket-20201110 --versioning-configuration Status=Enabled
aws s3 cp object-after-versioning s3://dub-bucket-20201110
接下來我把 bucket versioning 停用。並執行一些刪除操作。其中 non-existed-object 原本就不存在。
aws s3api put-bucket-versioning --bucket dub-bucket-20201110 --versioning-configuration Status=Suspended
aws s3 rm s3://dub-bucket-20201110/object-before-versioning
aws s3 rm s3://dub-bucket-20201110/object-after-versioning
aws s3 rm s3://dub-bucket-20201110/non-existed-object
Leave a Reply