【AWS】Amazon S3 オブジェクトロック有効時のライフサイクルルールについて


みなさん、こんにちは。TC部所属のsr2525です。

今回はAmazon S3(以下S3)について、私が悩んだ点についてご紹介させていただきます。



それは、表題にもある「オブジェクトロック有効時のライフサイクルルールについて」です。
オブジェクトロック有効時にどのようにライフサイクルルールを設定すれば、望んだ期間経過後にオブジェクトを削除できるのか、バージョニングとの兼ね合いは、など実際に検証した結果をまとめながら共有させていただこうと思います。

1.オブジェクトロックとは

S3にあるオブジェクトを削除/上書きできないように保護する設定です。
操作ミスでの誤った削除/上書き、悪意を持った削除/上書きを防止します。


オブジェクトロックについてのAWS公式ドキュメントは以下です。
docs.aws.amazon.com



2.ライフサイクルルールとは

S3にあるオブジェクトを別のストレージクラスに移動したり、一定期間経過後に削除するときに使用する設定です。

ただし、オブジェクトロックが有効の場合、ライフサイクルでは完全に削除されず削除マーカーが付与され論理削除の状態となります。(削除マーカーが現行バージョンとなり、対象のオブジェクトは非現行バージョンとなり残る)
非現行バージョンについては、オブジェクトロックの保護期間が過ぎたものについては完全に削除が可能です。
このあたりは設定時に注意が必要です。


ライフサイクルルールについてのAWS公式ドキュメントは以下です。
docs.aws.amazon.com


それでは設定をしていきましょう。

3. オブジェクトロックの設定

S3 バケット作成時はオブジェクトロックの有効/無効のみ設定することができます。
バケット作成後にも設定することができるので、バケット作成時に必ず有効にしなくても問題ありません。

このほかに、保持期間や保持モードを設定する必要がありますが、バケット作成後に設定することができます。
具体的には「対象のバケット > プロパティタブ > オブジェクトロック」にて設定を行います。
今回の設定値は以下になります。

それぞれの設定項目の説明は以下になります。
※詳細は上述の公式ドキュメントを参照してください。
・オブジェクトロックの有効/無効
オブジェクトロックの有効/無効を設定します。
※一度オブジェクトロックを有効にすると、無効化にすることはできないので注意
有効にする場合、S3 バケット全体に影響するため了承のチェックをします。
・デフォルトの保持
有効にするとオブジェクトを削除/上書きから保護します。
・デフォルトの保持モード
以下2種類のモードがあります。
ガバナンス:特定のIAMアクセス許可を持つユーザーであれば、保持期間中であってもオブジェクトの削除/上書きが可能
コンプライアンス:保持期間中オブジェクトの削除/上書きは全ユーザー不可
・デフォルトの保持期間
オブジェクトを保持する期間を指定します。(日 or 年)

4. ライフサイクルルールの作成

次にライフサイクルルールを作成していきます。
以下の2つのルールを作成します。

  1. オブジェクトを削除するためのルール
  2. 有効期限切れのオブジェクト削除マーカーを削除するルール

4-1.オブジェクトを削除するためのルール

オブジェクトが作成されてから削除するまでの期間を設定します。
具体的には「対象のバケット > 管理タブ > ライフサイクルルール」にて設定を行います。
今回の設定値は以下になります。


ここで注意が必要なのが、オブジェクトロックの保持期間との関係です。
オブジェクトロックの保持期間とライフサイクルの完全削除のタイミングが被らないようにしましょう。
理由は、オブジェクトロックの保持期間中は、ライフサイクルルールの「オブジェクトの現行バージョンの有効期限が切れる」で設定した期間後に削除マーカーは付与することができますが、オブジェクトを完全に削除することはできないためです。
そのため、オブジェクトロックの保持期間が過ぎてから、オブジェクトを完全に削除するような設定をしてあげる必要があります。
今回は「デフォルトの保持期間」を「1日」としているので、ライフサイクルルールの設定値の合計は「2日」以上になるようにしました。



ここで設定中に登場していまいち何のことか分かりにくい「削除マーカー」について触れておきます。
「削除マーカー」はバージョニングが有効なバケットのオブジェクトを削除する際に付与されるもので、付与されたオブジェクトは非現行バージョンとなり論理削除された状態になります。
削除マーカーは現行バージョンとして扱われます。非現行バージョンにオブジェクトが残っているうちに削除マーカーを削除すると、論理削除が解消され対象のオブジェクトを現行バージョンに戻すことも可能です(今回はオブジェクトロックをかけているので実施不可)。
ライフサイクルルールにより削除マーカーを付与して、非現行バージョンになったオブジェクトを完全削除する、という流れになります。

