針對版本控制疑難排解 - Amazon Simple Storage Service

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

針對版本控制疑難排解

下列主題可協助您針對一些常見的 Amazon S3 版本控制問題進行疑難排解。

我想要復原已啟用版本控制的儲存貯體中意外刪除的物件

一般而言,從 S3 儲存貯體刪除物件版本時,沒有方法可供 Amazon S3 復原它們。不過,如果您已在 S3 儲存貯體上啟用 S3 版本控制,則未指定版本 ID 的 DELETE 請求將無法永久刪除物件。相反地,刪除標記會新增為預留位置。此刪除標記會成為物件的目前版本。

若要驗證已刪除的物件是永久刪除還是暫時刪除 (其位置有刪除標記),請執行下列動作:

  1. 登入 AWS Management Console 並開啟 Amazon S3 主控台,位於https://console.aws.amazon.com/s3/

  2. 在左側導覽窗格中,選擇 Buckets (儲存貯體)。

  3. Buckets (儲存貯體) 清單中,選擇包含該物件的儲存貯體名稱。

  4. 物件清單中,開啟搜尋列右側的顯示版本切換,然後在搜尋列中搜尋已刪除的物件。只在儲存貯體上先前已啟用版本控制時,才能使用此切換。

    您也可以使用 S3 清查來搜尋已刪除的物件

  5. 如果您在切換顯示版本或建立清查報告之後找不到物件,也找不到物件的刪除標記,則刪除是永久的,而且無法復原該物件。

您也可以使用 AWS Command Line Interface (AWS CLI) 中的HeadObjectAPI操作來核對已刪除物件的狀況。若要這樣做,請使用下列 head-object 命令,並以您自己的資訊取代 user input placeholders

aws s3api head-object --bucket amzn-s3-demo-bucket --key index.html

如果在目前版本為刪除標記的已版本控制物件上執行 head-object 命令,您將會收到 404 找不到錯誤訊息。例如:

調用 HeadObject 操作時發生錯誤(404):未找到

如果您在已版本控制的物件上執行 head-object 命令,並提供物件的版本 ID,Amazon S3 會擷取物件的中繼資料,確認該物件仍然存在且不會永久刪除。

aws s3api head-object --bucket amzn-s3-demo-bucket --key index.html --version-id versionID

{
"AcceptRanges": "bytes",
"ContentType": "text/html",
"LastModified": "Thu, 16 Apr 2015 18:19:14 GMT",
"ContentLength": 77,
"VersionId": "Zg5HyL7m.eZU9iM7AVlJkrqAiE.0UG4q",
"ETag": "\"30a6ec7e1a9ad79c203d05a589c8b400\"",
"Metadata": {}
}

如果找到物件且最新版本是刪除標記,則該物件的先前版本仍然存在。由於刪除標記是物件的目前版本,您可以將刪除標記刪除,來復原物件。

在您永久移除刪除標記之後,物件的第二個最新版本會變成物件的目前版本,使您的物件再次可用。如需如何復原物件的視覺描述,請參閱移除刪除標記

若要移除特定版本的物件,您必須是儲存貯體擁有者。若要對刪除標記永久刪除,您必須在 DeleteObject 要求中包含其版本 ID。若要將刪除標記刪除,請使用下列命令,並以您自己的資訊取代 user input placeholders

aws s3api delete-object --bucket amzn-s3-demo-bucket --key index.html --version-id versionID

如需 delete-object 命令的詳細資訊,請參閱《AWS CLI 命令參考》中的 delete-object。如需永久將刪除標記刪除的詳細資訊,請參閱 管理刪除標記

我想永久刪除版本控制的物件

在已啟用版本控制的儲存貯體中,沒有版本 ID 的 DELETE 請求無法永久刪除物件。相反地,這類請求會插入刪除標記。

若要永久刪除已版本控制的物件,您可以從下列方法中選擇:

  • 建立 S3 生命週期規則以永久刪除非目前版本。若要永久刪除非現行版本,請選取永久刪除物件的非現行版本,然後在物件變成非現行版本後的天數中輸入天數。您可以選擇指定要保留的較新版本數目,方法是在要保留的較新版本數目下方輸入值。如需建立此規則的詳細資訊,請參閱設定 S3 生命週期組態

  • 透過在 DELETE 請求中包含版本 ID 來刪除指定的版本。如需詳細資訊,請參閱如何永久刪除已版本控制的物件

  • 建立生命週期規則以結束目前版本。若要結束物件的目前版本,請選取讓物件的目前版本過期,然後在物件建立後的天數中輸入天數。如需建立此生命週期規則的詳細資訊,請參閱設定 S3 生命週期組態

  • 若要永久刪除所有已版本控制的物件並刪除標記,請建立兩個生命週期規則:一個讓目前版本過期,並永久刪除非目前版本的物件,另一個則用於刪除過期的物件刪除標記。

