

# 以前のバージョンの復元
<a name="RestoringPreviousVersions"></a>

バージョニングを使用すると、オブジェクトの以前のバージョンを取得できます。この機能を実行するには 2 つの方法があります。
+ オブジェクトの以前のバージョンを同じバケットにコピーします。

  コピーされたオブジェクトはそのオブジェクトの最新バージョンになり、すべてのオブジェクトバージョンが維持されます。
+ オブジェクトの最新バージョンを完全に削除します。

  最新のオブジェクトバージョンを削除すると、結果として、以前のバージョンがそのオブジェクトの最新バージョンになります。

すべてのオブジェクトバージョンが維持されるため、オブジェクトの特定のバージョンをバケットにコピーすることにより、以前の任意のバージョンを最新バージョンにすることができます。次の図では、ソースオブジェクト (ID = 111111) が同じバケットにコピーされます。Amazon S3 が新しい ID（88778877）を指定し、それがオブジェクトの最新バージョンになります。したがって、バケットには元のオブジェクトバージョン (111111) とそのコピー (88778877) の両方が存在します。以前のバージョンを取得してからアップロードして最新のバージョンにする方法の詳細については、[バージョニングが有効なバケットからのオブジェクトバージョンの取得](https://docs.aws.amazon.com/AmazonS3/latest/userguide/RetrievingObjectVersions.html)および[オブジェクトのアップロード](https://docs.aws.amazon.com/AmazonS3/latest/userguide/upload-objects.html)を参照してください。

![\[オブジェクトの特定のバージョンを同じバケットにコピーして現在のバージョンにする方法を説明する図\]](http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/images/versioning_COPY2.png)


後続の `GET` が、バージョン 88778877 を取得します。

次の図では、オブジェクトの最新バージョン (121212) を削除して、以前のバージョン (111111) を最新のオブジェクトとして残す方法を示しています。オブジェクトの削除の詳細については、「[1 つのオブジェクトの削除](https://docs.aws.amazon.com/AmazonS3/latest/userguide/delete-objects.html)」を参照してください。

![\[オブジェクトの最新バージョンを削除して、以前のバージョンを最新のオブジェクトとして残す方法を説明する図\]](http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/images/versioning_COPY_delete2.png)


後続の `GET` が、バージョン 111111 を取得します。

**注記**  
オブジェクトバージョンをバッチで復元する場合は、[`CopyObject` オペレーションを使用](https://docs.aws.amazon.com/AmazonS3/latest/userguide/batch-ops-copy-object.html)できます。`CopyObject` オペレーションは、マニフェストで指定した各オブジェクトをコピーします。ただし、オブジェクトは、必ずしもマニフェストに表示されている順序と同じ順序でコピーされるとは限らないため、注意してください。バージョン管理されたバケットでは、現在のバージョンまたは以前のバージョンの順序を維持することが重要な場合は、最初に以前のバージョンをすべてコピーする必要があります。次に、最初のジョブが完了したら、後続のジョブで現在のバージョンをコピーします。

## 以前のオブジェクトバージョンを復元する
<a name="restoring-obj-version-version-enabled-bucket-examples"></a>

削除されたオブジェクトを復元する方法の詳細については、AWS re:Post ナレッジセンターで「[バージョニングが有効になっているバケットで削除された Amazon S3 オブジェクトを取得するにはどうすればよいですか?](https://repost.aws/knowledge-center/s3-undelete-configuration)」を参照してください。

### S3 コンソールの使用
<a name="retrieving-object-versions"></a>

1. AWS マネジメントコンソール にサインインし、Amazon S3 コンソール ([https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)) を開きます。

1. [**Buckets**] (バケット) リストで、オブジェクトが含まれるバケットの名前を選択します。

1. **オブジェクト**一覧から、オブジェクトの名前を選択します。

1. [**バージョン**] を選択します。

   Amazon S3 にオブジェクトのバージョンがすべて表示されます。

1. 取得するバージョンの**バージョン ID** の、横のチェックボックスをオンにします。

1. [**アクション**] を選択し、[**ダウンロード**] を選択して、オブジェクトを保存します。

オブジェクトの概要パネルでも、オブジェクトのバージョンの確認、ダウンロード、および削除ができます。詳細については、「[Amazon S3 コンソールでのオブジェクトのプロパティの表示](view-object-properties.md)」を参照してください。

**重要**  
最新 (現在) のバージョンとして削除された場合のみ、オブジェクトを復元できます。削除されたオブジェクトの以前のバージョンを復元することはできません。詳細については、「[S3 バージョニングによる複数のバージョンのオブジェクトの保持](Versioning.md)」を参照してください。

### AWS SDK の使用
<a name="restoring-obj-version-version-enabled-bucket-sdks"></a>

他の AWS SDK の使用の詳細については、「[AWS デベロッパーセンター](https://aws.amazon.com/code/)」を参照してください。

------
#### [ 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}."
        )
```

------