👋

【S3】ライフサイクルルール 削除マーカーをご存知?

2024/12/27に公開

こんにちは。SREホールディングス株式会社でエンジニアをしております、クマカワです。

この記事では、Amazon S3のライフサイクルルールに関する情報をまとめたいと思います。
過去、バージョニング有効のS3バケットに大量のオブジェクトを置いていました。コスト削減目的でライフサイクルルールを導入することに。サクッと設定・確認できるかなと思っていたら、「削除マーカー」なるものが現れたり、削除されるはずがされなかったり、困惑した経験から得た知識を共有します。

対象読者

  • バージョニング有効のS3バケットにおいてライフサイクルルール適用したい方、苦戦している方
  • 期限切れ削除マーカー削除のルールを設定しているのに消えずに困っている方

この記事で取り扱わないこと

  • リソースの作成方法
  • ライフサイクルルールのストレージクラス移行
  • バージョニングが無効のバケットのライフサイクルルールの挙動
  • 最新バージョン削除〜削除マーカー削除までに必要な設定

ライフサイクルルールとは?

オブジェクトを低コストのストレージクラスに移行するか、ユーザーに代わって期限切れのオブジェクトを削除することで、ライフサイクル全体でコスト効率の高い方法でオブジェクトを保存するのに役立ちます。
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/object-lifecycle-mgmt.html

Amazon S3では、アップロードしたオブジェクトに対し、○日経ったら消す or 別のストレージクラスのS3に移行する、といったことができます。
本記事では削除にフォーカスします。

どのような設定項目があるか

ライフサイクルルールの各項目について、ざっくりご説明します。


ライフサイクルルールの管理画面

項目名 内容 備考
ライフサイクルルール名 ルールの名前 日本語も設定できてしまうが、読めなくなる場面もあるので半角英字推奨
ステータス ルールが有効か無効か このルール削除したくないけど今は使わない、という時に無効化しておくなどの使い方ができる
スコープ バケット全体にルール適用するか、 適用範囲を限定するか プレフィックスを限定する方法についてはプレフィックスを限定したライフサイクルルール参照
最新バージョンのアクション オブジェクトの最新バージョンに対し、削除するかストレージクラス間で移行するか
非現行バージョンのアクション 非最新バージョンに対し、削除するかストレージクラス間で移行するか
期限切れのオブジェクト削除マーカー 期限切れのオブジェクト削除マーカーを削除するか ★この後解説します
未完了のマルチアップロード 未完了のマルチアップロードを削除するか ストレージクラス移行時のアクションなのでこの記事では触れない

詳しくは公式ドキュメントの「S3コンソールの使用」に記載があります

削除マーカーとは

最新バージョンのオブジェクトが削除されるとき、S3が「削除マーカー」を生成します。
例えは、S3にhello.txtが置いてあるとしましょう。
hello.txtを削除すると、hello.txtの最新バージョンが削除マーカー、非最新バージョンがhello.txt本体になるわけです。

▼公式ドキュメント
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/DeleteMarker.html?icmpid=docs_amazons3_console

"期限切れの"オブジェクト削除マーカーとは

非最新バージョンがなく、かつ最新バージョンが削除マーカーである状態のオブジェクトのことを指します。
「バージョンの表示」で見た時に、削除マーカーしか存在しないオブジェクトです。
※バージョンの表示の見方は非最新バージョンの確認方法参照

期限切れの削除マーカーは消そう

ここでお伝えしたいのは、削除マーカーにもお金がかかるということ。
オブジェクトだけを消して満足していたら、非最新バージョンや削除マーカーが大量に残り続けて課金され続けていた!なんてことがあるかもしれません。(微々たる金額かもしれませんが)

削除マーカーにより、Amazon S3 内のストレージに対して最低料金が発生します。
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/DeleteMarker.html?icmpid=docs_amazons3_console

削除マーカーを消すには

本記事では期限切れのオブジェクト削除マーカーのみに着目し、AWSマネジメントコンソール上で期限切れオブジェクト削除マーカーを削除するライフサイクルルールの作り方を説明します。

以下のアコーディオンを開いてご確認ください。
完成後の画面はキャプチャをご参照ください。

マネジメントコンソール上での作成手順

対象のバケットの「管理」タブ > ライフサイクルルールを作成する

ライフサイクルルールの設定

  • ライフサイクルルール名
    • 任意のライフサイクルルール名を入力
    • ※キャプチャでは分かりやすくするため日本語にしています
  • ルールスコープを選択
    • ☑︎バケット全体にルールを適用
      • 適用範囲を限定したい場合はこちら参照

ライフサイクルルールのアクション

  • ☑︎有効期限切れのオブジェクト削除マーカーまたは不完全なマルチパートアップロードを削除

有効期限切れのオブジェクト削除マーカーまたは不完全なマルチパートアップロードを削除

  • ☑︎期限切れのオブジェクト削除マーカー

