テストステ論

高テス協会会長が, テストステロンに関する情報をお届けします.

S3のdelete marker

S3におけるオブジェクトの削除はややこしい. その原因は, バージョニングという仕組みのためである. バージョニングをONにすると, オブジェクトをアップロードする毎に新しいバージョンが作られて保存される. この仕組みとオブジェクトの削除の共存が難しそうなことは例えば, 「バージョニングを重ねていったのに削除をすると, 古いバージョンすらも参照不能になるのだろうか?」などと考えると, 簡単には答えられないことから分かる.

バージョニングは, 任意のタイミングでON/OFF出来る. これが話をさらにややこしくする. アマゾンは対策としてdelete markerというものを定義して, この「特殊なバージョン」を積むことで削除を表現する道を選んだ.

以下に仕様を列挙する. これらの仕様は, ドキュメントや図から読み取ったものである.

  1. デフォルトではバージョニングはOFFである.
  2. バージョニングがOFFの場合, 追加されるIDはnullである.
  3. ID nullは2つ以上存在しない.
  4. バージョニングがONの場合, 常に新しいIDが割り当てられる.
  5. バージョニングがOFFの場合, DELETE Objectした時, nullが存在するならばnullを捨ててdelete markerを積む(そのIDはnull)
  6. バージョニングがOFFの場合, DELETE Objectした時, nullが存在しないならそのままdelete markerを積む(そのIDはnull)
  7. バージョニングがONの場合, DELETE Objectした時, delete markerを積む. nullがどこかにあっても関係ない. (DeleteMarkerを参照)
  8. [考察] 従って, 一旦ID nullが追加されると, 何らかの形でID nullは存在し続けることになる. ID null, 非nullの世界を分離させつつ共存させるというのがアマゾンが想定しているモデルと考えられる.
  9. delete markerは最新バージョンとして認識される.
  10. delete markerは, データを保たない特殊なバージョンである.
  11. GET Objectした時, 最新バージョンがdelete markerである場合は, 404を返して, ヘッダにx-amz-delete-marker=trueをつける. このヘッダは, falseの場合は付け足してはならない.
  12. GET ObjectでversionIdを指定することが出来る.
  13. GET Bucketした時, 最新バージョンがdelete markerのものはリストされない.
  14. The only way to list delete markers (and other versions of an object) is by using the versions subresource in a GET Bucket versions request.
  15. バージョニングがONの時, DELETE Objectはpermanentに削除しない. (http://docs.aws.amazon.com/AmazonS3/latest/dev/DeletingObjectVersions.html)
  16. バージョニングがONの時, DELETE ObjectにversionIdパラメータを明示することにより, 特定のバージョンを削除出来る. バージョンを指定した場合, permanentに削除されることになる. これは, delete markerにも有効である.
  17. versionIdを明示してDELETE Objectした場合, もしそれがdelete markerであれば, delete markerが削除される. これによってオブジェクトがreappearする可能性がある(404でなくなる).
  18. delete markerを削除した場合, 204を返して, x-amz-version-id, x-amz-delete-marker=trueを含む. (RemDelMarkerを参照)
  19. 最新バージョンがdelete markerのものをさらにDELETE Objectした場合は, さらにdelete markerを持つ
  20. DELETE Bucketは前提条件として, その中にあるすべてのオブジェクト(すべてのバージョン, すべてのdelete markers)が削除されていることを前提とする. (ID=nullの扱いはどうするのか?つまり, ID=nullのdelete markerだけが残っている or 全消滅な状態にしろということだろうか)

疑問:

  1. バージョニングをONにしてID非nullのバージョンを積む. 次に, バージョニングをOFFにしてGET Objectしたらどうなるのだろうか?アマゾンのモデルでは, 古いID nullのバージョンを読みに行ってしまう可能性がある. このような場合も吸収出来る実装にする必要がある.
  2. バージョニングがOFFの時にGET Bucket versionsをするとどうなるのか?(私の考えでは, 全バージョンを表示する. バージョニングが一旦ONになると, OFFにするにはSuspendしかないから. 完全に無効化することが不可能)
広告を非表示にする