はじめに
S3のバージョニングについて理解が浅いと感じたため、内容をちゃんと理解したいと思い備忘として書き留めます。
正直申し上げますと、AWS公式の情報を見ればご丁寧に説明されていますので、公式の情報で十分という方はそちらをご覧になった方が良いかと思います。
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/versioning-workflows.html
バージョニングのステータス
S3のバージョニングのステータスには以下3つの状態があります。
- 有効
- 無効
- 停止
有効の場合
わかりやすく図解します。
バージョニングを有効にするとオブジェクトに対してバージョンIDが付与されます。
バージョニングが有効にされる前にオブジェクトが格納されていた場合にはnull値となります。
バージョニングを有効化後、既にS3に格納されているtest.txtと同じ名称のオブジェクトをPutすると以前のtest.txtは以前のバージョンとされ、Putされたtest.txtが現行バージョンとしてバージョンID: 101が付与されます。
さらに、同じ名称のオブジェクトをPutするとバージョンIDが更新され、バージョンID 102が現行バージョンとなり、101は以前のバージョンのオブジェクトとして管理されます。
つまり、同じ名称のオブジェクトをPutしてもオブジェクトは上書きされず、バージョン管理されバケットに残ります。

実際に動きを見てみましょう。
バージョニングを有効化すると、バケットのオブジェクトタブに[バージョンの表示]という表記がされるようになります。

現状、nullのバージョンIDが付与されたオブジェクトが格納されています。
全く同じtest.txtをPutしてみます。

全く同じtest.txtをPutした結果が以下です。

もともと存在していたバージョンID: nullのtest.txtと現行のバージョンのバージョンIDが付与されたtest.txtがオブジェクトが存在します。
さらにもう一度test.txtをPutしてみます。
さらに以前のバージョンにnullとKpZsu6m4QNS8Cr.iSEbCRHukXnTwAkjeが移動し、現行のバージョンIDにKlczlM9kUhWDAYLmigKxaQpLlXCxJZggというIDが付与されました。

これが図解した実際のバージョニングの動きになります。
有効にした場合のメリット
誤って対象オブジェクトを削除してしまった場合に、以前バージョンのオブジェクトを取得できることがバージョニングを有効化にしてるメリットです。
オブジェクトを削除してしまった場合、どのような動きになるかというと、削除マーカーと呼ばれる削除フラグが付きます。いわゆる論理削除ですね。
削除マーカーとは
バージョニングが有効化されたオブジェクトでオブジェクトの削除を実行すると、見た目上はオブジェクトが削除されたように見えますが、現行のバージョンIDのオブジェクトは実際には削除されません。
先ほどお話した削除マーカーのフラグが付与され、現行のバージョンが以前のバージョンに移動し、削除マーカーのついたオブジェクトが現行のバージョンとなります。
図解します。
現行バージョンであるバージョンID: 102のオブジェクトを削除します。

バージョンID: 102は以前のバージョンに移動し、新たにバージョンID: 103のバージョンIDが付与された、かつ削除マーカーフラグのついたオブジェクトが現行のバージョンとなります。

実際にどういう動きをするか見てみましょう。
現行バージョンのオブジェクトを削除してみます。
オブジェクトの削除を実行すると[指定したオブジェクトを削除すると、削除マーカーが追加されます。]といういメッセージが表示され、対象オブジェクトに対して削除マーカーを付与する動きになります。

テキストフィールドに[削除]と入力し、[オブジェクトの削除]をしてみます。
オブジェクトが削除されると、[バージョンの表示]を無効にしている状態だと、あたかもオブジェクトがなくなっているように見えますが、[バージョンの表示]を有効にすると、削除マーカーのフラグが立ち、現行のバージョンとして存在することになります。
オブジェクトのバージョン情報を確認すると、削除マーカーフラグのついたオブジェクトが現行のバージョンとなっていることがわかります。

では、論理削除してしまったオブジェクトはどのようにして復元するのでしょうか?
復元方法
やり方は簡単です。
方法は2つあります。
-
削除マーカーのオブジェクトを完全に削除して以前のバージョンを現行のバージョンにする(この場合、以前のバージョンの最新のバージョンのものが復元されます) - 復元したいバージョンIDのオブジェクトをダウンロードして、新たに
Putする (この方法だと特定のバージョンIDを指定して復元することが可能)
削除マーカーのオブジェクトを完全に削除して以前のバージョンを現行バージョンにする
削除マーカーのオブジェクトを完全に削除すると、以前のバージョンの最新バージョンが繰り上がることになります。

実際に削除マーカーのオブジェクトを削除してみます。
オブジェクトを[完全に削除]するかどうかを聞かれるので、テキストフィールドに[完全に削除]を入力すると、文字通り完全に削除されます。

想定通り、以前のバージョンとして存在していた最新のバージョンが現行バージョンとして君臨することになりました。

[バージョンの表示]を無効化状態にすると、オブジェクトが復活しています。

復元したいバージョンIDのオブジェクトをダウンロードして、新たにPutする
この場合、特定のバージョンIDのオブジェクトを新たにPutすることで特定のオブジェクトを復元することができます。

ただし、動きとしては、バージョンID: 102をダウンロードして新にPutした場合、新たにPutされたオブジェクトに最新のバージョンIDが付与され、削除マーカーフラグのついたオブジェクトは以前のバージョンに移動することになります。

実際に以前のバージョンをダウンロードして、Putしてみましょう。

Putした結果は以下です。
[バージョンの表示]を無効化状態で表示すると、オブジェクトが復元されています。

新たに最新のバージョンIDが付与されたオブジェクトが現行のバージョンとなり、削除マーカーについたオブジェクトは以前のバージョンになっていることがわかります。

ここまででバージョニングの有効状態がどういう動きをするか?削除した場合はどうなるのか?復元方法、などが理解できたかと思います。
無効/停止の場合
バージョニングの無効と停止の動きを見てみましょう。
私は最初、停止なら無効状態と同じでは?と思っていましたが、若干挙動に違いがありましたのでここで整理したいと思います。
AWS公式にもある通り、バージョニングが有効ではない場合、オブジェクトのバージョンIDはnullに設定します。
無効状態のバケットに対してオブジェクトをPutすると、特定のバージョンIDは付与されません。

よって、同じ名称のオブジェクトをPutすれば上書きされますし、削除すればそのまま[完全に削除]されます。
当然削除マーカーも付与されません。
では停止状態はどうでしょうか?
先ほどの有効化していたバケットのバージョニングを停止にします。

停止状態でオブジェクトをPutしてみます。
現行のオブジェクトが存在します。

[バージョンの表示]を有効にし、オブジェクトを確認すると、バージョンID: nullが付与されたオブジェクトが存在します。

このオブジェクトを削除してみましょう。
[完全に削除しますか?]のメッセージが表示され、[完全に削除]するのですが…

実際は完全に削除されず、削除マーカーが付与され、バージョンID: nullのバージョンが実際には残っています。

ここが無効と停止の大きな違いになるかと思います。
停止状態のバケットは見た目上はオブジェクトが存在しないように見えるのですが、実際には削除マーカーフラグのオブジェクトが存在しており、バケットを削除しようとすると、以下のように[バケットが空ではありません]というメッセージが表示されます。
無効と停止ではここに違いがあるため、料金の違いも出てくるため注意が必要となります。
まとめ
バケットのバージョニングの各ステータスについて解説しました。
それぞれの状態の動作にはそれぞれ違いがあるということが分かったかと思います。
細かい設定内容の違いですが、動作確認してみると意外に奥が深いことがわかりますね。