上記入力後、「保存

ライフサイクルルール適用のタイミング

さて、これで期限切れのオブジェクト削除マーカーへの対処はできました。
少し話がそれますが、ライフサイクルルールはいつ適用されるのでしょうか?

実は、ライフサイクルルールの適用は1日1回です。

S3 ライフサイクルは 1 日に 1 回のみ実行されます。
https://repost.aws/ja/knowledge-center/s3-lifecycle-rule-delay

その1回とは、日本時間の9:00です。

ルールで指定された日数をオブジェクト作成時に加え、翌日の UTC 午前 0 時に対してその結果の時間を四捨五入して時間を算出します。例えば、あるオブジェクトが 2014 年 1 月 15 日 10:30 AM (UTC) に作成され、移行ルールで 3 日と指定した場合、オブジェクトの移行日は 2014 年 1 月 19 日 00:00 (UTC) となります。

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/intro-lifecycle-rules.html#intro-lifecycle-rules-number-of-days

上記公式ドキュメントの場合、期限切れのオブジェクト削除マーカー削除のルールではありませんが、基本的に考え方は同じで日本時間に直した上で図にしてみると以下のようになります。
指定した3日の数え方は、翌日、つまり次の9:00JSTから3日間という計算になるのですね。

公式ドキュメントで記載のある「四捨五入」とは、非常に紛らわしいのですが、1/15 9:01 JSTにアップロードされたオブジェクトが、1/15 9:00JST と 1/16 9:00JSTで比べると 1/15 9:00JST の方が近いからその時点から計算される!というわけではないです。
英語を見てみると、

rounding the resulting time to the next day at midnight UTC.

と記載されています。つまり翌日 1/16 0:00(UTC) = 1/16 9:00(JST) からカウントされるよ!ということです。

ライフサイクルルールの遅延

ライフサイクルルールが適用されるタイミングがわかりました。

以上を踏まえて、
「○日後に非最新バージョンを削除するルールを設定したから
翌日への丸め込みも考慮した上で○日後に確認したら消えているよね!」
という考えは、危険です。
ライフサイクルルールでのオブジェクト削除には遅延が発生します。
削除ルールが適用されると、「削除可能な状態」になるだけで、削除処理が走るわけではないのです。
削除自体は、AWSが内部的に非同期処理しているので、どのタイミングで消されるか事前に知ることは不可能です。

Amazon S3 は数日後または数週間後までこれらのオブジェクトを実際に削除しない場合があります。この遅延は、S3 ライフサイクルがオブジェクトを移行または有効期限のためのキューに非同期的に入れるために発生します
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/how-to-set-lifecycle-configuration-intro.html#lifecycle-considerations

同じことは現行バージョンを有効期限切れにするルール、非最新バージョンを削除するルール、期限切れオブジェクト削除マーカーを削除するルールなどなど、全般的に当てはまります。

ライフサイクルルールで「オブジェクトが削除されているよね」を確認するには、数日~数週間ほど時間を要する(しかも読めない)ということです。

ただし、コストに関してはきっちり計算されていて、遅延して残ってしまった期間は請求されないと読み取れます。

ポイント解説

プレフィックスを限定したライフサイクルルール

特定のプレフィックスのみにライフサイクルルールを適用したい場合の話です。
バケット名/sample-path/hello.txtのようなオブジェクトがあり、ライフサイクルルール適用をバケット名/sample-path配下に限定したいときは、フィルタータイプのプレフィックスにsample-pathと指定します。
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/object-keys.html?icmpid=docs_amazons3_console
※オブジェクトタグの指定方法は割愛
※オブジェクトサイズの指定方法は割愛

ライフサイクルルールが適用されているかの確認方法

S3管理画面上でオブジェクトを開くと、「オブジェクト管理の概要」欄に「有効期限ルール」や「有効期限日」があります。ここでルールが適用されているか確認できます。


▲最新バージョンのオブジェクトにライフサイクルルールは適用されていない

▲最新バージョンのオブジェクトにライフサイクルルール「sample-rule」が適用されている

非最新バージョンの確認方法

マネジメントコンソール上でS3バケットを開くと、最初は最新バージョンしか表示されません。

非最新バージョンを確認するには、「バージョンの表示」をONにします。

または、特定のオブジェクトを開き「バージョン」タブから確認できます。

まとめ

以上、バージョニング有効のS3バケットにおいて、削除マーカーとライフサイクルルール適用に関しての情報でした。
「削除のタイミングはAWSのご機嫌次第」
「削除マーカーも管理しないとコストがかる」
「削除の検証には時間がかかる」
以上のような印象をお持ちいただけましたでしょうか。

最新バージョンから削除マーカーの削除まで一貫して掲載したかったのですが、この度時間が取れず。またの機会に。

本記事が皆様の開発、コスト削減に少しでもお役に立てれば幸いです。
お読みいただきありがとうございました。

SRE Holdings 株式会社

Discussion