在已啟用版本控制的儲存貯體中,未指定版本 ID 的 DELETE 請求只能移除版本 ID 為 NULL 的物件。如果物件是在啟用版本控制時上載,則未指定版本 ID 的 DELETE 請求會建立該物件的刪除標記。

注意

對於啟用 S3 物件鎖定的儲存貯體,具有受保護DELETE物件版本 ID 的物件請求會導致 403 拒絕存取錯誤。沒有版本 ID 的 DELETE 物件請求會將刪除標記新增為具有 200 OK 回應之物件的最新版本。無法永久刪除受「物件鎖定」保護的物件,直到移除其保留期和法務保存。如需詳細資訊,請參閱 S3 物件鎖定的運作方式

啟用儲存貯體版本控制後,我遭遇效能降低

如果刪除標記或已版本控制的物件太多,以及如果未遵循最佳實務,則已啟用版本控制的儲存貯體可能會降低效能。

刪除標記過多

在您於儲存貯體上啟用版本控制之後,對物件所做的 DELETE 請求 (沒有版本 ID) 會使用唯一的版本 ID 來建立刪除標記。具有讓物件的目前版本過期規則的生命週期組態會將具有唯一版本 ID 的刪除標記新增至每個物件。過多的刪除標記可能會降低儲存貯體中的效能。

儲存貯體上的版本控制暫停時,Amazon S3 會在新建立的物件上,將版本 ID 標記為 NULL。在暫停版本控制的儲存貯體中,過期動作會指示 Amazon S3 建立刪除標記,並以 NULL 作為版本 ID。在暫停版本控制的儲存貯體中,會針對任何刪除請求建立 NULL 刪除標記。當刪除所有物件版本,僅保留單一刪除標記時,這些 NULL 刪除標記也稱為過期的物件刪除標記。如果累積了太多 NULL 刪除標記,則儲存貯體中的效能會降低。

已版本控制的物件太多

如果已啟用版本控制的儲存貯體包含具有數百萬個版本的物件,則可能會增加 503 服務無法使用錯誤。如果您發現針對已啟用版本控制的值區收到的 HTTP 503 Service 無法使用回應PUTDELETE物件要求數量大幅增加,則值區中可能有一或多個具有數百萬個版本的物件。當您的物件具有數百萬個版本時,Amazon S3 便會自動對儲存貯體的請求限流。限流請求可保護儲存貯體免於過多的請求流量,這可能會潛在地阻礙對同一個儲存貯體發出其他請求。

若要判斷哪些物件具有數百萬個版本,請使用「S3 清查」。「S3 清查」會產生一份報告,提供儲存貯體中物件的一般檔案清單。如需詳細資訊,請參閱 Amazon S3 清查

若要驗證儲存貯體中是否有大量已版本控制的物件,請使用 S3 Storage Lens 指標來檢視目前版本物件計數非目前版本物件計數刪除標記物件計數。如需 Storage Lens 指標的詳細資訊,請參閱 Amazon S3 Storage Lens 指標詞彙表

如果應用程式一再覆寫同一個物件,導致物件可能產生數百萬個版本,Amazon S3 團隊建議客戶展開調查,以判斷應用程式是否正常運作。例如,一週內每分鐘覆寫相同物件的應用程式可以建立超過一萬個版本。我們建議每個物件儲存不超過十萬個版本。如果您的使用案例需要一或多個物件的數百萬個版本,請聯絡 AWS Support 小組以協助您決定更好的解決方案。

最佳實務

為了防止版本控制相關的效能降低問題,建議您採用下列最佳實務:

  • 啟用生命週期規則,使物件的先前版本過期。例如,您可以建立生命週期規則,在物件變成非目前版本的 30 天後使非目前版本過期。如果您不想要刪除所有的非目前版本,也可以保留多個非目前版本。如需詳細資訊,請參閱設定 S3 生命週期組態

  • 啟用生命週期規則,以刪除儲存貯體中沒有關聯資料物件的過期物件刪除標記。如需詳細資訊,請參閱移除過期的物件刪除標記

如需其他 Amazon S3 效能最佳化最佳實務,請參閱最佳實務設計模式