バージョン管理は同一のバケット内に同一のオブジェクトの複数のバージョンを保存する場合に使用します。例えば、1つのバケット内に、オブジェクトキーは同じpicture.jpgでも、バージョンIDが100000、100101、120002のように異なる複数のオブジェクトを保存することができます。ユーザーがあるバケットでバージョン管理機能を有効にすると、バケット内に保存したオブジェクトをバージョンIDに基づいて照会、削除または復元できるようになります。ユーザーが誤って削除したデータや、アプリケーションプログラムの障害によって消失したデータの回復に役立ちます。例えば、ユーザーがバージョン管理されたオブジェクトの削除操作を行う場合は、次のようになります。
バケットには3種類のバージョン管理状態があります。バージョン管理を有効にしていない状態、バージョン管理を有効にしている状態、バージョン管理の一時停止状態です。
注意:
- 一度バージョン管理を有効にしたバケットは、バージョン管理を有効にしていない状態(初期状態)に戻すことはできません。ただし、このバケットのバージョン管理を一時停止することはでき、その後に新たにアップロードされるオブジェクトでは複数のバージョンが生成されなくなります。
- バージョン管理を有効にする前にバケット内に保存されたオブジェクトのバージョンIDは、すべてnullとなっています。
- バージョン管理を有効にする、または一時停止すると、COSがこれらのオブジェクトを処理する際のリクエスト方式が変更されます。オブジェクト自体は変更されません。
- バケットのバージョン管理を一時停止できるのはルートアカウントと権限を持つサブアカウントのみです。
バケットがどのバージョン管理状態にある場合でも、その状態のバケット内のオブジェクトに対し、アップロード、照会および削除操作を行うことができます。バージョン管理を有効にしていない状態を除き、バージョン管理を有効にしている状態およびバージョン管理の一時停止状態であれば、バケット内のオブジェクトの照会および削除操作は、バージョンIDを指定してもしなくても行うことができます。
バケットバージョン管理を有効にする前にすでにバケット内に保存されていたオブジェクトについては、そのバージョンIDはnullとなります。バージョン管理を有効にした後も、バケット内の既存のオブジェクトは変更されず、既存オブジェクトに対するCOSの処理方式(リクエスト方式など)だけが変更されます。この時点で、新たにアップロードされた同名のオブジェクトは異なるバージョンとして同一のバケット内に存在することになります。バージョン管理を有効にしたバケット内でオブジェクトがどのように管理されるかについて、次にご説明します。
注意:バージョン管理を有効にしていないバケットと、有効にしているバケットでは、ユーザーのオブジェクトのアップロード方法は同じですが、バージョンIDが異なります。バージョン管理を有効にしている場合、COSはオブジェクトに特定のバージョンIDを割り当てますが、バージョン管理を有効にしていない場合、バージョンIDは常にnullとなります。
バケットのバージョン管理を有効にすると、ユーザーがPUT、POSTまたはCOPY操作を実行した際、COSがこのバケットに保存するオブジェクトには一意のバージョンIDが自動的に追加されます。
下図のように、バージョン管理を有効にしたバケットにオブジェクトをアップロードすると、COSはそのオブジェクトに一意のバージョンIDを追加します。
COSはバケットにバインドしたversionsパラメータにオブジェクトのバージョン情報を保存します。COSは保存時刻の順序に従ってオブジェクトのバージョンを返します。その際、直近のバージョンが最初に返されます。
次のプロセスによって、versionsパラメータおよびprefixリクエストパラメータを使用して、あるオブジェクトの全バージョンを照会できます。prefixに関するその他の情報については、GET Bucket Object versionsのドキュメントをご参照ください。
あるオブジェクトの全バージョンを照会する場合の、リクエストの例は次のとおりです。
GET /?versions&prefix=ObjectKey HTTP/1.1
ユーザーがGETリクエストを使用する際にバージョンIDを指定しなければ、オブジェクトの現在のバージョンを照会します。下図のように、GETリクエストには123.txtオブジェクトの現在のバージョン(直近のバージョン)が返されます。
ユーザーがGETリクエストを使用する際にバージョンIDを指定した場合は、指定したバージョンIDのオブジェクトを照会します。下図のように、GET versionIdリクエストによって指定したバージョン(現在のバージョンでも可)のオブジェクトを照会します。
オブジェクトの内容ではなく、メタデータのみを照会したい場合は、HEAD操作を使用することができます。デフォルトでは最新バージョンのメタデータを取得します。指定したオブジェクトのバージョンのメタデータを照会したい場合は、リクエストの送信時にバージョンIDを指定します。
指定したバージョンのオブジェクトのメタデータを照会する手順は次のとおりです。
必要に応じて、不要なオブジェクトのバージョンを随時削除することができます。ユーザーがバージョン管理を有効にしている状態でDELETEリクエストを使用するケースには次の2つがあります。
ユーザーがバージョンIDを指定せず、通常のDELETE操作を実行する場合。
この操作のケースは削除されたオブジェクトを「ごみ箱」に入れる場合に似ていますが、オブジェクトを完全に消去してはおらず、その後ユーザーが必要とする場合はデータを復元できます。
下図のように、ユーザーがDELETE操作の際にバージョンIDを指定しなかった場合、実際にはKey=123.txtのオブジェクトは削除されず、新しい削除タグが挿入され、新しいバージョンIDが追加されます。
注意:COSはバケット内で、削除されるオブジェクトに新しいバージョンIDを持つ削除タグを挿入し、この削除タグが削除されるオブジェクトの現在のバージョンとなります。この削除タグのあるオブジェクトに対しGET操作の実行を試すと、COSはこのオブジェクトが存在しないと認識し、404エラーを返します。
ユーザーがバージョンIDを指定して、オブジェクトバージョンの削除操作を実行した場合、このケースではバージョン管理されたオブジェクトを永久に削除することができます。
バージョン管理によってオブジェクトの初期バージョンを復元することができます。この操作を実行するには2つの方法があります。
バージョン管理を一時停止した場合、バケット内の既存のオブジェクトは変更されません。変更されるのはCOSがそれ以降のリクエストにおいてオブジェクトを処理する方式です。バージョン管理を一時停止しているバケット内でオブジェクトがどのように管理されるかについて、次にご説明します。
バケット上でバージョン管理を一時停止すると、ユーザーがPUT、POSTまたはCOPY操作を実行した際、COSはこのバケット内に保存されるオブジェクトに、バージョンIDをnullとして自動的に追加します。下図に示します。
バケット内にバージョン管理を行っているオブジェクトが存在する場合、バケットにアップロードされたオブジェクトが現在のバージョンとなり、バージョンIDはnullとなります。下図に示します。
バケット内に空のバージョンがすでに存在する場合、この空のバージョンは上書きされ、それまでのオブジェクトの内容もそれに応じて置き換えられます。下図に示します。
バージョン管理を一時停止したバケットで、ユーザーがGET Objectリクエストを送信すると、オブジェクトの現在のバージョンが返されます。
バージョン管理を一時停止した状態でDELETEリクエストを実行すると、次のようになります。
バケット内に空のバージョンのオブジェクトが存在する場合は、バージョンIDがnullのオブジェクトを削除します。
下図のように、ユーザーが通常のDELETE操作を実行した際、COSは空のバージョンのオブジェクトに削除タグを挿入します。
注意:削除タグには内容が存在しません。削除タグが空のバージョンに置き換わった時点で、空のバージョンの元の内容は失われます。
バケット内に空のバージョンのオブジェクトが存在しない場合は、バケット内に新たに削除タグが追加されます。
下図のように、バケットに空のバージョンが存在しない場合、ユーザーがDELETE操作を実行してもいかなる内容も削除されず、COSが削除タグを挿入するだけとなります。
バージョン管理を一時停止しているバケットであっても、ルートアカウントであれば指定したバージョンを永久に削除することができます。
下図のように、指定したオブジェクトのバージョンを削除すると、そのオブジェクトは永久に削除されます。
注意:指定したオブジェクトのバージョンを削除できるのは、ルートアカウントまたはルートアカウントから権限を付与されたアカウントのみです。
この記事はお役に立ちましたか?