Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
如何從已啟用版本控制的一般用途 Amazon S3 儲存貯體中,還原已刪除的物件?
我想要從已啟用版本控制的 Amazon Simple Storage Service (Amazon S3) 一般用途儲存貯體中,還原我刪除的物件。
簡短描述
**注意:**S3 版本控制僅適用於一般用途的儲存貯體。目錄與資料表儲存貯體不支援 S3 版本控制。
當您從啟用版本控制的儲存貯體中刪除物件時,Amazon S3 會為該物件建立一個刪除標記。刪除標記會成為目前的物件版本,而物件則會成為上一個版本。有了刪除標記後,Amazon S3 會對該物件的請求回應,好像您已刪除該物件。例如,如果您傳送物件的 GET 請求,Amazon S3 就會傳回錯誤。
若要從已啟用版本控制的儲存貯體中擷取已刪除的物件,請採取以下其中一種方式:
- 下載物件的先前版本。您必須具有 s3:GetObjectVersion 權限。
- 使用擁有 s3:DeleteObjectVersion 權限的 AWS 帳戶來移除刪除標記。此時最近的非刪除版本將成為該物件的目前版本,讓您可以存取先前刪除的物件。
- **注意:**如果您在儲存貯體上設定了多重要素驗證 (MFA),則必須使用 MFA 刪除來移除刪除標記。
解決方法
**重要:**您無法還原從儲存貯體中永久刪除的資料。
使用 Amazon S3 主控台下載物件的先前版本
請完成下列步驟:
- 開啟 Amazon S3 console (Amazon S3 主控台)。
- 在導覽窗格中,選擇 Buckets (儲存貯體),然後選取已刪除物件所在的儲存貯體。
- 若要查看物件版本清單,請開啟 Show versions (顯示版本)。
- 選取您想要擷取的已刪除物件版本。
- 選擇 Actions (動作),然後選擇 Download (下載)。
使用 AWS CLI 下載物件的先前版本
**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,請參閱對 AWS CLI 錯誤進行疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本。在以下命令中,將 DOC-EXAMPLE-BUCKET 替換為您儲存貯體的名稱。
請完成下列步驟:
-
執行 list-object-versions 命令以列出物件版本:
aws s3api list-object-versions --bucket DOC-EXAMPLE-BUCKET --prefix examplefolder/**注意:**上述命令包含 --prefix 選項,用於根據指定的金鑰名稱首碼篩選結果。當您的儲存貯體包含大量物件版本時,使用此選項可減少結果數量。
-
從命令輸出中,記下物件先前版本的版本 ID。
-
執行 get-object 命令以擷取版本:
aws s3api get-object --bucket DOC-EXAMPLE-BUCKET --key example.txt --version-id example.d6tjAKF1iObKbEnNQkIMPjj filename.txt
使用 Amazon S3 主控台移除刪除標記
請完成下列步驟:
- 從擁有已刪除物件的儲存貯體帳戶中,開啟 Amazon S3 主控台。
- 在導覽窗格中,選擇 Buckets (儲存貯體),然後選取已刪除物件所在的儲存貯體。
- 若要查看物件版本清單,請開啟 Show versions (顯示版本)。
- 選取物件的 Delete marker (刪除標記)。
**重要:**請確定您選取的是刪除標記,而非物件本身。否則,您將無法擷取物件。 - 在 Delete objects (刪除物件) 頁面上,於 Permanently delete objects? (是否要永久刪除物件?) 輸入 permanently delete (永久刪除)。
- 選擇 Delete (刪除)。
**重要:**您無法使用 Amazon S3 主控台還原已刪除的資料夾。而是必須使用 AWS CLI 或 AWS SDK 來還原。
使用 AWS CLI 移除刪除標記
您可以使用 AWS CLI 移除幾個物件、數千個物件或數百萬個物件上的刪除標記。
移除多個物件上的刪除標記
請完成下列步驟:
-
使用 list-object-versions 命令並搭配 --query 參數執行:
aws s3api list-object-versions --bucket DOC-EXAMPLE-BUCKET --prefix examplefolder/ --query 'DeleteMarkers[*].{Key: Key, VersionId: VersionId}'**注意:**上述命令包含 --prefix 選項,用於根據指定的金鑰名稱首碼篩選結果。
-
從命令輸出中,記下刪除標記的版本 ID。
**重要:**請確定您記下刪除標記的版本 ID。如果您已刪除物件版本,則無法擷取該物件。 -
執行 delete-object 命令移除刪除標記:
aws s3api delete-object --bucket DOC-EXAMPLE-BUCKET --key example.txt --version-id 'example.d6tjAKF1iObKbEnNQkIMPjj' -
若要確認刪除標記是否已移除,請執行 ls 命令:
aws s3 ls s3://DOC-EXAMPLE-BUCKET
移除數千個物件的刪除標記
**警告:**最佳實務是在執行以下 list-object-versions 命令前,先備份資料。該命令使用 s3api delete-object API 操作來刪除已識別的刪除標記物件。刪除物件為永久性操作。對此命令結構的修改可能會導致意外的資料遺失。
請完成下列步驟:
- 開啟 AWS CloudShell 主控台。
- 執行 list-object-versions 命令:
**注意:**前述命令使用 jq 工具解析 ListObjectVersions 回應中的目前版本 DeleteMarkers。預設情況下,jq 安裝在 AWS CloudShell 上。如果您不與 Shell 環境互動,則您的 Shell 工作階段將會結束。有關 jq 工具的更多資訊,請參閱 jq 網站上的 ./jq。aws s3api list-object-versions --bucket DOC-EXAMPLE-BUCKET --prefix examplefolder/ --output json --query 'DeleteMarkers[?IsLatest==`true`].[Key, VersionId]' | jq -r '.[] | "--key " + "'\\\"'" + .[0] + "'\\\"'" + " --version-id " + .[1]' | xargs -L1 -t aws s3api delete-object --bucket DOC-EXAMPLE-BUCKET
移除數百萬個物件的刪除標記
若要移除儲存貯體中數百萬個物件的刪除標記,請使用帶有 AWS SDK 的自訂指令碼。如需更多資訊,請展開 Using the AWS SDKs (使用 AWS SDKs) 索引標籤。
**注意:**當您對擁有數百萬個物件的儲存貯體執行 list-object-versions 時,可能會發生逾時。
相關內容
- 已提問 2 年前
- 已提問 8 個月前
- 已提問 2 年前
AWS 官方已更新 2 年前
