還原舊版本 - Amazon Simple Storage Service

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

還原舊版本

您可以使用版本控制來擷取舊版物件。有兩種方式可以達成:

  • 將物件的舊版本複製至相同的儲存貯體。

    複製的物件會變成該物件目前的版本,並保留所有的物件版本。

  • 永久刪除物件目前的版本。

    當您刪除目前的物件版本時,實際上是將舊版本轉換成該物件目前的版本。

因為會保留所有物件版本,所以您可以將任何舊版本設為目前版本,方法是將物件的特定版本複製至相同的儲存貯體。在下圖中,來源物件 (ID = 111111) 會複製至相同的儲存貯體。Amazon S3 提供新的 ID (88778877),這成為物件的目前版本。因此,儲存貯體同時具有原始物件版本 (111111) 和其複本 (88778877)。如需有關獲取先前版本然後上傳以使其成為目前版本的詳細資訊,請參閱從已啟用版本控制的儲存貯體中擷取物件版本上傳物件

圖解顯示將物件的特定版本複製到同一個值區以使其成為目前版本。

隨後 GET 會擷取版本 88778877。

下圖顯示如何刪除將舊版本 (111111) 保留為目前物件之物件的目前版本 (121212)。有關刪除物件的詳細資訊,請參閱刪除單一物件

顯示刪除物件目前版本的插圖會將先前版本保留為目前物件。

隨後 GET 會擷取版本 111111。

注意

若要以批次方式還原物件版本,您可以使用 CopyObject 操作CopyObject 操作會複製資訊清單中指定的每個物件。不過,請注意物件不一定按照它們在資訊清單中出現的相同順序進行複製。對於使用版本控制的儲存貯體,如果保留當前/非當前版本順序很重要,則應該首先複製所有非當前版本。然後,在第一個任務完成後,在接下來的任務中複製目前版本。

還原先前物件版本

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

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

  3. Objects (物件) 清單中,選擇物件的名稱。

  4. 選擇 Versions (版本)。

    Amazon S3 會顯示該物件的所有版本。

  5. 選取要擷取版本之 Version ID (版本 ID) 旁邊的核取方塊。

  6. 選擇 Actions (動作),選擇 Download (下載),然後儲存物件。

您也可以在物件概觀面板中檢視、下載及刪除物件版本。如需詳細資訊,請參閱「在 Amazon S3 主控台中檢視物件概觀」。

重要

只有在刪除最新版 (目前版本) 的物件時,才能取消刪除物件。您無法取消刪除已刪除的舊版物件。如需詳細資訊,請參閱 在 S3 儲存貯體中使用版本控制

如需使用其他 AWS SDK 的相關資訊,請參閱AWS 開發人員中心

Python

透過刪除指定回復版本之後發生的所有版本,下列 Python 程式碼範例會還原已進行版本控制的物件的先前版本。

def rollback_object(bucket, object_key, version_id): """ Rolls back an object to an earlier version by deleting all versions that occurred after the specified rollback version. Usage is shown in the usage_demo_single_object function at the end of this module. :param bucket: The bucket that holds the object to roll back. :param object_key: The object to roll back. :param version_id: The version ID to roll back to. """ # Versions must be sorted by last_modified date because delete markers are # at the end of the list even when they are interspersed in time. versions = sorted( bucket.object_versions.filter(Prefix=object_key), key=attrgetter("last_modified"), reverse=True, ) logger.debug( "Got versions:\n%s", "\n".join( [ f"\t{version.version_id}, last modified {version.last_modified}" for version in versions ] ), ) if version_id in [ver.version_id for ver in versions]: print(f"Rolling back to version {version_id}") for version in versions: if version.version_id != version_id: version.delete() print(f"Deleted version {version.version_id}") else: break print(f"Active version is now {bucket.Object(object_key).version_id}") else: raise KeyError( f"{version_id} was not found in the list of versions for " f"{object_key}." )