Amazon Simple Storage Service

削除を行うライフサイクルルールをバケット内のすべてのオブジェクトに適用した場合フォルダはどうなるのか問題

ご挨拶

お疲れ様です。寺井です。

入社してから半年が経過しました。
会社や仕事にも少しずつ慣れてくる頃かと思いますが、初心を忘れることなく、前のめりに頑張っていきたいです。(真面目

背景と目的

今回やることとしてはタイトルにある通りですが、S3にライフサイクルルールを設定する場面は多いかと思います。

ケースとしては、

  • ログを◯年間だけ保存したい
  • ◯ヶ月後にはほぼ閲覧しなくなるからアーカイブしたい
  • コスト削減のために◯日後にストレージクラスを変更したい

といったもの等が考えられますね。

しかし構築中にふと思いました。


「フォルダってどうなるんだ…?」


今回の検証のまとめ

結論から先にお伝えするとフォルダも消えてしまいます

まとめるとこんな感じ、

  • [ルールスコープ][全てのオブジェクトに適用]とした場合、「フォルダ」もルールの適用対象となる(0バイトのオブジェクトであるため)
  • 消されたくないフォルダがある場合は[最小オブジェクトサイズ][1バイト以上]とする

こうすることで、フォルダが削除されてしまうことを防ぐことができそうです。

しかしフォルダ以外にも「0バイトのオブジェクト」が存在する場合、上記のようなルールは適用外となってしまうので、プレフィックスオブジェクトタグによる条件の組み合わせも検討するべきかと思います。

ここからは、どのような検証を行ったか、その苦しみ悩んださまをお話します。

S3の「フォルダ」って?

S3のフォルダに関する扱いについて、公式では以下のように記されています。

Amazon S3 はフラットな構造であり、ファイルシステムに見られる階層はありません
Amazon S3 にフォルダを作成すると、S3 は、指定したフォルダ名に設定されたキーを持つ 0 バイトのオブジェクトを作成します。
引用:フォルダを使用して Amazon S3 コンソールでオブジェクトを整理する - Amazon Simple Storage Service

あくまでも、ユーザーがデータを視覚的に理解しやすくするための「概念」としてサポートしているということのようです。

ライフサイクルルール設定時の注意画面

また、S3のマネジメントコンソールからライフサイクルルールを作成する際に
[バケット内のすべてのオブジェクトに適用]を選択していると、以下のような注意文が出てきます。

怖い…。すんごい念押しで確認してきますね。

この「全てのオブジェクト」ってのが、S3的に言う「フォルダ(0 バイトのオブジェクト)」も含まれているのかどうか、ということですが。

調べるだけだと不安なのでやってみました!!!

準備

S3バケットの作成とオブジェクトの設置

適当な名前でS3バケットを作成して、以下のパターンでフォルダとファイルを設置しました。

  1. S3バケット直下に直置きしたファイル
  2. 中身が空のフォルダ
  3. ファイルを含むフォルダ
  4. フォルダの中に中身が空のフォルダファイルを含むフォルダを含むフォルダ
  5. フォルダの中にファイルを含むフォルダの中に有効期限が一日未満の(新しい)ファイル

ちょっと何言ってるのかわかんないですね。
言葉だと分かりづら過ぎるので、ツリー構造にしました。

s3bucket/
    ├── ファイル.txt                    ・・・(1)
    ├── 空のフォルダ/                   ・・・(2)
    ├── ファイルを含むフォルダ/         ・・・(3)
    │   └── ファイル.txt
    └── (2),(3)を含むフォルダ/          ・・・(4)
            ├── 空のフォルダ/
            └── ファイルを含むフォルダ/
                └── newファイル.txt     ・・・(5)

[検証]S3ライフサイクルルールの設定

ライフサイクルルールにはこちらの内容で設定しました。

  • ルールスコープ:バケット全体
  • ライフサイクルルールのアクション:オブジェクトの現行バージョンを有効期限切れにする
  • オブジェクト作成後の日数:1

設定内容は以上となります。

[検証]希望的観測

希望としては、
有効期限切れのオブジェクトのみ削除されて、フォルダは残っている
という状態だと助かるような…。
→(2),(3),(4),(5)が残っていると良い

さあ、後はこれらのファイルが1日経過後にどのようになっているのか…
明日の結果を待ちます。

[検証]結果

~翌日~

不安と期待に胸を膨らませながら、対象のS3バケットを開きます。

結果は・・・・・・



ほとんど消えてるううぅぅぅ!!!!

残ったのはこれらのみという結果でした。

s3bucket/
    └── 階層構造を含むフォルダ/          ・・・(4)
            └── ファイルを含むフォルダ/
                └── newファイル.txt      ・・・(5)

結果として、更新された(有効期限切れという扱いにならない)ファイルが存在するフォルダのみ、生き残ったということになりますね。

ログの定期的な保存などによって、頻繁に更新が入るようなら気にする必要はありませんが、データの格納が不定期に行われる場合などは、気をつける必要がありそうです。

[追加検証]フォルダが消えないようにライフサイクルルールを設定したい

S3のフォルダに関する記述にもあるように、フォルダを作成すると「0 バイトのオブジェクト」が作成されるということなので、ライフサイクルルールのスコープを以下の内容に変更します。

  • ルールスコープバケット全体 → 1 つ以上のフィルターを使用してこのルールのスコープを制限する
    • フィルタータイプ:オブジェクトサイズ → 最小オブジェクトサイズを指定 → 1バイト
  • ライフサイクルルールのアクション:オブジェクトの現行バージョンを有効期限切れにする
  • オブジェクト作成後の日数:1

先ほどの検証で生き残った[newファイル.txt(5)]は変更せずに、有効期限切れ扱いになるようにしておきます。

構造はこちら

s3bucket/
    └── 階層構造を含むフォルダ/          ・・・(4)
            └── ファイルを含むフォルダ/
                └── newファイル.txt      ・・・(5)

[追加検証]希望的観測

前回のルール設定だと、ファイルとファイルを含むフォルダも削除される状態ですが、これなら「0 バイトのオブジェクト」であるフォルダは削除されずに済みそうです。
→(4),(ファイルを含むフォルダ/)が残るはず…!!

[追加検証]結果

~翌日~

流石にうまいことできてるやろ。

結果は・・・・・・



全部消えてるううぅぅぅ!!?!?
なんでや!「0 バイトのオブジェクト」とはなんやったんや!?!

何故こんなことになってしまったのか、隣席の全冠ニキに相談したところ

ニキ「最初のライフサイクルルールで既に消えているのかもしれないですね」

それや!!!

1回目の検証時点では全てのオブジェクトに対するルールを設定していました。
「0 バイトのオブジェクト」であるフォルダは削除されていて、コンソールからは見かけ上存在しているように見えているだけ(「お前はもう死んでいる」状態)なのかも…?

ということでさらなる検証を始めましょう…。
(このブログいつになったら上げられるんや)

[シン・追加検証]ルールはそのままでフォルダを作り直す

全冠ニキの見解を踏まえ、最初のライフサイクルルールの実行時点で消されていたことを想定し、ルールはそのままでフォルダを作り直してみます。

構造はこちら

s3bucket/
    ├── new空のフォルダ/                   ・・・(1)
    └── newファイルを含むフォルダ/          ・・・(2)
        └── ファイル.txt                   ・・・(3)

[シン・追加検証]希望的観測

これで今度こそ「0 バイトのオブジェクト」であるフォルダは削除されず、ファイルだけが消されることでしょう…。
→(1),(2)が残るはず…!!

[シン・追加検証]結果

~翌日~

もうこの検証うんざりやで…。
頼む、想定通りであってくれ…ッッ!!!!!

結果は・・・・・・・・・・・・





残ってましたあああ!!!!

フォルダの中のファイルだけが削除されて、フォルダはどちらも生き残るという結果に!!

s3bucket/
    ├── new空のフォルダ/                   ・・・(1)
    └── newファイルを含むフォルダ/          ・・・(2)

感想

最後は想定通りの結果が得られて大変満足です。
ライフサイクルルールは大変便利な機能ですが、S3のフォルダの概念を理解していないと事故の発生に繋がりそうで、気をつけないといけないですね。

ありがとうございました!

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA