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