men going around a warehouse

S3 bucket versioning 的實際原理

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

Posted

in

by

Tags:

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *