

# S3 バージョニングによる複数のバージョンのオブジェクトの保持
<a name="Versioning"></a>

Amazon S3 のバージョニングとは、同じバケット内でオブジェクトの複数のバリアントを保持する手段のことです。S3 のバージョニング機能を使用すると、バケットに保存されたすべてのオブジェクトのすべてのバージョンを、保存、取得、復元することができます。バージョニングを使用すれば、意図しないユーザーアクションからもアプリケーション障害からも、より簡単に復旧できます。バケットのバージョニングを有効にすると、Amazon S3 が同じオブジェクトに対する複数の書き込みリクエストを同時に受信した場合に、すべてのオブジェクトが保存されます。

バージョニングを有効にしたバケットは、オブジェクトを誤って削除したり上書きしたりしても、復元が簡単に行えます。例えば、オブジェクトを削除した場合、Amazon S3 は、オブジェクトを完全に削除する代わりに削除マーカーを挿入します。その削除マーカーが、最新のオブジェクトバージョンになります。オブジェクトを上書きすると、バケット内の新しいオブジェクトバージョンになります。いつでも以前のバージョンを復元できます。詳細については、「[バージョニングが有効なバケットからのオブジェクトバージョンの削除](DeletingObjectVersions.md)」を参照してください。

デフォルトではバケットの S3 バージョニングは無効になっているので、明示的に有効にする必要があります。詳細については、「[バケットでのバージョニングの有効化](manage-versioning-examples.md)」を参照してください。

**注記**  
SOAP API は、S3 バージョニングをサポートしていません。SOAP のサポートは HTTP 経由では廃止されましたが、HTTPS 経由では引き続き利用可能です。Amazon S3 の新機能は SOAP でサポートされていません。
通常の Amazon S3 料金は、保存または移行されるオブジェクトのバージョンごとに適用されます。オブジェクトの各バージョンはオブジェクト全体であり、以前のバージョンの単なる差分ではありません。したがって、オブジェクトの 3 つのバージョンを保存している場合、3 つのオブジェクトに対して課金されます。

## バージョニングが無効なバケット、有効なバケット、停止されているバケット
<a name="versioning-states"></a>

バケットは、次の 3 つの状態のいずれかになります。
+ Unversioned (バージョニングが無効) (デフォルト)
+ Versioning-enabled (バージョニングが有効)
+ Versioning-suspended (バージョニングが停止)

バージョニングは、バケットレベルで有効化および停止します。一度バケットのバージョニングを有効にすると、バージョニング無効の状態に戻すことはできません。ただし、そのバケットのバージョニングを*一時停止*することは可能です。

バージョニング状態は、バケット内の一部ではなくすべてのオブジェクトに適用されます。バケットでバージョニングを有効にすると、すべての新しいオブジェクトがバージョニングされ、一意のバージョン ID が割り当てられます。バージョニングが有効化された時点でバケット内に既に存在していたオブジェクトは、それ以降*常に*バージョニングされ、将来のリクエストによって変更されたときに一意のバージョン ID が割り当てられます。次の点に注意してください。
+ バージョニング状態を設定する前にバケットに保存したオブジェクトのバージョン ID は `null` です。バージョニングを有効にした場合、バケットに含まれる既存のオブジェクトは変更されません。変更されるのは、Amazon S3 が今後のリクエストでオブジェクトを処理する方法です。詳細については、「[バージョニングが有効なバケットでのオブジェクトの操作](manage-objects-versioned-bucket.md)」を参照してください。
+ バケット所有者 (または適切なアクセス許可を持つユーザー) は、バージョニングを停止してオブジェクトバージョンの生成を中断できます。バージョニングを停止しても、バケットに含まれる既存のオブジェクトは変更されません。変更されるのは、Amazon S3 が今後のリクエストでオブジェクトを処理する方法です。詳細については、「[バージョニングが停止されたバケットのオブジェクトの操作](VersionSuspendedBehavior.md)」を参照してください。

## S3 ライフサイクルでの S3 バージョニングの使用
<a name="versioning-lifecycle"></a>

データ保持のアプローチやストレージコストの管理をカスタマイズするには、S3 ライフサイクルでオブジェクトバージョニングを使用します。詳細については、「[オブジェクトのライフサイクルの管理](object-lifecycle-mgmt.md)」を参照してください。AWS マネジメントコンソール、AWS CLI、AWS SDK、または REST API を使って S3 ライフサイクル設定を作成する方法の詳細は、「[バケットに S3 ライフサイクル設定を設定する](how-to-set-lifecycle-configuration-intro.md)」を参照してください。

**重要**  
バージョニングが無効であるバケットに、オブジェクトの有効期限ライフサイクル設定があり、有効化したときに同一の完全な削除動作を維持させたいときは、以前の有効期限切れ設定を追加する必要があります。以前の有効期限切れのライフサイクル設定は、バージョニングが有効なバケットで、以前のオブジェクトバージョンの削除を管理します (バージョニングが有効なバケットは、1 個の最新のオブジェクトバージョン と、0 個以上の以前のバージョンを維持します)。詳細については、「[バケットに S3 ライフサイクル設定を設定する](how-to-set-lifecycle-configuration-intro.md)」を参照してください。

S3 バージョニングの操作に関する詳細は、以下のトピックを参照してください。

