跳至內容

如何從已啟用版本控制的一般用途 Amazon S3 儲存貯體中,還原已刪除的物件?

2 分的閱讀內容
0

我想要從已啟用版本控制的 Amazon Simple Storage Service (Amazon S3) 一般用途儲存貯體中,還原我刪除的物件。

簡短描述

**注意:**S3 版本控制僅適用於一般用途的儲存貯體。目錄與資料表儲存貯體不支援 S3 版本控制。

當您從啟用版本控制的儲存貯體中刪除物件時,Amazon S3 會為該物件建立一個刪除標記。刪除標記會成為目前的物件版本,而物件則會成為上一個版本。有了刪除標記後,Amazon S3 會對該物件的請求回應,好像您已刪除該物件。例如,如果您傳送物件的 GET 請求,Amazon S3 就會傳回錯誤。

若要從已啟用版本控制的儲存貯體中擷取已刪除的物件,請採取以下其中一種方式:

  • 下載物件的先前版本。您必須具有 s3:GetObjectVersion 權限。
  • 使用擁有 s3:DeleteObjectVersion 權限的 AWS 帳戶來移除刪除標記。此時最近的非刪除版本將成為該物件的目前版本,讓您可以存取先前刪除的物件。
  • **注意:**如果您在儲存貯體上設定了多重要素驗證 (MFA),則必須使用 MFA 刪除來移除刪除標記。

解決方法

**重要:**您無法還原從儲存貯體中永久刪除的資料。

使用 Amazon S3 主控台下載物件的先前版本

請完成下列步驟:

  1. 開啟 Amazon S3 console (Amazon S3 主控台)。
  2. 在導覽窗格中,選擇 Buckets (儲存貯體),然後選取已刪除物件所在的儲存貯體。
  3. 若要查看物件版本清單,請開啟 Show versions (顯示版本)。
  4. 選取您想要擷取的已刪除物件版本。
  5. 選擇 Actions (動作),然後選擇 Download (下載)。

使用 AWS CLI 下載物件的先前版本

**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,請參閱對 AWS CLI 錯誤進行疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本。在以下命令中,將 DOC-EXAMPLE-BUCKET 替換為您儲存貯體的名稱。

請完成下列步驟:

  1. 執行 list-object-versions 命令以列出物件版本:

    aws s3api list-object-versions --bucket DOC-EXAMPLE-BUCKET --prefix examplefolder/

    **注意:**上述命令包含 --prefix 選項,用於根據指定的金鑰名稱首碼篩選結果。當您的儲存貯體包含大量物件版本時,使用此選項可減少結果數量。

  2. 從命令輸出中,記下物件先前版本的版本 ID。

  3. 執行 get-object 命令以擷取版本:

    aws s3api get-object --bucket DOC-EXAMPLE-BUCKET --key example.txt --version-id example.d6tjAKF1iObKbEnNQkIMPjj filename.txt

使用 Amazon S3 主控台移除刪除標記

請完成下列步驟:

  1. 從擁有已刪除物件的儲存貯體帳戶中,開啟 Amazon S3 主控台
  2. 在導覽窗格中,選擇 Buckets (儲存貯體),然後選取已刪除物件所在的儲存貯體。
  3. 若要查看物件版本清單,請開啟 Show versions (顯示版本)。
  4. 選取物件的 Delete marker (刪除標記)。
    **重要:**請確定您選取的是刪除標記,而非物件本身。否則,您將無法擷取物件。
  5. Delete objects (刪除物件) 頁面上,於 Permanently delete objects? (是否要永久刪除物件?) 輸入 permanently delete (永久刪除)。
  6. 選擇 Delete (刪除)。
    **重要:**您無法使用 Amazon S3 主控台還原已刪除的資料夾。而是必須使用 AWS CLI 或 AWS SDK 來還原。

使用 AWS CLI 移除刪除標記

您可以使用 AWS CLI 移除幾個物件、數千個物件或數百萬個物件上的刪除標記。

移除多個物件上的刪除標記

請完成下列步驟:

  1. 使用 list-object-versions 命令並搭配 --query 參數執行:

    aws s3api list-object-versions --bucket DOC-EXAMPLE-BUCKET --prefix examplefolder/ --query 'DeleteMarkers[*].{Key: Key, VersionId: VersionId}'

    **注意:**上述命令包含 --prefix 選項,用於根據指定的金鑰名稱首碼篩選結果。

  2. 從命令輸出中,記下刪除標記的版本 ID。
    **重要:**請確定您記下刪除標記的版本 ID。如果您已刪除物件版本,則無法擷取該物件。

  3. 執行 delete-object 命令移除刪除標記:

    aws s3api delete-object --bucket DOC-EXAMPLE-BUCKET --key example.txt --version-id 'example.d6tjAKF1iObKbEnNQkIMPjj'
  4. 若要確認刪除標記是否已移除,請執行 ls 命令:

    aws s3 ls s3://DOC-EXAMPLE-BUCKET

移除數千個物件的刪除標記

**警告:**最佳實務是在執行以下 list-object-versions 命令前,先備份資料。該命令使用 s3api delete-object API 操作來刪除已識別的刪除標記物件。刪除物件為永久性操作。對此命令結構的修改可能會導致意外的資料遺失。

請完成下列步驟:

  1. 開啟 AWS CloudShell 主控台。
  2. 執行 list-object-versions 命令:
    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
    **注意:**前述命令使用 jq 工具解析 ListObjectVersions 回應中的目前版本 DeleteMarkers。預設情況下,jq 安裝在 AWS CloudShell 上。如果您不與 Shell 環境互動,則您的 Shell 工作階段將會結束。有關 jq 工具的更多資訊,請參閱 jq 網站上的 ./jq

移除數百萬個物件的刪除標記

若要移除儲存貯體中數百萬個物件的刪除標記,請使用帶有 AWS SDK 的自訂指令碼。如需更多資訊,請展開 Using the AWS SDKs (使用 AWS SDKs) 索引標籤。

**注意:**當您對擁有數百萬個物件的儲存貯體執行 list-object-versions 時,可能會發生逾時。

AWS 官方已更新 4 個月前