

# S3 バージョニングの仕組み
<a name="versioning-workflows"></a>

S3 バージョニングを使用すると、オブジェクトの複数のバージョンを 1 つのバケットに保持し、誤って削除または上書きされたオブジェクトを復元できます。例えば、S3 バージョニングをバケットに適用すると、次の変更が行われます。
+ オブジェクトを削除した場合、Amazon S3 では、オブジェクトを完全に削除する代わりに削除マーカーを挿入し、それが最新のオブジェクトバージョンになります。これにより、以前のバージョンを復元できます。詳細については、「[バージョニングが有効なバケットからのオブジェクトバージョンの削除](DeletingObjectVersions.md)」を参照してください。
+ オブジェクトを上書きすると、Amazon S3 のバケットに新しいオブジェクトバージョンが追加されます。以前のバージョンはバケットに残りますが、最新のバージョンではなくなります。以前のバージョンは復元することができます。

**注記**  
通常の Amazon S3 料金は、保存または移行されるオブジェクトのバージョンごとに適用されます。オブジェクトの各バージョンはオブジェクト全体であり、以前のバージョンの差分ではありません。したがって、オブジェクトの 3 つのバージョンを保存している場合、3 つのオブジェクトに対して課金されます。

作成する各 S3 バケットには、それに関連付けられた*バージョニング*のサブリソースがあります。(詳しくは、[汎用バケットの設定オプション](UsingBucket.md#bucket-config-options-intro) を参照してください)。デフォルトでは、バケットの*バージョニングは無効*で、バージョニングのサブリソースには、以下のとおり、空のバージョニング設定が保存されます。

```
<VersioningConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> 
</VersioningConfiguration>
```

バージョニングを有効にするには、`Enabled` ステータスを含むバージョニング設定を使用して、Amazon S3 にリクエストを送信します。

```
<VersioningConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> 
  <Status>Enabled</Status> 
</VersioningConfiguration>
```

バージョニングを停止するには、ステータス値を `Suspended` に設定します。

**注記**  
バケットで初めてバージョニングを有効にした場合、変更が完全に反映されるまでに少し時間がかかることがあります。この変更が反映されるまでの間に、バージョニングを有効にして作成または更新したオブジェクトへのリクエストで断続的な `HTTP 404 NoSuchKey` エラーが発生する可能性があります。バケットのオブジェクトへの書き込みオペレーション (`PUT` または `DELETE`) は、バージョニングを有効にして 15 分待ってから発行することをお勧めします。

バケット所有者とすべての承認済み AWS Identity and Access Management (IAM) ユーザーは、バージョニングを有効にすることができます。バケット所有者はバケットを作成する AWS アカウント です。権限の詳細については、「[Amazon S3 用 Identity and Access Management](security-iam.md)」を参照してください。

AWS マネジメントコンソール、AWS Command Line Interface (AWS CLI)、または REST API を使用した S3 バージョニングの有効化と無効化の詳細については、「[バケットでのバージョニングの有効化](manage-versioning-examples.md)」を参照してください。

**Topics**
+ [バージョン ID](#version-ids)
+ [バージョニングのワークフロー](#versioning-workflows-examples)

## バージョン ID
<a name="version-ids"></a>

バケットのバージョニングを有効にすると、Amazon S3 は、保存されるオブジェクトに対して一意のバージョン ID を自動的に生成します。例えば、1 つのバケット内に、`photo.gif` (バージョン 111111) と `photo.gif` (バージョン 121212) のように、同じキー (オブジェクト名) でもバージョン ID が異なる 2 つのオブジェクトを保持することができます。

![\[キーは同じでもバージョン ID が異なる 2 つのオブジェクトがある、バージョニングが有効になっているバケットを示す図。\]](http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/images/versioning_Enabled.png)


S3 バージョニングが有効になっているかどうかにかかわらず、各オブジェクトにはバージョン ID があります。S3 バージョニングが有効にされていない場合、Amazon S3 はバージョン ID の値を `null` に設定します。S3 バージョニングを有効にした場合、Amazon S3 がオブジェクトにバージョン ID 値を割り当てます。この値により、そのオブジェクトが同じキーの他のバージョンと区別されます。

既存のバケットで S3 バージョニングを有効にしても、バケットにすでに保存されているオブジェクトは変更されません。バージョン ID (`null`)、コンテンツ、アクセス権限が変更されることはありません。S3 バージョニングを有効にすると、バケットに追加された各オブジェクトにバージョン ID が与えられ、同じキーの他のバージョンと区別されます。

バージョン ID を生成できるのは Amazon S3 のみです。また、編集はできません。バージョン ID は、Unicode、UTF-8 エンコード、URL 対応の不透明な文字列で、長さは 1,024 バイト以下です。次に例を示します。

`3sL4kqtJlcpXroDTDmJ+rmSpXd3dIbrHY+MTRCxf3vjVBH40Nr8X8gdRQBpUMLUo`

**注記**  
簡素化のため、本トピックの他の例ではさらに短い ID を使用します。



## バージョニングのワークフロー
<a name="versioning-workflows-examples"></a>

バージョニングが有効になっているバケットにオブジェクトを `PUT` しても、以前のバージョンは上書きされません。次の図に示すように、既に同じ名前のオブジェクトが入っているバケットに新しいバージョンの `photo.gif` が `PUT` された場合、以下の挙動が生じます。
+ 元のオブジェクト (ID = 111111) はバケットに残ります。
+ Amazon S3 は新しいバージョン ID (121212) を生成し、この新しいバージョンのオブジェクトをバケットに追加します。

![\[バージョニングが有効になっているバケットでオブジェクトを PUT した場合の S3 バージョニングの仕組みを示す図。\]](http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/images/versioning_PUT_versionEnabled3.png)


この機能を使用すると、オブジェクトが誤って上書きまたは削除された場合に、オブジェクトの以前のバージョンを取得できます。

オブジェクトの `DELETE` を実行すると、次の図に示すように、バケット内のすべてのバージョンが残り、Amazon S3 によって削除マーカーが挿入されます。

![\[削除マーカーの挿入を示す図\]](http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/images/versioning_DELETE_versioningEnabled.png)


削除マーカーはオブジェクトの最新バージョンになります。デフォルトで、`GET` リクエストは最後に保存されたバージョンを取得します。最新バージョンが削除マーカーである場合に `GET Object` リクエストを実行すると、次の図に示すように `404 Not Found` エラーが返されます。

![\[削除マーカーの GetObject コールが 404 (見つかりません) エラーを返すことを説明する図\]](http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/images/versioning_DELETE_NoObjectFound.png)


ただし、バージョン ID を指定すれば、オブジェクトの以前のバージョンを `GET` することができます。次の図では、特定のオブジェクトバージョン 111111 の `GET` を実行します。これはオブジェクトの最新バージョンではありませんが、Amazon S3 はこのバージョンを返します。

詳細については、「[バージョニングが有効なバケットからのオブジェクトバージョンの取得](RetrievingObjectVersions.md)」を参照してください。

![\[バージョニングが有効になっているバケットで以前のバージョンを GET した場合の S3 バージョニングの仕組みを示す図。\]](http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/images/versioning_GET_Versioned3.png)


オブジェクトを完全に削除するには、削除するバージョンを指定します。Amazon S3 バケット所有者または権限のある IAM ユーザーのみが、特定のバージョンを永久に削除することができます。`DELETE` オペレーションで `versionId` を指定すると、そのオブジェクトバージョンは完全に削除され、Amazon S3 による削除マーカーの挿入も行われません。

![\[特定のオブジェクトバージョンを DELETE versionId が完全に削除する方法を説明する図\]](http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/images/versioning_DELETE_versioningEnabled2.png)


多要素認証 (MFA) Delete に対応するようにバケットを設定すると、セキュリティを強化できます。多要素認証 (MFA) Delete を有効にすると、バケット所有者は特定のバージョンを削除したりバケットのバージョニング状態を変更したりするために、すべてのリクエストに 2 つの認証形態を含める必要があります。詳細については、「[MFA 削除の設定](MultiFactorAuthenticationDelete.md)」を参照してください。

### オブジェクトの新しいバージョンが作成されるのはどのような場合か
<a name="versioning-workflows-new-versions"></a>

オブジェクトの新しいバージョンは、新しいオブジェクトを `PUT` した場合にのみ作成されます。`CopyObject` のような特定のアクションは、`PUT` オペレーションを実装することにより機能することに注意してください。

現在のオブジェクトを変更するアクションを実行しても、新しいオブジェクトを `PUT` しないため、新しいバージョンは作成されません。これには、オブジェクトのタグの変更などのアクションが含まれます。

**重要**  
S3 バージョニングを有効にしたバケットへの Amazon S3 `PUT` または `DELETE` オブジェクトリクエストに対して受信される HTTP 503 (Service Unavailable) レスポンスの数が著しく増加した場合、バケットに数百万のバージョンが存在するオブジェクトがある可能性があります。詳細については、[バージョニングのトラブルシューティング](troubleshooting-versioning.md)の「S3 バージョニングの使用」セクションを参照してください。