**Topics**
+ [バージョニングが無効なバケット、有効なバケット、停止されているバケット](#versioning-states)
+ [S3 ライフサイクルでの S3 バージョニングの使用](#versioning-lifecycle)
+ [S3 バージョニングの仕組み](versioning-workflows.md)
+ [バケットでのバージョニングの有効化](manage-versioning-examples.md)
+ [MFA 削除の設定](MultiFactorAuthenticationDelete.md)
+ [バージョニングが有効なバケットでのオブジェクトの操作](manage-objects-versioned-bucket.md)
+ [バージョニングが停止されたバケットのオブジェクトの操作](VersionSuspendedBehavior.md)
+ [バージョニングのトラブルシューティング](troubleshooting-versioning.md)

# 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 バージョニングの使用」セクションを参照してください。

# バケットでのバージョニングの有効化
<a name="manage-versioning-examples"></a>

S3 バージョニングを使用すると、1 つのバケットで複数バージョンのオブジェクトを維持できます。このセクションでは、コンソール、REST API、AWS SDK、AWS Command Line Interface (AWS CLI) を使って、バケットでバージョニングを有効にする方法の例を説明します。

**注記**  
バケットで初めてバージョニングを有効にしたときは、変更が S3 システム全体に完全に反映されるまでに、最長で 15 分かかることがあります。この間、バージョニングを有効にした後で作成または更新したオブジェクトへの `GET` リクエストは、`HTTP 404 NoSuchKey` エラーになる可能性があります。バケット内のオブジェクトへの書き込みオペレーション (`PUT` または `DELETE`) は、バージョニングを有効にした後で 15 分待ってから実行することをお勧めします。この待機時間は、オブジェクトの可視性とバージョンの追跡に伴う潜在的な問題を回避するのに役立ちます。

S3 バージョニングの詳細については、「[S3 バージョニングによる複数のバージョンのオブジェクトの保持](Versioning.md)」を参照してください。バージョニングが有効になっているバケットでの、オブジェクトの操作に関する詳細は、「[バージョニングが有効なバケットでのオブジェクトの操作](manage-objects-versioned-bucket.md)」を参照してください。

S3 バージョニングを使用してデータを保護する方法の詳細については、「[Tutorial: Protecting data on Amazon S3 against accidental deletion or application bugs using S3 Versioning, S3 Object Lock, and S3 Replication](https://aws.amazon.com/getting-started/hands-on/protect-data-on-amazon-s3/?ref=docs_gateway/amazons3/manage-versioning-examples.html)」(チュートリアル: S3 バージョニング、S3 オブジェクトロック、S3 レプリケーションを使用して、Amazon S3 上のデータを予期しない削除やアプリケーションのバグから保護する) を参照してください。

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

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

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

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

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

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

以下のセクションでは、コンソール、AWS CLI、AWS SDK を使って S3 バージョニングを有効にする方法の詳細を説明します。

## S3 コンソールの使用
<a name="enable-versioning"></a>

AWS マネジメントコンソール を使用して、S3 バケットでバージョニングを有効にするには、次の手順に従います。

**S3 汎用バケットのバージョニングを有効または無効にするには**

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

1. 左のナビゲーションペインで、**[汎用バケット]** を選択します。

1. バケットリストで、バージョニングを有効にするバケットの名前を選択します。

1. [**プロパティ**] を選択します。

1. [**バケットのバージョニング**] で [**編集**] を選択します。

1. [**中断**] または [**有効化**] を選択し、[**変更を保存**] を選択します。

**注記**  
バージョニングで AWS 多要素認証 (MFA) を使用できます。バージョニングに MFA を使用しているときに、オブジェクトバージョンを完全に削除したり、バージョニングを停止または再有効化したりする場合は、AWS アカウント のアクセスキーと有効なコードを、アカウントの MFA デバイスから指定することが必要になります。  
バージョニングで MFA を使用するには、`MFA Delete` を有効にします。ただし、AWS マネジメントコンソール を使用して `MFA Delete` を有効にすることはできません。AWS Command Line Interface (AWS CLI) または API を使用する必要があります。詳細については、「[MFA 削除の設定](MultiFactorAuthenticationDelete.md)」を参照してください。

## AWS CLI の使用
<a name="manage-versioning-examples-cli"></a>

次の例では、S3 汎用バケットでバージョニングを有効にします。

```
aws s3api put-bucket-versioning --bucket amzn-s3-demo-bucket1 --versioning-configuration Status=Enabled
```

次の例では、物理的な MFA デバイスのバケットで S3 バージョニングと多要素認証 (MFA) 削除を有効にします。物理的な MFA デバイスの場合、`--mfa` パラメータで、MFA デバイスのシリアル番号、スペース文字、および認証デバイスに表示される値の連結を渡します。

```
aws s3api put-bucket-versioning --bucket amzn-s3-demo-bucket1 --versioning-configuration Status=Enabled,MFADelete=Enabled --mfa "SerialNumber 123456"
```

次の例では、仮想 MFA デバイスのバケットで S3 バージョニングと多要素認証 (MFA) 削除を有効にします。仮想 MFA デバイスの場合、`--mfa` パラメータで、MFA デバイスの ARN、スペース文字、および認証デバイスに表示される値の連結を渡します。

```
aws s3api put-bucket-versioning --bucket amzn-s3-demo-bucket1 --versioning-configuration Status=Enabled,MFADelete=Enabled --mfa "arn:aws:iam::account-id:mfa/root-account-mfa-device 123789"
```

**注記**  
MFA 削除を使用するときは、承認済みの物理または仮想の認証デバイスが必要です。Amazon S3 での MFA 削除の使用に関する詳細は、「[MFA 削除の設定](MultiFactorAuthenticationDelete.md)」を参照してください。

AWS CLI を使用したバージョニングの有効化に関する詳細は、*AWS CLI CLI コマンドリファレンス*の「[put-bucket-versioning](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/put-bucket-versioning.html)」を参照してください。

## AWS SDK の使用
<a name="manage-versioning-examples-sdk"></a>

次の例では、バケットでバージョニングを有効にし、AWS SDK for Java と AWS SDK for .NET を使ってバージョニングの状態を復元します。他の AWS SDK の使用の詳細については、「[AWS デベロッパーセンター](https://aws.amazon.com/code/)」を参照してください。

------
#### [ .NET ]

コード例を設定および実行する方法の詳細については、「*AWS SDK for .NET デベロッパーガイド*」の「[AWS SDK for .NET の開始方法](https://docs.aws.amazon.com/sdk-for-net/latest/developer-guide/net-dg-setup.html)」 を参照してください。

```
using System;
using Amazon.S3;
using Amazon.S3.Model;

namespace s3.amazon.com.rproxy.goskope.com.docsamples
{
    class BucketVersioningConfiguration
    {
        static string bucketName = "*** bucket name ***";

        public static void Main(string[] args)
        {
            using (var client = new AmazonS3Client(Amazon.RegionEndpoint.USEast1))
            {
                try
                {
                    EnableVersioningOnBucket(client);
                    string bucketVersioningStatus = RetrieveBucketVersioningConfiguration(client);
                }
                catch (AmazonS3Exception amazonS3Exception)
                {
                    if (amazonS3Exception.ErrorCode != null &&
                        (amazonS3Exception.ErrorCode.Equals("InvalidAccessKeyId")
                        ||
                        amazonS3Exception.ErrorCode.Equals("InvalidSecurity")))
                    {
                        Console.WriteLine("Check the provided AWS Credentials.");
                        Console.WriteLine(
                        "To sign up for service, go to http://aws.amazon.com/s3");
                    }
                    else
                    {
                        Console.WriteLine(
                         "Error occurred. Message:'{0}' when listing objects",
                         amazonS3Exception.Message);
                    }
                }
            }

            Console.WriteLine("Press any key to continue...");
            Console.ReadKey();
        }

        static void EnableVersioningOnBucket(IAmazonS3 client)
        {

                PutBucketVersioningRequest request = new PutBucketVersioningRequest
                {
                    BucketName = bucketName,
                    VersioningConfig = new S3BucketVersioningConfig 
                    {
                        Status = VersionStatus.Enabled
                    }
                };

                PutBucketVersioningResponse response = client.PutBucketVersioning(request);
        }


        static string RetrieveBucketVersioningConfiguration(IAmazonS3 client)
        {
                GetBucketVersioningRequest request = new GetBucketVersioningRequest
                {
                    BucketName = bucketName
                };
 
                GetBucketVersioningResponse response = client.GetBucketVersioning(request);
                return response.VersioningConfig.Status;
            }
    }
}
```

------
#### [ Java ]

作業サンプルの作成方法およびテスト方法については、「AWS SDK for Java のデベロッパーガイド」の「[使用開始](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/getting-started.html)」を参照してください。

```
import java.io.IOException;

import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.regions.Region;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.model.AmazonS3Exception;
import com.amazonaws.services.s3.model.BucketVersioningConfiguration;
import com.amazonaws.services.s3.model.SetBucketVersioningConfigurationRequest;

public class BucketVersioningConfigurationExample {
    public static String bucketName = "*** bucket name ***"; 
    public static AmazonS3Client s3Client;

    public static void main(String[] args) throws IOException {
        s3Client = new AmazonS3Client(new ProfileCredentialsProvider());
        s3Client.setRegion(Region.getRegion(Regions.US_EAST_1));
        try {

            // 1. Enable versioning on the bucket.
        	BucketVersioningConfiguration configuration = 
        			new BucketVersioningConfiguration().withStatus("Enabled");
            
			SetBucketVersioningConfigurationRequest setBucketVersioningConfigurationRequest = 
					new SetBucketVersioningConfigurationRequest(bucketName,configuration);
			
			s3Client.setBucketVersioningConfiguration(setBucketVersioningConfigurationRequest);
			
			// 2. Get bucket versioning configuration information.
			BucketVersioningConfiguration conf = s3Client.getBucketVersioningConfiguration(bucketName);
			 System.out.println("bucket versioning configuration status:    " + conf.getStatus());

        } catch (AmazonS3Exception amazonS3Exception) {
            System.out.format("An Amazon S3 error occurred. Exception: %s", amazonS3Exception.toString());
        } catch (Exception ex) {
            System.out.format("Exception: %s", ex.toString());
        }        
    }
}
```

------
#### [ Python ]

次の Python コードの例では、Amazon S3 バケットを作成し、バージョニング用に有効にして、オブジェクトの最新ではないバージョンが 7 日後に失効するライフサイクルを設定しています。

```
def create_versioned_bucket(bucket_name, prefix):
    """
    Creates an Amazon S3 bucket, enables it for versioning, and configures a lifecycle
    that expires noncurrent object versions after 7 days.

    Adding a lifecycle configuration to a versioned bucket is a best practice.
    It helps prevent objects in the bucket from accumulating a large number of
    noncurrent versions, which can slow down request performance.

    Usage is shown in the usage_demo_single_object function at the end of this module.

    :param bucket_name: The name of the bucket to create.
    :param prefix: Identifies which objects are automatically expired under the
                   configured lifecycle rules.
    :return: The newly created bucket.
    """
    try:
        bucket = s3.create_bucket(
            Bucket=bucket_name,
            CreateBucketConfiguration={
                "LocationConstraint": s3.meta.client.meta.region_name
            },
        )
        logger.info("Created bucket %s.", bucket.name)
    except ClientError as error:
        if error.response["Error"]["Code"] == "BucketAlreadyOwnedByYou":
            logger.warning("Bucket %s already exists! Using it.", bucket_name)
            bucket = s3.Bucket(bucket_name)
        else:
            logger.exception("Couldn't create bucket %s.", bucket_name)
            raise

    try:
        bucket.Versioning().enable()
        logger.info("Enabled versioning on bucket %s.", bucket.name)
    except ClientError:
        logger.exception("Couldn't enable versioning on bucket %s.", bucket.name)
        raise

    try:
        expiration = 7
        bucket.LifecycleConfiguration().put(
            LifecycleConfiguration={
                "Rules": [
                    {
                        "Status": "Enabled",
                        "Prefix": prefix,
                        "NoncurrentVersionExpiration": {"NoncurrentDays": expiration},
                    }
                ]
            }
        )
        logger.info(
            "Configured lifecycle to expire noncurrent versions after %s days "
            "on bucket %s.",
            expiration,
            bucket.name,
        )
    except ClientError as error:
        logger.warning(
            "Couldn't configure lifecycle on bucket %s because %s. "
            "Continuing anyway.",
            bucket.name,
            error,
        )

    return bucket
```

------

# MFA 削除の設定
<a name="MultiFactorAuthenticationDelete"></a>

Amazon S3 バケットで S3 バージョニングを行うときに、*MFA (多要素認証) Delete* が有効になるようにバケットを設定すれば、セキュリティをさらに強化できます。この設定を行うと、バケット所有者は、特定のバージョンを削除したりバケットのバージョニング状態を変更したりするリクエストに、2 つの認証形式を含めることが必要になります。

MFA Delete では、以下のいずれかの操作で追加の認証が必要になります。
+ バケットのバージョニング状態を変更する
+ オブジェクトバージョンを完全に削除する

MFA Delete では、2 つの認証形式の組み合わせが必要になります。
+ セキュリティ認証情報
+ 有効なシリアル番号、スペース、および承認済みの認証デバイスに表示される 6 桁のコードを連結した文字

MFA Delete は、このようにして、認証情報に不正なアクセスがあった場合などにセキュリティを強化します。MFA 削除は、削除アクションを開始したユーザーに MFA コードを使って MFA デバイスの物理的所有を証明するように要求したり、削除アクションに摩擦とセキュリティのレイヤーをさらに追加したりすることで、バケットの偶発的な削除を防ぎます。

MFA 削除が有効になっているバケットを特定するには、Amazon S3 ストレージレンズメトリクスを使用できます。S3 ストレージレンズは、オブジェクトストレージの使用状況とアクティビティを組織全体で可視化するために使用できるクラウドストレージの分析機能です。詳細については、「[S3 Storage Lens を使用したストレージのアクティビティと使用状況の評価](https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage_lens?icmpid=docs_s3_user_guide_MultiFactorAuthenticationDelete.html)」を参照してください。メトリクスの完全なリストについては、「[S3 ストレージレンズメトリクスに関する用語集](https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage_lens_metrics_glossary.html?icmpid=docs_s3_user_guide_MultiFactorAuthenticationDelete.html)」を参照してください。

バケット所有者、バケットを作成した AWS アカウント (ルートアカウント)、およびすべての承認されたユーザーは、バージョニングを有効にすることができます。ただし、MFA Delete を有効化できるのは、バケット所有者 (ルートアカウント) のみです。詳細については、AWS セキュリティブログの「[MFA を使用した AWS へのアクセスの保護](https://aws.amazon.com/blogs/security/securing-access-to-aws-using-mfa-part-3/)」を参照してください。

**注記**  
バージョニングで MFA Delete を使用するには、`MFA Delete` を有効にします。ただし、AWS マネジメントコンソール を使用して `MFA Delete` を有効にすることはできません。AWS Command Line Interface (AWS CLI) または API を使用する必要があります。  
バージョニングで MFA Delete を使用する例については、トピック [バケットでのバージョニングの有効化](manage-versioning-examples.md) の具体例のセクションを参照してください。  
ライフサイクル設定で MFA 削除を使用することはできません。ライフサイクル設定と、それらが他の設定とやり取りする方法の詳細については、「[S3 ライフサイクルは他のバケット設定とどのように相互作用するか](lifecycle-and-other-bucket-config.md)」を参照してください。

MFA 削除を有効または無効にするには、バケットのバージョニングの設定に使用するものと同じ API を使用します。Amazon S3 では、バケットのバージョニング状態を保存しているものを同じ*バージョニング*サブリソースに、MFA Delete の設定が保存されます。

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

MFA Delete を使用するときは、ハードウェアデバイスまたは仮想 MFA デバイスを使用して認証コードを生成します。次の例は、生成された認証コードがハードウェアデバイスに表示されている様子を示しています。

![\[ハードウェアデバイスに表示される、生成された認証コードの例\]](http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/images/MFADevice.png)


MFA Delete と MFA で保護された API アクセスは、異なるシナリオで保護を行うことを目的とした機能です。バケットに MFA Delete を設定することで、バケット内のデータが誤って削除されることのないようにします。MFA で保護された API アクセスは、Amazon S3 の機密リソースにアクセスする場合に、別の認証要素（MFA コード）を適用するために使用します。これらの Amazon S3 リソースに対するすべてのオペレーションが、MFA を使用した一時証明書によって実行されるように要求できます。例については、「[MFA が必要](example-bucket-policies.md#example-bucket-policies-MFA)」を参照してください。

認証デバイスの購入およびアクティベートの方法の詳細については、「[多要素認証](https://aws.amazon.com/iam/details/mfa/)」を参照してください。

## S3 バージョニングを有効にして MFA 削除を設定するには
<a name="enable-versioning-mfa-delete"></a>

### の使用AWS CLI
<a name="enable-versioning-mfa-delete-cli"></a>

シリアル番号は、MFA デバイスを一意に識別する番号です。物理 MFA デバイスの場合、これはデバイスに提供される一意のシリアル番号です。仮想 MFA デバイスの場合、シリアル番号はデバイス ARN です。次のコマンドを使用するには、*ユーザー入力用プレースホルダー*をユーザー自身の情報に置き換えます。

次の例では、物理的な MFA デバイスのバケットで S3 バージョニングと多要素認証 (MFA) 削除を有効にします。物理的な MFA デバイスの場合、`--mfa` パラメータで、MFA デバイスのシリアル番号、スペース文字、および認証デバイスに表示される値の連結を渡します。

```
aws s3api put-bucket-versioning --bucket amzn-s3-demo-bucket1 --versioning-configuration Status=Enabled,MFADelete=Enabled --mfa "SerialNumber 123456"
```

次の例では、仮想 MFA デバイスのバケットで S3 バージョニングと多要素認証 (MFA) 削除を有効にします。仮想 MFA デバイスの場合、`--mfa` パラメータで、MFA デバイスの ARN、スペース文字、および認証デバイスに表示される値の連結を渡します。

```
aws s3api put-bucket-versioning --bucket amzn-s3-demo-bucket1 --versioning-configuration Status=Enabled,MFADelete=Enabled --mfa "arn:aws:iam::account-id:mfa/root-account-mfa-device 123789"
```

詳細については、AWS rePost の記事、「[Amazon S3 バケットの MFA 削除を有効にするにはどうすればよいですか?](https://repost.aws/knowledge-center/s3-bucket-mfa-delete)」を参照してください。

### REST API の使用
<a name="enable-versioning-mfa-delete-rest-api"></a>

Amazon S3 REST API を使用したルーティングルールの設定の詳細については、[Amazon Simple Storage Service API リファレンス](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketVersioning.html)の「*PutBucketVersioning*」を参照してください。

# バージョニングが有効なバケットでのオブジェクトの操作
<a name="manage-objects-versioned-bucket"></a>

バージョニング状態を設定する前に Amazon S3 バケットに保存されたオブジェクトのバージョン ID は、`null` です。バージョニングを有効にした場合、バケットに含まれる既存のオブジェクトは変更されません。変更されるのは、Amazon S3 が今後のリクエストでオブジェクトを処理する方法です。

**オブジェクトバージョンの移行**  
明確なライフサイクルが定義されているオブジェクトに対してライフサイクル設定ルールを定義することにより、オブジェクトの有効期間内の特定の時点でオブジェクトバージョンを S3 Glacier Flexible Retrieval ストレージクラスに移行できます。詳細については、「[オブジェクトのライフサイクルの管理](object-lifecycle-mgmt.md)」を参照してください。

このセクションのトピックでは、バージョニングが有効なバケットでのさまざまなオブジェクトのオペレーションについて説明します。バージョニングの詳細については、「[S3 バージョニングによる複数のバージョンのオブジェクトの保持](Versioning.md)」を参照してください。

**Topics**
+ [バージョニングが有効なバケットへのオブジェクトの追加](AddingObjectstoVersioningEnabledBuckets.md)
+ [バージョニングが有効なバケットでのオブジェクトのリスト取得](list-obj-version-enabled-bucket.md)
+ [バージョニングが有効なバケットからのオブジェクトバージョンの取得](RetrievingObjectVersions.md)
+ [バージョニングが有効なバケットからのオブジェクトバージョンの削除](DeletingObjectVersions.md)
+ [バージョン管理されたオブジェクトのアクセス許可の設定](VersionedObjectPermissionsandACLs.md)

# バージョニングが有効なバケットへのオブジェクトの追加
<a name="AddingObjectstoVersioningEnabledBuckets"></a>

バケットでバージョニングを有効にすると、Amazon S3 は (`PUT`、`POST`、または `CopyObject` を使用して) バケットに保存されたすべてのオブジェクトに、一意のバージョン ID を自動的に追加します。

次の図は、バージョニングが有効なバケットにオブジェクトが追加されたときに、Amazon S3 がそのオブジェクトに一意のバージョン ID を追加する方法を示しています。

![\[オブジェクトがバージョニング対応のバケットに配置されるとオブジェクトに追加される一意のバージョン ID を示す図\]](http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/images/versioning_PUT_versionEnabled.png)


**注記**  
Amazon S3 が割り当てるバージョン ID の値は URL セーフです（URI の一部として含めることができます）。

バージョニングの詳細については、「[S3 バージョニングによる複数のバージョンのオブジェクトの保持](Versioning.md)」を参照してください。バージョニングが有効なバケットにオブジェクトバージョンを追加するときは、コンソール、AWS SDK、REST API を使用します。

## コンソールを使用する
<a name="add-obj-versioning-enabled-bucket-console"></a>

手順については、「[オブジェクトのアップロード](upload-objects.md)」を参照してください。

## AWS SDK の使用
<a name="add-obj-versioning-enabled-bucket-sdk"></a>

AWS SDK for Java、.NET、PHP を使用してオブジェクトをアップロードする例については、「[オブジェクトのアップロード](upload-objects.md)」を参照してください。バージョニングが設定されていないバケットでも、バージョニングが有効なバケットでもオブジェクトをアップロードする例は同じです。ただし、バージョニングが有効なバケットでは、Amazon S3 によってバージョン番号が割り当てられます。それ以外の場合、バージョン番号は null になります。

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

## REST API の使用
<a name="add-obj-versioning-enabled-bucket-rest"></a>

**バージョニングが有効なバケットにオブジェクトを追加するには**

1. `PutBucketVersioning` リクエストを使用して、バケットでバージョニングを有効にします。

   詳細については、「**Amazon Simple Storage Service API リファレンス」の「[https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTVersioningStatus.html](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTVersioningStatus.html)」を参照してください。

1. `PUT`、`POST`、または `CopyObject` リクエストを送信して、バケットにオブジェクトを保存します。

バージョニングが有効なバケットにオブジェクトを追加すると、Amazon S3 は、次の例に示すとおり、`x-amz-version-id` レスポンスヘッダーでオブジェクトのバージョン ID を返します。

```
1. x-amz-version-id: 3/L4kqtJlcpXroDTDmJ+rmSpXd3dIbrHY
```

# バージョニングが有効なバケットでのオブジェクトのリスト取得
<a name="list-obj-version-enabled-bucket"></a>

このセクションでは、バージョニングが有効なバケットの、オブジェクトバージョンをリスト化する例を説明します。Amazon S3 では、オブジェクトのバージョン情報は、バケットに関連付けられている*バージョン*のサブリソースに保存されます。詳細については、「[汎用バケットの設定オプション](UsingBucket.md#bucket-config-options-intro)」を参照してください。バージョニングが有効なバケット内のオブジェクトを一覧表示するには、`ListBucketVersions` アクセス許可が必要です。

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

以下の手順では、Amazon S3 コンソールを使用して、オブジェクトの異なるバージョンを表示する方法を説明します。

**オブジェクトの複数のバージョンを表示する方法**

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

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

1. バケット内のオブジェクトのバージョン一覧を表示するには、**[Show versions]** (バージョンのリスト) スイッチを選択します。

   各オブジェクトバージョンについて、一意のバージョン ID、そのバージョンが作成された日時、その他のプロパティがコンソールに表示されます。(バージョニング状態を設定する前にバケットに保存されているオブジェクトには、バージョン ID [**null**] が付けられています)。

   バージョンのないオブジェクトをリストするには、[**バージョンのリスト**] スイッチを選択します。

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

**注記**  
 300 バージョンより前のオブジェクトバージョンにアクセスするには、AWS CLI またはオブジェクトの URL を使用する必要があります。

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

## AWS SDK の使用
<a name="list-obj-version-enabled-bucket-sdk-examples"></a>

このセクションの例では、バージョニングが有効なバケットのオブジェクトを一覧表示する方法を示します。各リクエストは最大 1,000 個のバージョンを返します (これ未満の数を指定した場合を除きます)。バケット内のバージョン数が、この上限数を超えている場合は、複数のリクエストを送信してすべてのバージョンを一覧表示します。このように「ページ」に分けて結果を返すプロセスは、*ページ分割*と呼ばれます。

ページ分割の仕組みを示すために、例ではレスポンスごとのオブジェクトバージョン数を 2 個に制限しています。各例では、最初のページの結果を取得すると、バージョンリストが切り詰められているかどうかを確認します。切り詰められている場合は、引き続きページの取得を繰り返し、すべてのバージョンを取得します。

**注記**  
以下の例は、バージョニングが有効になっていないバケットや、個別のバージョンを持たないオブジェクトにも使用できます。これらの場合、Amazon S3 で返される各オブジェクトのバージョン ID は `null` になります。

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

------
#### [ Java ]

作業サンプルの作成およびテストの手順については、「AWS SDK for Java のデベロッパーガイド」の「[使用開始](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/getting-started.html)」を参照してください。

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.SdkClientException;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.ListVersionsRequest;
import com.amazonaws.services.s3.model.S3VersionSummary;
import com.amazonaws.services.s3.model.VersionListing;

public class ListKeysVersioningEnabledBucket {

    public static void main(String[] args) {
        Regions clientRegion = Regions.DEFAULT_REGION;
        String bucketName = "*** Bucket name ***";

        try {
            AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                    .withCredentials(new ProfileCredentialsProvider())
                    .withRegion(clientRegion)
                    .build();

            // Retrieve the list of versions. If the bucket contains more versions
            // than the specified maximum number of results, Amazon S3 returns
            // one page of results per request.
            ListVersionsRequest request = new ListVersionsRequest()
                    .withBucketName(bucketName)
                    .withMaxResults(2);
            VersionListing versionListing = s3Client.listVersions(request);
            int numVersions = 0, numPages = 0;
            while (true) {
                numPages++;
                for (S3VersionSummary objectSummary : versionListing.getVersionSummaries()) {
                    System.out.printf("Retrieved object %s, version %s\n",
                            objectSummary.getKey(),
                            objectSummary.getVersionId());
                    numVersions++;
                }
                // Check whether there are more pages of versions to retrieve. If
                // there are, retrieve them. Otherwise, exit the loop.
                if (versionListing.isTruncated()) {
                    versionListing = s3Client.listNextBatchOfVersions(versionListing);
                } else {
                    break;
                }
            }
            System.out.println(numVersions + " object versions retrieved in " + numPages + " pages");
        } catch (AmazonServiceException e) {
            // The call was transmitted successfully, but Amazon S3 couldn't process
            // it, so it returned an error response.
            e.printStackTrace();
        } catch (SdkClientException e) {
            // Amazon S3 couldn't be contacted for a response, or the client
            // couldn't parse the response from Amazon S3.
            e.printStackTrace();
        }
    }
}
```

------
#### [ .NET ]

コード例を設定および実行する方法の詳細については、「*AWS SDK for .NET デベロッパーガイド*」の「[AWS SDK for .NET の開始方法](https://docs.aws.amazon.com/sdk-for-net/latest/developer-guide/net-dg-setup.html)」 を参照してください。

```
using Amazon;
using Amazon.S3;
using Amazon.S3.Model;
using System;
using System.Threading.Tasks;

namespace Amazon.DocSamples.S3
{
    class ListObjectsVersioningEnabledBucketTest
    {
        static string bucketName = "*** bucket name ***";
        // Specify your bucket region (an example region is shown).
        private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USWest2;
        private static IAmazonS3 s3Client;

        public static void Main(string[] args)
        {
            s3Client = new AmazonS3Client(bucketRegion);
            GetObjectListWithAllVersionsAsync().Wait();
        }

        static async Task GetObjectListWithAllVersionsAsync()
        {
            try
            {
                ListVersionsRequest request = new ListVersionsRequest()
                {
                    BucketName = bucketName,
                    // You can optionally specify key name prefix in the request
                    // if you want list of object versions of a specific object.

                    // For this example we limit response to return list of 2 versions.
                    MaxKeys = 2
                };
                do
                {
                    ListVersionsResponse response = await s3Client.ListVersionsAsync(request); 
                    // Process response.
                    foreach (S3ObjectVersion entry in response.Versions)
                    {
                        Console.WriteLine("key = {0} size = {1}",
                            entry.Key, entry.Size);
                    }

                    // If response is truncated, set the marker to get the next 
                    // set of keys.
                    if (response.IsTruncated)
                    {
                        request.KeyMarker = response.NextKeyMarker;
                        request.VersionIdMarker = response.NextVersionIdMarker;
                    }
                    else
                    {
                        request = null;
                    }
                } while (request != null);
            }
            catch (AmazonS3Exception e)
            {
                Console.WriteLine("Error encountered on server. Message:'{0}' when writing an object", e.Message);
            }
            catch (Exception e)
            {
                Console.WriteLine("Unknown encountered on server. Message:'{0}' when writing an object", e.Message);
            }
        }
    }
}
```

------

## REST API の使用
<a name="ListingtheObjectsinaVersioningEnabledBucket"></a>

**Example - バケット内のすべてのオブジェクトバージョンをリスト化**  
バケット内の各オブジェクトのすべてのバージョンを一覧表示するには、`versions` リクエストで `GET Bucket` サブリソースを使用します。Amazon S3 で取得できるオブジェクトは最大 1,000 個です。各オブジェクトバージョンが 1 個のオブジェクトとしてフルにカウントされます。したがって、バケット内に 2 つのキー (例: `photo.gif` と `picture.jpg`) があり、最初のキーに 990 個のバージョン、2 番目のキーに 400 個のバージョンがある場合、1 つのリクエストで取得されるバージョンは、`photo.gif` の 990 個と、`picture.jpg` のうち最新の 10 個のみです。  
Amazon S3 は、最も新しく保存されたバージョンから開始して、保存された順序でオブジェクトバージョンを返します。  
`GET Bucket` リクエストに、`versions` サブリソースを含めます。  

```
1. GET /?versions HTTP/1.1
2. Host: bucketName.s3.amazonaws.com
3. Date: Wed, 28 Oct 2009 22:32:00 +0000
4. Authorization: AWS AKIAIOSFODNN7EXAMPLE:0RQf4/cRonhpaBX5sCYVf1bNRuU=
```

**Example - キーのすべてのバージョンの取得**  
 オブジェクトバージョンのサブセットを取得するには、`GET Bucket` のリクエストパラメータを使用します。詳細については、[ を参照してください。GET Bucket](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html)  

1. `prefix` パラメータを、取得したいオブジェクトのキーに設定します。

1. `GET Bucket` サブリソースおよび `versions` を使用して、`prefix` リクエストを送信します。

   `GET /?versions&prefix=objectName HTTP/1.1`

**Example - プレフィックスを使用したオブジェクトの取得**  
次の例では、キーが `myObject` であるか、またはそれで始まるオブジェクトを取得します。  

```
1. GET /?versions&prefix=myObject HTTP/1.1
2. Host: bucket.s3.amazonaws.com
3. Date: Wed, 28 Oct 2009 22:32:00 GMT
4. Authorization: AWS AKIAIOSFODNN7EXAMPLE:0RQf4/cRonhpaBX5sCYVf1bNRuU=
```
オブジェクトのすべてのバージョンのサブセットを取得するには、他のリクエストパラメータを使用します。詳細については、「**Amazon Simple Storage Service API リファレンス」の「[https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html)」を参照してください。

**Example - レスポンスが切り詰められた後の残ったオブジェクトのリスト取得**  
`GET` リクエストで返すことができるオブジェクトの数が `max-keys` の値を超えた場合、レスポンスには `<isTruncated>true</isTruncated>` と、リクエストを満たすが返されなかった最初のキー (`NextKeyMarker` 内) および最初のバージョン ID (`NextVersionIdMarker` 内) が含まれます。`GET` リクエストを満たす追加のオブジェクトを取得する後続のリクエストで、これらの戻り値を開始位置として使用します。  
バケットの元の `GET Bucket versions` リクエストを満たす追加のオブジェクトを取得するには、以下の手順に従ってください。`key-marker`、`version-id-marker`、`NextKeyMarker`、および `NextVersionIdMarker` の詳細については、「*Amazon Simple Storage Service API リファレンス*」の「[https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html)」を参照してください。  
以下は、元の `GET` リクエストを満たす追加のレスポンスです。  
+ `key-marker` の値を、前のレスポンスの `NextKeyMarker` で返されたキーに設定します。
+ `version-id-marker` の値を、前のレスポンスの `NextVersionIdMarker` で返されたバージョン ID に設定します。
+ `GET Bucket versions` および `key-marker` を使用して `version-id-marker` リクエストを送信します。

**Example - 指定したキーおよびバージョン ID を始点としたオブジェクトの取得**  

```
1. GET /?versions&key-marker=myObject&version-id-marker=298459348571 HTTP/1.1
2. Host: bucket.s3.amazonaws.com
3. Date: Wed, 28 Oct 2009 22:32:00 GMT
4. Authorization: AWS AKIAIOSFODNN7EXAMPLE:0RQf4/cRonhpaBX5sCYVf1bNRuU=
```

## の使用AWS CLI
<a name="list-obj-version-enabled-bucket-cli"></a>

次のコマンドは、バケット内のオブジェクトのすべてのバージョンに関するメタデータを返します。

```
aws s3api list-object-versions --bucket amzn-s3-demo-bucket1
```

`list-object-versions` の使用に関する詳細は、「*AWS CLI コマンドリファレンス*」の「[https://docs.aws.amazon.com/cli/latest/reference/s3api/list-object-versions.html](https://docs.aws.amazon.com/cli/latest/reference/s3api/list-object-versions.html)」を参照してください。

# バージョニングが有効なバケットからのオブジェクトバージョンの取得
<a name="RetrievingObjectVersions"></a>

Amazon S3 のバージョニングとは、同じバケット内に、オブジェクトの複数のバリアントを保持する手段のことです。シンプルな `GET` リクエストは、オブジェクトの最新バージョンを取得します。次の図は、`GET` がオブジェクト (`photo.gif`) の最新バージョンを返す方法を示しています。

![\[GET がオブジェクトの最新バージョンを返す方法を説明する図\]](http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/images/versioning_GET_NoVersionID.png)


特定のバージョンを取得するには、そのバージョン ID を指定する必要があります。次の図は、`GET versionId` リクエストがオブジェクトの指定したバージョン (最新とは限らない) を取得する方法を示しています。

![\[GET versionId リクエストがオブジェクトの指定されたバージョンを取得する方法を説明する図\]](http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/images/versioning_GET_Versioned.png)


コンソール、AWS SDK、または REST API を使用して、Amazon S3 にオブジェクトバージョンを取得できます。

**注記**  
 300 バージョンより前のオブジェクトバージョンにアクセスするには、AWS CLI またはオブジェクトの URL を使用する必要があります。

## 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="retrieve-obj-version-sdks"></a>

バージョニングが無効なバケットと有効なバケットにオブジェクトをアップロードする場合の例は、同一です。ただし、バージョニングが有効なバケットには、Amazon S3 がバージョン番号を割り当てます。それ以外の場合、バージョン番号は null になります。

AWS SDKs for Java、.NET、および PHP を使用してオブジェクトをダウンロードする例については、[オブジェクトのダウンロード](https://docs.aws.amazon.com/AmazonS3/latest/userguide/download-objects.html)を参照してください。

.NET と Rust のAWS SDK を使用してオブジェクトのバージョンを一覧表示する例については、「[Amazon S3 バケット内のオブジェクトのバージョンを一覧表示する](https://docs.aws.amazon.com/code-library/latest/ug/s3_example_s3_ListObjectVersions_section.html)」を参照してください。

## REST API の使用
<a name="retrieve-obj-version-rest"></a>

**特定のオブジェクトバージョンを取得するには**

1. `versionId` を、取得するオブジェクトのバージョン ID に設定します。

1. `GET Object versionId` リクエストを送信します。

**Example - バージョニングされたオブジェクトの取得**  
次のリクエストは、`L4kqtJlcpXroDTDmpUMLUo` のバージョン `my-image.jpg` を取得します。  

```
1. GET /my-image.jpg?versionId=L4kqtJlcpXroDTDmpUMLUo HTTP/1.1
2. Host: bucket.s3.amazonaws.com
3. Date: Wed, 28 Oct 2009 22:32:00 GMT
4. Authorization: AWS AKIAIOSFODNN7EXAMPLE:0RQf4/cRonhpaBX5sCYVf1bNRuU=
```

オブジェクトの (コンテンツではなく) メタデータのみを取得できます。詳細については、「[オブジェクトバージョンのメタデータの取得](RetMetaOfObjVersion.md)」を参照してください。

以前のオブジェクトバージョンを復元する方法については、「[以前のバージョンの復元](RestoringPreviousVersions.md)」を参照してください。

# オブジェクトバージョンのメタデータの取得
<a name="RetMetaOfObjVersion"></a>

オブジェクトのメタデータのみを取得するには (コンテンツを除く)、`HEAD` オペレーションを使用します。デフォルトでは、最新バージョンのメタデータが取得されます。特定のオブジェクトバージョンのメタデータを取得するには、そのバージョン ID を指定します。

**オブジェクトバージョンのメタデータを取得するには**

1. `versionId` を、メタデータを取得するオブジェクトのバージョン ID に設定します。

1. `HEAD Object versionId` リクエストを送信します。

**Example - バージョニングされたオブジェクトのメタデータの取得**  
次のリクエストは、`my-image.jpg` のバージョン `3HL4kqCxf3vjVBH40Nrjfkd` のメタデータを取得します。  

```
1. HEAD /my-image.jpg?versionId=3HL4kqCxf3vjVBH40Nrjfkd HTTP/1.1
2. Host: bucket.s3.amazonaws.com
3. Date: Wed, 28 Oct 2009 22:32:00 GMT
4. Authorization: AWS AKIAIOSFODNN7EXAMPLE:0RQf4/cRonhpaBX5sCYVf1bNRuU=
```

以下に、サンプルレスポンスを示します。

```
 1. HTTP/1.1 200 OK
 2. x-amz-id-2: ef8yU9AS1ed4OpIszj7UDNEHGran
 3. x-amz-request-id: 318BC8BC143432E5
 4. x-amz-version-id: 3HL4kqtJlcpXroDTDmjVBH40Nrjfkd
 5. Date: Wed, 28 Oct 2009 22:32:00 GMT
 6. Last-Modified: Sun, 1 Jan 2006 12:00:00 GMT
 7. ETag: "fba9dede5f27731c9771645a39863328"
 8. Content-Length: 434234
 9. Content-Type: text/plain
10. Connection: close
11. Server: AmazonS3
```

# 以前のバージョンの復元
<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}."
        )
```

------

# バージョニングが有効なバケットからのオブジェクトバージョンの削除
<a name="DeletingObjectVersions"></a>

オブジェクトのバージョンは Amazon S3 バケットからいつでも削除できます。さらに、明確なライフサイクルが定義されているオブジェクトのライフサイクル設定ルールを定義することにより、最新のオブジェクトバージョンを有効期限切れにしたり、以前のオブジェクトバージョンを完全に削除したりするよう Amazon S3 にリクエストできます。バケットでバージョニングが有効であるか、バージョニングが停止されている場合、ライフサイクル設定アクションは次のように動作します。
+ `Expiration` アクションは、最新のオブジェクトバージョンに適用されます。Amazon S3 は、最新のオブジェクトバージョンを削除するのではなく、*削除マーカー*を追加してそれを最新バージョンにします。これにより、最新バージョンは以前のバージョンとして保持されます。
+ `NoncurrentVersionExpiration` アクションは、以前のオブジェクトバージョンに適用されます。Amazon S3 はこれらのオブジェクトバージョンを完全に削除します。完全に削除したオブジェクトは復元できません。

S3 ライフサイクルの詳細については、「[オブジェクトのライフサイクルの管理](object-lifecycle-mgmt.md)」および「[S3 ライフサイクル設定の例](lifecycle-configuration-examples.md)」を参照してください。

バケットにある現在のオブジェクトバージョンと最新でないオブジェクトバージョンの数を確認するには、Amazon S3 ストレージレンズメトリクスを使用できます。S3 ストレージレンズは、オブジェクトストレージの使用状況とアクティビティを組織全体で可視化するために使用できるクラウドストレージの分析機能です。詳細については、「[S3 Storage Lens を使用したストレージコストの最適化](https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage-lens-optimize-storage.html?icmpid=docs_s3_user_guide_DeletingObjectVersions.html)」を参照してください。メトリクスの完全なリストについては、「[S3 Storage Lens のメトリクスに関する用語集](https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage_lens_metrics_glossary.html?icmpid=docs_s3_user_guide_replication.html)」を参照してください。

**注記**  
 通常の Amazon S3 料金は、最新ではないオブジェクトのバージョンなど、保存または移行されるオブジェクトのバージョンごとに適用されます。詳細については、「[Amazon S3 の料金](https://aws.amazon.com/s3/pricing/)」を参照してください。

## リクエストのユースケースを削除する
<a name="delete-request-use-cases"></a>

`DELETE` リクエストには次のユースケースがあります。
+ バージョニングが有効になっている場合、単純な `DELETE` はオブジェクトを完全に削除することはできません (単純な `DELETE` リクエストとは、バージョン ID を指定しないリクエストです)。代わりに、Amazon S3 はバケットに削除マーカーを挿入します。このマーカーが新しい ID を持つオブジェクトの最新バージョンになります。

  最新バージョンが削除マーカーであるオブジェクトを `GET` しようとすると、Amazon S3 は、オブジェクトが (消去されていなくても) 削除されたものとして動作し、エラー 404 を返します。詳細については、「[削除マーカーの使用](DeleteMarker.md)」を参照してください。

  次の図は、シンプルな `DELETE` が、指定したオブジェクトを実際には削除しないことを示しています。代わりに、Amazon S3 は削除マーカーを挿入します。  
![\[削除マーカーの挿入を示す図\]](http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/images/versioning_DELETE_versioningEnabled.png)
+ バージョニングされたオブジェクトを完全に削除するときは、必ず `DELETE Object versionId` を使用します。

  次の図は、指定したオブジェクトバージョンを削除することによって、そのオブジェクトを完全に削除する方法を示しています。  
![\[特定のオブジェクトバージョンを DELETE Object versionId が完全に削除する方法を説明する図\]](http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/images/versioning_DELETE_versioningEnabled2.png)

## オブジェクトバージョンを削除するには
<a name="delete-object-version"></a>

Amazon S3 内のオブジェクトバージョンは、コンソール、AWS SDK、REST API、または AWS Command Line Interface を使用して削除できます。

### S3 コンソールの使用
<a name="deleting-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. **[削除]** を選択します。

1. [**オブジェクトを完全に削除しますか?**] に、**permanently delete** と入力します。
**警告**  
オブジェクトバージョンを完全に削除すると、アクションを元に戻すことができません。

1. [**オブジェクトの削除**] を選択します。

   Amazon S3 がオブジェクトのバージョンを削除します。

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

AWS SDK for Java、.NET、PHP を使用してオブジェクトを削除する例については、「[Amazon S3 オブジェクトの削除](DeletingObjects.md)」を参照してください。バージョニングが無効なバケットと有効なバケットでオブジェクトを削除する場合の例は、同一です。ただし、バージョニングが有効なバケットには、Amazon S3 がバージョン番号を割り当てます。それ以外の場合、バージョン番号は null になります。

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

------
#### [ Python ]

次の Python コード例は、すべてのバージョンを削除することによってバージョニングされたオブジェクトを完全に削除する方法を示しています。

```
def permanently_delete_object(bucket, object_key):
    """
    Permanently deletes a versioned object by deleting all of its versions.

    Usage is shown in the usage_demo_single_object function at the end of this module.

    :param bucket: The bucket that contains the object.
    :param object_key: The object to delete.
    """
    try:
        bucket.object_versions.filter(Prefix=object_key).delete()
        logger.info("Permanently deleted all versions of object %s.", object_key)
    except ClientError:
        logger.exception("Couldn't delete all versions of %s.", object_key)
        raise
```

------

### REST API の使用
<a name="delete-obj-version-enabled-bucket-rest"></a>

**オブジェクトの特定のバージョンを削除するには**
+ `DELETE` でバージョン ID を指定します。

**Example - 特定のバージョンの削除**  
次の例では、`UIORUnfnd89493jJFJ` のバージョン `photo.gif` を削除します。  

```
1. DELETE /photo.gif?versionId=UIORUnfnd89493jJFJ HTTP/1.1 
2. Host: bucket.s3.amazonaws.com
3. Date: Wed, 12 Oct 2009 17:50:00 GMT
4. Authorization: AWS AKIAIOSFODNN7EXAMPLE:xQE0diMbLRepdf3YB+FIEXAMPLE=
5. Content-Type: text/plain
6. Content-Length: 0
```

### の使用AWS CLI
<a name="delete-obj-version-enabled-bucket-cli"></a>

次のコマンドは、`amzn-s3-demo-bucket1` という名前のバケットから test.txt という名前のオブジェクトを削除します。特定のバージョンのオブジェクトを削除するには、バケット所有者として、バージョン ID サブリソースを使用する必要があります。

```
aws s3api delete-object --bucket amzn-s3-demo-bucket1 --key test.txt --version-id versionID
```

`delete-object` に関する詳細については、「*AWS CLI コマンドリファレンス*」の「[https://docs.aws.amazon.com/cli/latest/reference/s3api/delete-object.html](https://docs.aws.amazon.com/cli/latest/reference/s3api/delete-object.html)」を参照してください。

オブジェクトバージョンの削除の詳細については、以下のトピックを参照してください。
+ [削除マーカーの使用](DeleteMarker.md)
+ [古いバージョンを現行バージョンにするための削除マーカーの削除](ManagingDelMarkers.md#RemDelMarker)
+ [MFA Delete が有効なバケットからのオブジェクトの削除](UsingMFADelete.md)

# 削除マーカーの使用
<a name="DeleteMarker"></a>

Amazon S3 の*削除マーカー*は、単純な `DELETE` リクエストで指定された、バージョニングされたオブジェクトのプレースホルダー (またはマーカー) です。単純な `DELETE` リクエストとは、バージョン ID を指定しないリクエストです。オブジェクトがバージョニングが有効なバケット内にあるため、そのオブジェクトは削除されません。ただし、削除マーカーにより、Amazon S3 はオブジェクトが削除されたかのように動作します。削除マーカーに対しては、Amazon S3 API `DELETE` コールを使用できます。これを行うには、適切なアクセス許可を持つ AWS Identity and Access Management (IAM) ユーザーまたはロールを使用して `DELETE` リクエストを行う必要があります。

削除マーカーには、他のすべてのオブジェクトと同様に、*キー名* (またはキー)** とバージョン ID があります。ただし、削除マーカーは次のような点で他のオブジェクトとは異なります。
+ 削除マーカーには、データが関連付けられていません。
+ 削除マーカーには、アクセスコントロールリスト (ACL) の値が関連付けられていません。
+ 削除マーカーに対する `GET` リクエストを発行しても、削除マーカーにはデータがないため、`GET` リクエストでは何も取得されません。具体的には、`GET` リクエストで `versionId` を指定しない場合、404 (Not Found) エラーが表示されます。

削除マーカーにより、Amazon S3 内のストレージに対して最低料金が発生します。削除マーカーのストレージサイズは、その削除マーカーのキー名のサイズと同じです。キー名は一連の Unicode 文字です。キー名の UTF-8 エンコーディングでは、名前の文字ごとに 1～4 バイトのストレージがバケットに追加されます。削除マーカーは S3 Standard ストレージクラスに保存されます。

削除マーカーの保有数と、保存先のストレージクラスを確認する場合は、Amazon S3 ストレージレンズを使用できます。詳細については、「[Amazon S3 ストレージレンズを使用してストレージのアクティビティと使用状況をモニタリングする](storage_lens.md)」および「[Amazon S3 Storage Lens のメトリクスに関する用語集](storage_lens_metrics_glossary.md)」を参照してください。

有効なキー名の詳細については、「[Amazon S3 オブジェクトに命名する](object-keys.md)」を参照してください。削除マーカーの削除の詳細については、「[削除マーカーの管理](ManagingDelMarkers.md)」を参照してください。

Amazon S3 のみが削除マーカーを作成することができ、バージョニングが有効なバケットまたは停止されたバケット内のオブジェクトに対して `DeleteObject` リクエストが送信されるたびにこの作成を行います。`DELETE` リクエストで指定したオブジェクトは実際には削除されず、代わりに削除マーカーがオブジェクトの最新バージョンになります。オブジェクトのキー名 (またはキー) が削除マーカーのキーになります。

リクエストで `versionId` を指定せずにオブジェクトを取得するときに、現在のバージョンが削除マーカーである場合、Amazon S3 は次のように応答します。
+ 404 (Not Found) エラー
+ レスポンスヘッダー、`x-amz-delete-marker: true`

リクエストで `versionId` を指定してオブジェクトを取得するときに、指定したバージョンが削除マーカーである場合、Amazon S3 は次のように応答します。
+ 405 (Method Not Allowed) エラー
+ レスポンスヘッダー、`x-amz-delete-marker: true`
+ レスポンスヘッダー、`Last-Modified: timestamp` ([HeadObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html) または [GetObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html) API オペレーションを使用する場合のみ)

`x-amz-delete-marker: true` レスポンスヘッダーから、アクセスしたオブジェクトが削除マーカーであったことがわかります。値が `false` である場合、オブジェクトの現在のバージョンまたは指定したバージョンは削除マーカーではないため、このレスポンスヘッダーは `false` を返しません。

`Last-Modified` レスポンスヘッダーには削除マーカーの作成時間が表示されます。

次の図は、現在のバージョンが削除マーカーであるオブジェクトに対する `GetObject` API コールから返される 404 (No Found) エラーと、レスポンスヘッダーに含まれる `x-amz-delete-marker: true` を示しています。

![\[削除マーカーに対する GetObject コールが 404 (No Found) エラーを返すことを示す図。\]](http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/images/versioning_DELETE_NoObjectFound.png)


リクエストで `versionId` を指定してオブジェクトに対して `GetObject` コールを行った場合、指定したバージョンが削除マーカーであると、Amazon S3 は 405 (Method Not Allowed) エラーで応答し、レスポンスヘッダーには `x-amz-delete-marker: true` と `Last-Modified: timestamp` が含まれます。

![\[削除マーカーの GetObject コールが 405 (メソッドが許可されていません) エラーを返すことを説明する図\]](http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/images/versioning_DELETE_NoObjectFound_405.png)


上書きされても、削除マーカーはオブジェクトバージョンに残ります。削除マーカー (およびオブジェクトのその他のバージョン) をリストするには、[https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectVersions.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectVersions.html) リクエストを使用するしかありません。AWS マネジメントコンソールで汎用バケットにオブジェクトを一覧表示し、**[バージョンの表示]** を選択することで、このリクエストを行うことができます。詳細については、「[バージョニングが有効なバケットでのオブジェクトのリスト取得](list-obj-version-enabled-bucket.md)」を参照してください。

次の図で、[https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html) リクエストや [https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjects.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjects.html) リクエストは、現在のバージョンが削除マーカーであるオブジェクトを返さないことを示しています。

![\[ListObjectsV2 コールまたは ListObjects コールが削除マーカーを返さないことを説明する図\]](http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/images/versioning_GETBucketwithDeleteMarkers.png)


# 削除マーカーの管理
<a name="ManagingDelMarkers"></a>

## 期限切れの削除マーカーを自動的にクリーンアップするライフサイクルの設定
<a name="LifecycleDelMarker"></a>

期限切れのオブジェクト削除マーカーは、すべてのオブジェクトバージョンが削除され、単一の削除マーカーだけが残っている場合のマーカーです。ライフサイクル設定が現行バージョンを削除するように設定されている、または `ExpiredObjectDeleteMarker` アクションが明示的に設定されている場合、Amazon S3 は期限切れのオブジェクト削除マーカーを削除します。例については、「[バージョニングが有効なバケットで期限切れのオブジェクト削除マーカーを削除する](lifecycle-configuration-examples.md#lifecycle-config-conceptual-ex7)」を参照してください。

## 古いバージョンを現行バージョンにするための削除マーカーの削除
<a name="RemDelMarker"></a>

バージョニングが有効なバケット内のオブジェクトを削除すると、すべてのバージョンがバケット内に残り、Amazon S3 はオブジェクトの削除マーカーを作成します。削除したオブジェクトを復元するには、この削除マーカーを削除する必要があります。バージョニングと削除マーカーの詳細については、「[S3 バージョニングによる複数のバージョンのオブジェクトの保持](Versioning.md)」を参照してください。

削除マーカーを完全に削除するには、`DeleteObject versionId` リクエストにそのバージョン ID を含める必要があります。次の図は、`DeleteObject versionId` リクエストが削除マーカーを完全に削除する方法を示しています。

![\[バージョン ID を使用した削除マーカーの削除を示す図\]](http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/images/versioning_DELETE_deleteMarkerVersioned.png)


削除マーカーを削除すると、シンプルな `GET` リクエストがオブジェクトの現行バージョン ID (121212) を取得するようになります。

**注記**  
現行バージョンが削除マーカーである場合に、削除マーカーのバージョン ID を指定せずに `DeleteObject` リクエストを使用すると、Amazon S3 は削除マーカーを削除せず、その代わりに別の削除マーカーを `PUTs` します。

`NULL` バージョン ID を持つ削除マーカーを削除するには、`DeleteObject` リクエストのバージョン ID として `NULL` を渡す必要があります。以下の図は、現行バージョンが削除マーカーになっているときに、バージョンID なしで実行されたシンプルな `DeleteObject` リクエストが何も削除せず、その代わりに一意のバージョン ID (7498372) を持つ削除マーカーをさらに追加する状況を示しています。

![\[NULL バージョン ID を使用した削除マーカーの削除を説明する図\]](http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/images/versioning_DELETE_deleteMarker.png)


## S3 コンソールの使用
<a name="undelete-objects"></a>

S3 バケットから削除されたフォルダ以外のオブジェクト (フォルダ内のオブジェクトも含む) を復元するには、以下の手順を実行します。

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

1. [**Buckets (バケット)**] リストで、目的のバケットの名前を選択します。

1. バケット内のオブジェクトの**バージョン**一覧を表示するには、[**バージョンのリスト**] を選択します。削除されたオブジェクトの削除マーカーを表示できます。

   

1. 削除したオブジェクトを復元するには、削除マーカーを削除する必要があります。復元するオブジェクトの**削除マーカー**の横にあるチェックボックスを選択し、次に [**削除**] を選択します。

1. [**オブジェクトの削除**] ページで削除を確認します。

   1. **[オブジェクトを完全に削除しますか?]** に、**permanently delete** と入力します。

   1. **[オブジェクトの削除]** を選択します。

**注記**  
Amazon S3 コンソールでは、削除されたフォルダを元に戻すことはできません。AWS CLI または SDK を使用する必要があります。例については、AWS ナレッジセンターの[バージョニングが有効なバケットで削除された Amazon S3 オブジェクトを取得する方法を教えてください](https://aws.amazon.com/premiumsupport/knowledge-center/s3-undelete-configuration/)を参照してください。

## REST API の使用
<a name="delete-marker-rest-api"></a>

**削除マーカーを完全に削除するには**

1. `versionId` を、削除する削除マーカーのバージョン ID に設定します。

1. `DELETE Object versionId` リクエストを送信します。

**Example - 削除マーカーの削除**  
次の例では、`photo.gif` のバージョン 4857693 の削除マーカーを削除します。  

```
1. DELETE /photo.gif?versionId=4857693 HTTP/1.1
2. Host: bucket.s3.amazonaws.com
3. Date: Wed, 28 Oct 2009 22:32:00 GMT
4. Authorization: AWS AKIAIOSFODNN7EXAMPLE:0RQf4/cRonhpaBX5sCYVf1bNRuU=
```

削除マーカーを削除すると、Amazon S3 はレスポンスに以下を含めます。

```
1. 204 NoContent 
2. x-amz-version-id: versionID 
3. x-amz-delete-marker: true
```

## AWS SDK の使用
<a name="remove-delete-marker-examples-sdk"></a>

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

------
#### [ Python ]

次の Python コード例は、オブジェクトから削除マーカーを削除し、最新でないバージョン (最新に最も近いもの) をオブジェクトの最新のバージョンにする方法を示しています。

```
def revive_object(bucket, object_key):
    """
    Revives a versioned object that was deleted by removing the object's active
    delete marker.
    A versioned object presents as deleted when its latest version is a delete marker.
    By removing the delete marker, we make the previous version the latest version
    and the object then presents as *not* deleted.

    Usage is shown in the usage_demo_single_object function at the end of this module.

    :param bucket: The bucket that contains the object.
    :param object_key: The object to revive.
    """
    # Get the latest version for the object.
    response = s3.meta.client.list_object_versions(
        Bucket=bucket.name, Prefix=object_key, MaxKeys=1
    )

    if "DeleteMarkers" in response:
        latest_version = response["DeleteMarkers"][0]
        if latest_version["IsLatest"]:
            logger.info(
                "Object %s was indeed deleted on %s. Let's revive it.",
                object_key,
                latest_version["LastModified"],
            )
            obj = bucket.Object(object_key)
            obj.Version(latest_version["VersionId"]).delete()
            logger.info(
                "Revived %s, active version is now %s  with body '%s'",
                object_key,
                obj.version_id,
                obj.get()["Body"].read(),
            )
        else:
            logger.warning(
                "Delete marker is not the latest version for %s!", object_key
            )
    elif "Versions" in response:
        logger.warning("Got an active version for %s, nothing to do.", object_key)
    else:
        logger.error("Couldn't get any version info for %s.", object_key)
```

------

# MFA Delete が有効なバケットからのオブジェクトの削除
<a name="UsingMFADelete"></a>

MFA 削除を設定すると、ルートユーザーのみがオブジェクトバージョンを完全に削除したり、S3 バケットのバージョニング設定を変更したりできます。削除アクションを実行するには、MFA デバイスを使用してルートユーザーを認証する必要があります。

バケットのバージョニング設定で MFA Delete が有効になっている場合に、オブジェクトバージョンを完全に削除したり、バケットのバージョニング状態を変更したりするには、バケット所有者はリクエストに `x-amz-mfa` リクエストヘッダーを含める必要があります。`x-amz-mfa` を含むリクエストでは、HTTPS を使用する必要があります。

ヘッダーの値は、認証デバイスのシリアル番号、スペース、および認証デバイスに表示される認証コードの連結文字です。このリクエストヘッダーを含めないと、リクエストは失敗します。

AWS CLI を使用する場合は、`mfa` パラメータの値と同じ情報を含めます。

認証デバイスの詳細については、「[多要素認証](https://aws.amazon.com/iam/details/mfa/)」を参照してください。

MFA Delete の有効化の詳細については、「[MFA 削除の設定](MultiFactorAuthenticationDelete.md)」を参照してください。

**注記**  
MFA 削除が有効になっているバージョニングが有効なバケット内のオブジェクトの削除は、AWS マネジメントコンソールでは利用できません。

## の使用AWS CLI
<a name="MFADeleteCLI"></a>

MFA 削除が有効になっているバージョニングが有効なバケット内のオブジェクトを削除するには、次のコマンドを使用します。次のコマンド例を使用する際は、`user input placeholders` を独自の情報に置き換えます。

```
 aws s3api delete-object --bucket amzn-s3-demo-bucket --key OBJECT-KEY --version-id "VERSION ID" --mfa "MFA_DEVICE_SERIAL_NUMBER MFA_DEVICE_CODE"						
```

## REST API の使用
<a name="MFADeleteAPI"></a>

次の例は、`my-image.jpg` を (バージョンを指定して) 削除しています。これは、MFA Delete が有効に設定されたバケットの中にあります。

詳細については、「Amazon Simple Storage Service API リファレンス」の「[https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectDELETE.html](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectDELETE.html)」を参照してください

```
1. DELETE /my-image.jpg?versionId=3HL4kqCxf3vjVBH40Nrjfkd HTTPS/1.1
2. Host: bucketName.s3.amazonaws.com
3. x-amz-mfa: 20899872 301749
4. Date: Wed, 28 Oct 2009 22:32:00 GMT
5. Authorization: AWS AKIAIOSFODNN7EXAMPLE:0RQf4/cRonhpaBX5sCYVf1bNRuU=
```

# バージョン管理されたオブジェクトのアクセス許可の設定
<a name="VersionedObjectPermissionsandACLs"></a>

Amazon S3 のオブジェクトのアクセス許可は、バージョンレベルで設定されています。各バージョンには個々のオブジェクト所有者がいます。この所有者は、オブジェクトバージョンを作成する AWS アカウントです。したがって、同じオブジェクトの異なるバージョンに対して、異なるアクセス許可を設定することができます。これを行うには、`PUT Object versionId acl` リクエストでアクセス権限を設定するオブジェクトのバージョン ID を指定する必要があります。ACL の使用の詳細と手順については、「[Amazon S3 用 Identity and Access Management](security-iam.md)」を参照してください。

**Example - オブジェクトバージョンに対するアクセス許可の設定**  
次のリクエストは、正規ユーザー ID *b4bf1b36f9716f094c3079dcf5ac9982d4f2847de46204d47448bc557fb5ac2a* の被付与者のキー `my-image.jpg`、バージョン ID `3HL4kqtJvjVBH40Nrjfkd` に対するアクセス許可を `FULL_CONTROL` に設定します。  

```
 1. PUT /my-image.jpg?acl&versionId=3HL4kqtJvjVBH40Nrjfkd HTTP/1.1
 2. Host: bucket.s3.amazonaws.com
 3. Date: Wed, 28 Oct 2009 22:32:00 GMT
 4. Authorization: AWS AKIAIOSFODNN7EXAMPLE:0RQf4/cRonhpaBX5sCYVf1bNRuU=
 5. Content-Length: 124
 6.  
 7. <AccessControlPolicy>
 8.   <Owner>
 9.     <ID>75cc57f09aa0c8caeab4f8c24e99d10f8e7faeebf76c078efc7c6caea54ba06a</ID>
10.   </Owner>
11.   <AccessControlList>
12.     <Grant>
13.       <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CanonicalUser">
14.         <ID>a9a7b886d6fd24a52fe8ca5bef65f89a64e0193f23000e241bf9b1c61be666e9</ID>
15.       </Grantee>
16.       <Permission>FULL_CONTROL</Permission>
17.     </Grant>
18.   </AccessControlList>
19.   </AccessControlPolicy>
```

同様に、特定のオブジェクトバージョンに対するアクセス許可を取得するには、`GET Object versionId acl` リクエストでそのバージョン ID を指定する必要があります。デフォルトでは `GET Object acl` はオブジェクトの最新バージョンに対するアクセス許可を返すため、バージョン ID を含める必要があります。

**Example - 指定したオブジェクトバージョンに対するアクセス許可の取得**  
次の例では、Amazon S3 はキー `my-image.jpg`、バージョン ID `DVBH40Nr8X8gUMLUo` に対するアクセス許可を返します。  

```
1. GET /my-image.jpg?versionId=DVBH40Nr8X8gUMLUo&acl HTTP/1.1
2. Host: bucket.s3.amazonaws.com
3. Date: Wed, 28 Oct 2009 22:32:00 GMT
4. Authorization: AWS AKIAIOSFODNN7EXAMPLE:0RQf4/cRonhpaBX5sCYVf1bNRuU
```

詳細については、「**Amazon Simple Storage Service API リファレンス」の「[https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectGETacl.html](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectGETacl.html)」を参照してください。

# バージョニングが停止されたバケットのオブジェクトの操作
<a name="VersionSuspendedBehavior"></a>

Amazon S3 では、バケット内で同じオブジェクトの新しいバージョンが生成されないようにするには、バージョニングを停止します。この作業は、バケット内のオブジェクトのバージョンが 1 つだけ必要な場合に行います。あるいは、複数のバージョンで料金を発生させたくない場合などです。

バージョニングを停止しても、バケットに含まれる既存のオブジェクトは変更されません。変更されるのは、Amazon S3 が今後のリクエストでオブジェクトを処理する方法です。このセクションのトピックでは、バージョニングが停止されたバケットでの、オブジェクトの追加、取得、削除など、さまざまなオペレーションについて説明します。

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

**Topics**
+ [バージョニングが停止されたバケットへのオブジェクトの追加](AddingObjectstoVersionSuspendedBuckets.md)
+ [バージョニングが停止されたバケットからのオブジェクトの取得](RetrievingObjectsfromVersioningSuspendedBuckets.md)
+ [バージョニングが停止されたバケットからのオブジェクトの削除](DeletingObjectsfromVersioningSuspendedBuckets.md)

# バージョニングが停止されたバケットへのオブジェクトの追加
<a name="AddingObjectstoVersionSuspendedBuckets"></a>

Amazon S3 でバージョニングが停止されたバケットにオブジェクトを追加すると、null バージョン ID の付いたオブジェクトが作成されるか、または同じバージョン ID のオブジェクトバージョンが上書きされます。

バケットでバージョニングを停止すると、Amazon S3 は (`PUT`、`POST`、`CopyObject` を使用して) その後そのバケットに保存された後続のすべてのオブジェクトに、`null` バージョン ID を自動的に追加します。

次の図は、バージョニングが停止されたバケットにオブジェクトが追加されたときに、Amazon S3 がそのオブジェクトにバージョン ID `null` を追加する方法を示しています。

![\[オブジェクトに null のバージョン ID を追加する Amazon S3 のグラフィック\]](http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/images/versioning_PUT_versionSuspended.png)


バケット内に null バージョンが既に存在しており、同じキーを持つ別のオブジェクトを追加した場合、元の null バージョンは、追加したオブジェクトによって上書きされます。

バケット内にバージョニングされたオブジェクトがある場合、`PUT` したバージョンはオブジェクトの最新バージョンになります。次の図は、バージョニングされたオブジェクトを含むバケットにオブジェクトを追加しても、バケット内に既に存在するオブジェクトを上書きしないことを示しています。

この場合、バケット内にバージョン 111111 がすでに存在しています。Amazon S3 は、追加されるオブジェクトに null のバージョン ID をアタッチし、バケット内に保存します。バージョン 111111 は上書きされません。

![\[バージョン 111111 を上書きせずに null のバージョン ID をオブジェクトに追加する Amazon S3 のグラフィック\]](http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/images/versioning_PUT_versionSuspended3.png)


次の図に示すように、バケット内に null バージョンが既に存在する場合、null バージョンは上書きされます。

![\[元のコンテンツを上書きして null のバージョン ID をオブジェクトに追加する Amazon S3 のグラフィック\]](http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/images/versioning_PUT_versionSuspended4.png)


null バージョンのキーおよびバージョン ID ( `null` ) は `PUT` の前後で同じですが、バケット内に元々格納されていた null バージョンの内容は、バケット内のオブジェクト `PUT` の内容に置き換えられます。

# バージョニングが停止されたバケットからのオブジェクトの取得
<a name="RetrievingObjectsfromVersioningSuspendedBuckets"></a>

`GET Object` リクエストは、バケットでバージョニングを有効にしているかどうかにかかわらず、オブジェクトの最新バージョンを返します。次の図は、シンプルな `GET` がオブジェクトの最新バージョンを返す方法を示しています。

![\[シンプルな GET がオブジェクトの最新バージョンを返す方法を説明する図\]](http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/images/versioning_GET_suspended.png)


# バージョニングが停止されたバケットからのオブジェクトの削除
<a name="DeletingObjectsfromVersioningSuspendedBuckets"></a>

バージョニングが停止されたバケットからオブジェクトを削除することで、null バージョン ID の付いたオブジェクトを削除します。

バケットのバージョニングが停止されている場合、`DELETE` リクエストは次のように動作します。
+ バージョン ID が `null` であるオブジェクトのみを削除できる。
+ バケット内にオブジェクトの null バージョンが存在しない場合は、何も削除しません。
+ バケットに削除マーカーを挿入する。

バケットバージョニングが停止されている場合、オペレーションは null `versionId` を持つオブジェクトを削除します。バージョン ID が存在する場合、Amazon S3 はオブジェクトの最新バージョンとなる削除マーカーを挿入します。次の図は、単純な `DELETE` が null バージョンを削除し、代わりに Amazon S3 がその位置に `null` のバージョン ID を持つ削除マーカーを挿入する方法を示しています。

![\[シンプルな delete が NULL バージョン ID でオブジェクトを削除する方法を説明する図\]](http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/images/versioning_DELETE_versioningSuspended.png)


`versionId` を持つオブジェクトを完全に削除するには、オブジェクトの `versionId` をリクエストに含める必要があります。削除マーカーにはコンテンツが含まれていないため、削除マーカーが置き換えられると、`null` バージョンのコンテンツが失われます。

次の図は、null バージョンが存在しないバケットを示しています。この場合、`DELETE` は何も削除しません。代わりに、Amazon S3 は削除マーカーを挿入します。

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


バージョニングが停止されたバケットでも、`DELETE` リクエストのアクセス許可が明示的に否定されていない限り、バケット所有者は `DELETE` リクエストにバージョン ID を含めることで、指定されたバージョンを完全に削除できます。例えば、`null` バージョン ID を持つオブジェクトの削除を拒否するには、`s3:DeleteObject` および `s3:DeleteObjectVersions` アクセス許可を明示的に拒否する必要があります。

次の図は、指定したオブジェクトバージョンを削除することによって、そのオブジェクトのバージョンを完全に削除する方法を示しています。バケット所有者のみが、指定したオブジェクトバージョンを削除することができます。

![\[指定したバージョン ID を使用した完全なオブジェクトの削除を説明する図\]](http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/images/versioning_DELETE_versioningEnabled2.png)


# バージョニングのトラブルシューティング
<a name="troubleshooting-versioning"></a>

次のトピックは Amazon S3 のバージョニングのよくある問題をトラブルシューティングするのに役立ちます。

**Topics**
+ [バージョニングが有効なバケットで、誤って削除されたオブジェクトを復元する](#recover-objects)
+ [バージョニングされたオブジェクトを完全に削除する](#delete-objects-permanent)
+ [バケットのバージョニングを有効にした後、パフォーマンスが低下している](#performance-degradation)

## バージョニングが有効なバケットで、誤って削除されたオブジェクトを復元する
<a name="recover-objects"></a>

一般に、S3 バケットからオブジェクトバージョンが削除された場合、それらを Amazon S3 で復元する方法はありません。ただし、S3 バケットで S3 バージョニングを有効にしている場合、バージョン ID を指定しない `DELETE` リクエストでは、オブジェクトを完全に削除できません。代わりに、削除マーカーがプレースホルダーとして追加されます。この削除マーカーはオブジェクトの最新バージョンになります。

削除したオブジェクトが完全に削除されているのか、一時的に削除されているのか (その場所に削除マーカーが表示されているか) を確認するには、次の手順に従います。

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

1. 左側のナビゲーションペインで、**[バケット]** を選択します。

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

1. **[オブジェクト]**リストで、検索バーの右側にある**[バージョンの表示]**トグルをオンにして、検索バーで削除されたオブジェクトを検索します。このトグルは、バケットで以前にバージョニングが有効だった場合に限り使用できます。

   [S3 インベントリを使用して、削除されたオブジェクトを検索する](storage-inventory.md#storage-inventory-contents)こともできます。

1. **[バージョンの表示]** の切り替えや、インベントリレポートの作成の後にオブジェクトが見つからず、オブジェクトの[削除マーカー](DeleteMarker.md)も見つからない場合、完全に削除され、オブジェクトを復元することはできません。



また、AWS Command Line Interface (AWS CLI) の `HeadObject` API オペレーションを使用して、削除されたオブジェクトの状態を確認できます。それには、次の `head-object` コマンドを使用して、`user input placeholders` を自分の情報に置き換えます。

`aws s3api head-object --bucket amzn-s3-demo-bucket --key index.html`

最新バージョンが削除マーカーであるバージョニングされたオブジェクトに対して `head-object` コマンドを実行すると、404 Not Foundエラーが表示されます。例えば、次のようになります。

HeadObject オペレーションの呼び出し時にエラーが発生しました (404): Not Found

バージョニングされたオブジェクトに対して `head-object` コマンドを実行し、オブジェクトのバージョン ID を指定すると、Amazon S3 はオブジェクトのメタデータを取得し、オブジェクトがまだ存在し、完全に削除されていないことを確認します。

`aws s3api head-object --bucket amzn-s3-demo-bucket --key index.html --version-id versionID`

```
{
"AcceptRanges": "bytes",
"ContentType": "text/html",
"LastModified": "Thu, 16 Apr 2015 18:19:14 GMT",
"ContentLength": 77,
"VersionId": "Zg5HyL7m.eZU9iM7AVlJkrqAiE.0UG4q",
"ETag": "\"30a6ec7e1a9ad79c203d05a589c8b400\"",
"Metadata": {}
}
```

オブジェクトが見つかり、最新バージョンが削除マーカーの場合、オブジェクトの以前のバージョンがまだ存在します。削除マーカーはオブジェクトの最新バージョンであるため、削除マーカーを削除することでオブジェクトを復元できます。

削除マーカーを完全に削除すると、2 番目に新しいバージョンのオブジェクトが最新のバージョンのオブジェクトになり、オブジェクトを再び使用できるようになります。オブジェクトの復元方法を視覚的に説明するには、「[削除マーカーの削除](ManagingDelMarkers.md#RemDelMarker)」を参照してください。

特定のバージョンのオブジェクトを削除するには、バケット所有者になる必要があります。削除マーカーを完全に削除するには、`DeleteObject` リクエストにそのバージョン ID を含める必要があります。それには、次のコマンドを使用して、`user input placeholders` を自分の情報に置き換えます。

****  
`aws s3api delete-object --bucket amzn-s3-demo-bucket --key index.html --version-id versionID`

`delete-object` コマンドの詳細については、*AWS CLI コマンドリファレンス*の「[https://docs.aws.amazon.com//cli/latest/reference/s3api/delete-object.html](https://docs.aws.amazon.com//cli/latest/reference/s3api/delete-object.html)」を参照してください。削除マーカーの完全削除の詳細については、「[削除マーカーの管理](ManagingDelMarkers.md)」を参照してください。

## バージョニングされたオブジェクトを完全に削除する
<a name="delete-objects-permanent"></a>

バージョニングが有効なバケットでは、バージョン ID のない `DELETE` リクエストではオブジェクトを完全に削除することはできません。このようなリクエストでは、代わりに削除マーカーが挿入されます。

バージョニングされたオブジェクトを完全に削除するには、以下の方法から選択できます。
+ S3 ライフサイクルルールを作成して、最新ではないバージョンを完全に削除します。最新ではないバージョンのオブジェクトを完全に削除するには、**[現在のバージョンではないオブジェクトを完全に削除する]**を選択し、**[オブジェクトが最新バージョンでなくなってからの日数]**に日数を入力します。オプションで、**[Number of newer versions to retain]** (保持する新しいバージョンの数) に値を入力して、保持する新しいバージョンの数を指定できます。このルールの作成については、「[S3 ライフサイクル設定の指定](how-to-set-lifecycle-configuration-intro.md)」を参照してください。
+ `DELETE` リクエストにバージョン ID を含め、指定されたバージョンを削除します。詳細については、「[バージョニングされたオブジェクトの完全削除方法](DeletingObjectVersions.md#delete-request-use-cases)」を参照してください。
+ 現在のバージョンを期限切れにするライフサイクルルールを作成します。オブジェクトの現在のバージョンを期限切れにするには、**[オブジェクトの現行バージョンを期限切れにする]**を選択し、**[オブジェクトの作成後の日数]**に日数を入力します。このライフサイクルルールの作成については、「[S3 ライフサイクル設定の指定](how-to-set-lifecycle-configuration-intro.md)」を参照してください。
+ バージョニングされたオブジェクトと削除マーカーをすべて完全に削除するには、2 つのライフサイクルルールを作成します。1 つは現在のバージョンを期限切れにして古いバージョンのオブジェクトを完全に削除するルールで、もう 1 つは期限切れのオブジェクト削除マーカーを削除するルールです。

バージョニングが有効なバケットでは、バージョン ID を指定しない `DELETE` リクエストでは、`NULL` バージョン ID を持つオブジェクトのみを削除できます。バージョニングが有効の場合にオブジェクトがアップロードされた場合、バージョン ID を指定しない `DELETE` リクエストにより、そのオブジェクトの削除マーカーを作成します。

**注記**  
S3 オブジェクトロックが有効なバケットでは、保護されたオブジェクトバージョン ID を含む `DELETE` オブジェクトリクエストにより、403 Access Denied エラーが発生します。バージョン ID のない `DELETE` オブジェクトリクエストでは、200 OK レスポンスでオブジェクトの最新バージョンとして削除マーカーが追加されます。オブジェクトロックで保護されているオブジェクトは、その保存期間とリーガルホールドが解除されるまで完全に削除できません。詳細については、「[S3 オブジェクトロックの仕組み](object-lock.md#object-lock-overview)」を参照してください。

## バケットのバージョニングを有効にした後、パフォーマンスが低下している
<a name="performance-degradation"></a>

削除マーカーやバージョニングされたオブジェクトが多すぎる場合や、ベストプラクティスに従わない場合、バージョニングが有効なバケットでパフォーマンスが低下する可能性があります。

**削除マーカーが多すぎる**  
バケットでバージョニングを有効にすると、オブジェクトに対してバージョン ID を持たない `DELETE` リクエストを行うと、一意のバージョン ID の削除マーカーが作成されます。**現在のバージョンのオブジェクトを期限切れにする**ルールを含むライフサイクル設定では、すべてのオブジェクトに一意のバージョン ID を持つ削除マーカーが追加されます。削除マーカーが多すぎると、バケットのパフォーマンスが低下する可能性があります。

バケットでバージョニングが停止すると、Amazon S3 では新しく作成されたオブジェクトに対するバージョン ID を `NULL` としてマークします。バージョニングが停止されたバケットで期限切れアクションを行うと、Amazon S3 がバージョン ID として `NULL` を使用する削除マーカーを作成します。バージョニングが停止されたバケットでは、すべての削除リクエストに対して `NULL` 削除マーカーが作成されます。これらの `NULL` 削除マーカーは、すべてのオブジェクトバージョンが削除され、単一の削除マーカーだけが残っている場合、期限切れオブジェクト削除マーカーとも呼ばれます。`NULL` 削除マーカーが多すぎると、バケットのパフォーマンスが低下します。

**バージョニングされたオブジェクトが多すぎる**  
バージョニングが有効なバケットに数百万のバージョンのオブジェクトが含まれている場合、503 Service Unavailable エラーが増える可能性があります。バージョニングを有効にしたバケットへの `PUT` または `DELETE` オブジェクトリクエストに対して受信される HTTP 503 Service Unavailable レスポンスの数が著しく増加した場合、バケットに数百万のバージョンが存在するオブジェクトがある可能性があります。何百万ものバージョンのオブジェクトがある場合、Amazon S3 はバケットへのリクエストを自動的に制限します。リクエストのスロットリングによって、過剰なリクエストトラフィックからバケットを保護しますが、同じバケットに対して行われた他のリクエストに支障がある可能性があります。

数百万のバージョンがあるオブジェクトを確認するには、S3 インベントリを使用します。S3 インベントリは、バケット内のオブジェクトのフラットファイルリストを提供するレポートを生成します。詳細については、「[S3 インベントリを使用したデータのカタログ化と分析](storage-inventory.md)」を参照してください。

バケット内でバージョニングされたオブジェクト数が多いかどうかを確認するには、S3 Storage Lens メトリクスを使用して、**現在のバージョンのオブジェクト数**、**最新ではないバージョンのオブジェクト数**、**削除マーカーのオブジェクト数**を表示します。Storage Lens メトリクスの詳細については、「[Amazon S3 Storage Lens のメトリクスに関する用語集](storage_lens_metrics_glossary.md)」を参照してください。

Amazon S3 チームでは、同じオブジェクトを繰り返し上書きし、そのオブジェクトに対して数百万のバージョンを作成する可能性のあるアプリケーションを調査して、アプリケーションが意図どおり動作しているかどうか調査することをお客様にお勧めしています。例えば、アプリケーションが毎分同じオブジェクトを 1 週間上書きすると、1 万を超えるバージョンが作成されることになります。各オブジェクトに保存するバージョンは 10 万未満にすることをお勧めします。単一または複数の Amazon S3 オブジェクトに対して数百万のバージョンを必要とするユースケースがある場合の最適なソリューションを決定するには、AWS サポート チームにご相談ください。

**ベストプラクティス**  
バージョニングに関連したパフォーマンス低下の問題を防ぐため、次のベストプラクティスを採用することをお勧めします。
+ ライフサイクルルールを有効にして、以前のバージョンのオブジェクトを期限切れにする。例えば、オブジェクトが最新ではない状態になってから 30 日後に、最新ではないバージョンを期限切れにするライフサイクルルールを作成できます。すべてを削除する必要がない場合は、最新ではないバージョンを複数保持することもできます。詳細については、「[S3 ライフサイクル設定の指定](how-to-set-lifecycle-configuration-intro.md)」を参照してください。
+ ライフサイクルルールを有効にして、バケットに関連するデータオブジェクトがない期限切れのオブジェクト削除マーカーを削除します。詳細については、「[期限切れオブジェクト削除マーカーの削除](lifecycle-configuration-examples.md#lifecycle-config-conceptual-ex7)」を参照してください。

Amazon S3 のパフォーマンス最適化に関するその他のベストプラクティスについては、「[ベストプラクティスのデザインパターン](optimizing-performance.md)」を参照してください。