4-2.有効期限切れのオブジェクト削除マーカーを削除するためのルール

先ほどの説明で「削除マーカー」は分かったけど、「有効期限切れ」とは何だ?という疑問が出た方もいるかもしれません。
「有効期限切れのオブジェクト削除マーカー」とは、非現行バージョンにあったオブジェクトが削除され、削除マーカーのみが残った状態のものをいいます。


この有効期限切れの削除マーカーを消すための設定をしていきます。
設定値は以下になります。


なぜ違うライフルサイクルルールを作る必要があるかですが、
1つ目の「オブジェクトを削除するためのルール」で「オブジェクトの現行バージョンの有効期限が切れにする」にチェックを入れていると、こちらの設定が有効にすることができないからです。
ただ、削除マーカー自体のサイズは0バイトで容量を取らないため、残っててもいいよという方は特にこの設定を入れなくても問題ありません。



5.試してみた

実際に適当なオブジェクトをこのバケットに配置して、オブジェクトが削除され、削除マーカーも削除されるまでを見ていきましょう。

5-1.オブジェクトのアップロード、設定(オブジェクトロック、現行バージョンの有効期限)の適用期間の確認


「2024/06/17 12:55:30 PM JST」にアップロードしました。
オブジェクトロックの保持期間とライフサイクルルールが適用される時間を確認しましょう。

オブジェクトロックの保持期間
ライフサイクルルールにより現行バージョンではなくなる時間(削除マーカー付与)

・オブジェクトロックの保持期間:2024/06/18 12:55:29 PM JSTまで有効
・ライフサイクルルールにより現行バージョンではなくなる時間:2024/06/19 09:00:00 AM JST
 ※ライフサイクルルールは世界標準時間「00:00:00 UST」に適用されます(09:00:00 AM JST)。1日でルールを設定している場合は2日目の午前9時にルールが適用されることになります。
上記時間にオブジェクトロックが解除、削除マーカーの付与が行われて、対象のオブジェクトは非現行バージョンでいつでも削除できる状態になる予定です。(多少のラグが発生する場合もあるみたいです)

5-2.設定期間経過後

「2024/06/19 09:00:00 AM JST」にオブジェクトの状態を確認したところ以下のように、まだ現行バージョンとして残っていました。

この日は17時ごろにも確認したのですが、まだ残っていました。。。

翌日確認したところ、以下のように現行バージョンとしては消えていました。(ルール適用までだいぶラグがあるようですね)

「バージョンの表示」を選択して、オブジェクトのバージョン履歴を確認してみたところ以下のようになっていました。

  • 削除マーカーが現行バージョンになっている
  • もともとのオブジェクトは削除マーカーが付与されて非現行バージョンになっている

以下のドキュメントにもあるように削除キューに追加して非同期的に削除のアクションを行うようなので、時間ちょうどに消えないのは致し方ないことみたいですね。
オブジェクトの有効期限 - Amazon Simple Storage Service

非現行バージョンの完全削除は1日で設定したので、さらに翌日確認してみます。

5-3.非現行バージョンの完全削除期間経過後

確認してみると、まだライフサイクルルールが動いておらずオブジェクトが残っていました。
後日再度確認すると、以下のように削除マーカーだけが残りオブジェクトは完全に削除されていました。

この削除マーカーだけ残った状態を「有効期限切れのオブジェクト削除マーカー」と呼びます。

5-4.有効期限切れのオブジェクト削除マーカーの削除

数日経過後、確認してみると削除マーカーも完全に消えており、バケットが空の状態になっていました。


6.まとめ

設定したライフサイクルルールでS3バケット内のオブジェクトを完全に削除することができました。
ただ、ライフサイクルルールの適用には時間がかかり、想定していた時間よりも遅く削除が完了することになってしまいました。
実際にS3でオブジェクトロックとライフサイクルルールを使用するときは、このあたりを考慮する必要がありそうです。

この記事を書いた人


ニックネーム:sr2525
好きなもの:猫、KPOPなど
一言:写真は今年大洗で撮った初日の出です🌅