特定日付を指定してS3ライフサイクルルールでオブジェクト削除ルールを組んでみた

特定日付を指定してS3ライフサイクルルールでオブジェクト削除ルールを組んでみた

2025.11.03

はじめに

みなさんこんにちは、クラウド事業本部コンサルティング部の浅野です。
S3のライフサイクルルールで特定日付を指定してアクションを実行できることをご存知でしょうか?
AWSコンソールからは設定できませんが、AWS CLI or API経由なら可能です。

参考:
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/intro-lifecycle-rules.html#intro-lifecycle-rules-number-of-days:~:text=されます。-,ライフサイクル,-ルール%3A 特定の

ただし、特定日付を指定したライフサイクルルールは、指定日付に一度だけ実行されるのではなく、ルールが『Enabled』である限り、その日付以降も定期的にアクションが実行され続けます。

つまりルールを削除しないと継続的に定義したアクションが動作し続けます。

その辺りの挙動も含めて、今回はバージョニングを有効にしたS3バケットに対して特定日付を指定してオブジェクトを削除するようにライフサイクルルールを設定して挙動を確認してみます。

今回は「バージョニングを有効にしたバケット内のオブジェクト削除」の観点のみで検証します。ストレージクラスを移行するルールに関しては検証していません。

やってみた

S3バケットの現状確認

今回は検証用のバケットを用いて「日付指定のライフサイクルルール」の挙動を確認してみます。
ご覧の通り、現状バケット内には多数のファイルが保存されています。

2025-11-03-s3-lifecycle-delete-by-specific-date-01

またこのバケットにはライフサイクルルールの動作を確認するため、あらかじめ「サーバーアクセスログ」を有効化しています。

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

早速、特定日付を指定したライフサイクルルールを上記のバケットに設定してみます。
今回は以下のようにライフサイクルルールを2種類用意しました。

① 「2025年10月30日」に現行バージョンに削除マーカーを付与し、非現行バージョンの保持数を「1日」に設定するルール

② 有効期限が切れた削除マーカーを削除するルール

「日付指定のアクション」と「有効期限が切れた削除マーカーを削除するルール」は同じルール内で定義できません。

よって、このようにバージョニングを有効にしたS3バケット内のオブジェクトを完全に削除したい場合には最低2種類のルールを用意する必要があります。

①で現行バージョンに「削除マーカー」を付与し、その1日後に削除マーカー以外の非現行バージョンを削除します。ただし、①だけだと現行バージョンの「削除マーカー」が残ってしまうので、②のルールによって「有効期限が切れた削除マーカー」を削除しています。

ここで重要なのが「有効期限が切れた削除マーカー」とは何かということです。

以下の公式ドキュメントに定義が記載されています。

https://docs.aws.amazon.com/AmazonS3/latest/userguide/lifecycle-expire-general-considerations.html

すべてのオブジェクトバージョンが削除され、削除マーカーが 1 つだけ残っている状態を「期限切れオブジェクト削除マーカー」とも呼びます

つまり「有効期限が切れた削除マーカー」とは1つのオブジェクトに対して削除マーカーのバージョンしか残っていない状態のことを指します。それを②のルールによって削除しています。

今回は「AWS CLI v2」の「put-bucket-lifecycle-configuration」コマンドを用いてライフサイクルルールを設定してみます。

CLI経由だとJSONファイルとしてルールを定義する必要があります。

lifecycle-delete-2025-1030.json
{
  "Rules": [
    { // ①のルール設定
      "ID": "Delete current versions on 2025-10-30",
      "Status": "Enabled",
      "Filter": {
        "Prefix": ""
      },
      "Expiration": {
        "Date": "2025-10-30T00:00:00.000Z" // 日付指定
      },
      "NoncurrentVersionExpiration": {
        "NoncurrentDays": 1
      }
    },
    { // ②のルール設定
      "ID": "Remove expired delete markers",
      "Status": "Enabled",
      "Filter": {
        "Prefix": ""
      },
      "Expiration": {
        "ExpiredObjectDeleteMarker": true
      }
    }
  ]
}

作成したJSONファイルを参照して「put-bucket-lifecycle-configuration」コマンドを実行します。

aws s3api put-bucket-lifecycle-configuration \
    --bucket {バケット名} \
    --lifecycle-configuration file://lifecycle-delete-2025-1030.json

# 実行結果
{ 
    "TransitionDefaultMinimumObjectSize": "all_storage_classes_128K"
}

コンソール画面からも確認してみましょう。

ライフサイクルルールが2種類設定されています。
2025-11-03-s3-lifecycle-delete-by-specific-date-02

①のルールの中身です。コンソール上でも「2025-10-30 午前9:00(JST)」に日付指定されていることが確認できます。
2025-11-03-s3-lifecycle-delete-by-specific-date-03

②のルールの中身です。
2025-11-03-s3-lifecycle-delete-by-specific-date-04

「削除マーカー付与」までの動作確認

ライフサイクルルールを設定してから数日待ちました。

サーバーアクセスログを設定したバケットに対してAthenaでテーブル「life_cycle_server_access_log_test_tokutei_nitiji」を作成して動作を確認してみました。

サーバーアクセスログのAthenaテーブルを作成する方法については割愛します。

リクエスト日付が「10月30日」かつ「S3によってアクセスされた」ログをフィルタリングしてクエリしてみます。

SELECT *
FROM "life_cycle_server_access_log_test_tokutei_nitiji"
WHERE operation LIKE 'S3.%'
  AND requestdatetime LIKE '30/Oct/%';

結果は以下のようになりました。

# bucketowner bucket_name requestdatetime remoteip requester requestid operation key request_uri httpstatus errorcode bytessent objectsize totaltime turnaroundtime referrer useragent versionid hostid sigv ciphersuite authtype endpoint tlsversion
1 *** *** 30/Oct/2025:15:25:53 +0000 - AmazonS3 *** S3.CREATE.DELETEMARKER 7e153307-b734-40c7-8ba1-7a4fe4cf099d%3A11_1_11.txt "-" - - - - - "-" "-" - vVh6UFLqaZRk0tOY_HHl9h80u12fyoPs **** - - - - -
2 *** *** 30/Oct/2025:15:25:53 +0000 - AmazonS3 *** S3.CREATE.DELETEMARKER 7e153307-b734-40c7-8ba1-7a4fe4cf099d%3A1_1_1.txt "-" - - - - - "-" "-" - vVh6UFLqaZRk0tOY_HHl9h80u12fyoPs **** - - - - -
3 *** *** 30/Oct/2025:15:25:53 +0000 - AmazonS3 *** S3.CREATE.DELETEMARKER 7e153307-b734-40c7-8ba1-7a4fe4cf099d%3A0_1_0.txt "-" - - - - - "-" "-" - vVh6UFLqaZRk0tOY_HHl9h80u12fyoPs **** - - - - -
4 *** *** 30/Oct/2025:15:25:53 +0000 - AmazonS3 *** S3.CREATE.DELETEMARKER 7e153307-b734-40c7-8ba1-7a4fe4cf099d%3A3_1_3.txt "-" - - - - - "-" "-" - vVh6UFLqaZRk0tOY_HHl9h80u12fyoPs **** - - - - -
5 *** *** 30/Oct/2025:15:25:53 +0000 - AmazonS3 *** S3.CREATE.DELETEMARKER 7e153307-b734-40c7-8ba1-7a4fe4cf099d%3A2_1_2.txt "-" - - - - - "-" "-" - vVh6UFLqaZRk0tOY_HHl9h80u12fyoPs **** - - - - -
6 *** *** 30/Oct/2025:15:25:53 +0000 - AmazonS3 *** S3.CREATE.DELETEMARKER 7e153307-b734-40c7-8ba1-7a4fe4cf099d%3A10_1_10.txt "-" - - - - - "-" "-" - vVh6UFLqaZRk0tOY_HHl9h80u12fyoPs **** - - - - -
7 *** *** 30/Oct/2025:15:25:54 +0000 - AmazonS3 *** S3.CREATE.DELETEMARKER 7e153307-b734-40c7-8ba1-7a4fe4cf099d%3A4_1_4.txt "-" - - - - - "-" "-" - vVh6UFLqaZRk0tOY_HHl9h80u12fyoPs **** - - - - -
8 *** *** 30/Oct/2025:15:25:54 +0000 - AmazonS3 *** S3.CREATE.DELETEMARKER 7e153307-b734-40c7-8ba1-7a4fe4cf099d%3A5_1_5.txt "-" - - - - - "-" "-" - vVh6UFLqaZRk0tOY_HHl9h80u12fyoPs **** - - - - -
9 *** *** 30/Oct/2025:15:25:54 +0000 - AmazonS3 *** S3.CREATE.DELETEMARKER 7e153307-b734-40c7-8ba1-7a4fe4cf099d%3A8_1_8.txt "-" - - - - - "-" "-" - vVh6UFLqaZRk0tOY_HHl9h80u12fyoPs **** - - - - -
10 *** *** 30/Oct/2025:15:25:54 +0000 - AmazonS3 *** S3.CREATE.DELETEMARKER delete.png "-" - - - - - "-" "-" - vVh6UFLqaZRk0tOY_HHl9h80u12fyoPs **** - - - - -
11 *** *** 30/Oct/2025:15:25:54 +0000 - AmazonS3 *** S3.CREATE.DELETEMARKER mktests.sh "-" - - - - - "-" "-" - vVh6UFLqaZRk0tOY_HHl9h80u12fyoPs **** - - - - -
12 *** *** 30/Oct/2025:15:25:54 +0000 - AmazonS3 *** S3.CREATE.DELETEMARKER 7e153307-b734-40c7-8ba1-7a4fe4cf099d%3A6_1_6.txt "-" - - - - - "-" "-" - vVh6UFLqaZRk0tOY_HHl9h80u12fyoPs **** - - - - -
13 *** *** 30/Oct/2025:15:25:54 +0000 - AmazonS3 *** S3.CREATE.DELETEMARKER 7e153307-b734-40c7-8ba1-7a4fe4cf099d%3A7_1_7.txt "-" - - - - - "-" "-" - vVh6UFLqaZRk0tOY_HHl9h80u12fyoPs **** - - - - -
14 *** *** 30/Oct/2025:15:25:54 +0000 - AmazonS3 *** S3.CREATE.DELETEMARKER stress-tests.txt "-" - - - - - "-" "-" - vVh6UFLqaZRk0tOY_HHl9h80u12fyoPs **** - - - - -
15 *** *** 30/Oct/2025:15:25:54 +0000 - AmazonS3 *** S3.CREATE.DELETEMARKER delete2.png "-" - - - - - "-" "-" - vVh6UFLqaZRk0tOY_HHl9h80u12fyoPs **** - - - - -
16 *** *** 30/Oct/2025:15:25:54 +0000 - AmazonS3 *** S3.CREATE.DELETEMARKER 7e153307-b734-40c7-8ba1-7a4fe4cf099d%3A9_1_9.txt "-" - - - - - "-" "-" - vVh6UFLqaZRk0tOY_HHl9h80u12fyoPs **** - - - - -

「requestdatetime」と「operation」に注目して確認してみましょう。

特定のKeyについて抜粋してみると、「30/Oct/2025:15:25:53 +0000」つまり、日本時間で「2025年10月31日午前0時25分53秒」に「S3.CREATE.DELETEMARKER」が実行されており、ライフサイクルルールによって指定した「2025年10月30日 午前9時」ちょうどにアクションが実行されていないことがわかります。

これはライフサイクルルールの仕様として、指定した時刻にアクション実行対象のキューに入れられ、実際にアクションが動作する時刻は裏側でAWSによって調整され非同期で処理されるためです。

このように「10月30日午前9時」と日付指定してライフサイクルルールを設定しても、実際に削除マーカーが付与される時刻は後ろにずれることが確認できました。

また、この時点で新たなオブジェクトで「delete3.png」をアップロードしてみます。

2025-11-03-s3-lifecycle-delete-by-specific-date-05

「delete3.png」以外のオブジェクトは全て現行バージョンが「削除マーカー」になっているためバケット内の表示は以下のようになりました。

2025-11-03-s3-lifecycle-delete-by-specific-date-06

「削除マーカー」が削除されて完全に削除されるまでの動作確認

上記の確認により現行オブジェクトが削除マーカーになっていることが確認できました。ここからさらに数日待ち、オブジェクトが全バージョンを含めて完全削除される箇所まで確認してみましょう。

数日後、Athenaを使用して「10月30日」より後に「S3」によって処理されたアクセスログを時系列でまとめてみました。

結果: 「requestdatetime」の表記の都合上、行番号が上下しています。

# bucketowner bucket_name requestdatetime remoteip requester requestid operation key request_uri httpstatus errorcode bytessent objectsize totaltime turnaroundtime referrer useragent versionid hostid sigv ciphersuite authtype endpoint tlsversion
33 *** *** 31/Oct/2025:12:28:53 +0000 - AmazonS3 *** S3.EXPIRE.OBJECT delete2.png "-" - - - 20588 - - "-" - _6DcmqCA3neqtg0zNmFzh0mhYsbqN_Qy **** - - - - -
34 *** *** 01/Nov/2025:09:47:11 +0000 - AmazonS3 *** S3.EXPIRE.OBJECT 7e153307-b734-40c7-8ba1-7a4fe4cf099d%3A10_1_10.txt "-" - - - 534 - - "-" - null **** - - - - -
35 *** *** 01/Nov/2025:09:47:11 +0000 - AmazonS3 *** S3.EXPIRE.OBJECT 7e153307-b734-40c7-8ba1-7a4fe4cf099d%3A7_1_7.txt "-" - - - 534 - - "-" - null **** - - - - -
36 *** *** 01/Nov/2025:09:47:11 +0000 - AmazonS3 *** S3.EXPIRE.OBJECT delete.png "-" - - - 18493 - - "-" - pqfz6Xcv8EKKM3kUaPFdPOdZaxdEYVRR **** - - - - -
37 *** *** 01/Nov/2025:09:47:11 +0000 - AmazonS3 *** S3.EXPIRE.OBJECT 7e153307-b734-40c7-8ba1-7a4fe4cf099d%3A11_1_11.txt "-" - - - 534 - - "-" - null **** - - - - -
38 *** *** 01/Nov/2025:09:47:11 +0000 - AmazonS3 *** S3.EXPIRE.OBJECT 7e153307-b734-40c7-8ba1-7a4fe4cf099d%3A5_1_5.txt "-" - - - 534 - - "-" - null **** - - - - -
39 *** *** 01/Nov/2025:09:47:11 +0000 - AmazonS3 *** S3.EXPIRE.OBJECT 7e153307-b734-40c7-8ba1-7a4fe4cf099d%3A9_1_9.txt "-" - - - 534 - - "-" - null **** - - - - -
40 *** *** 01/Nov/2025:09:47:11 +0000 - AmazonS3 *** S3.EXPIRE.OBJECT 7e153307-b734-40c7-8ba1-7a4fe4cf099d%3A3_1_3.txt "-" - - - 534 - - "-" - null **** - - - - -
41 *** *** 01/Nov/2025:09:47:11 +0000 - AmazonS3 *** S3.EXPIRE.OBJECT 7e153307-b734-40c7-8ba1-7a4fe4cf099d%3A6_1_6.txt "-" - - - 534 - - "-" - null **** - - - - -
42 *** *** 01/Nov/2025:09:47:11 +0000 - AmazonS3 *** S3.EXPIRE.OBJECT 7e153307-b734-40c7-8ba1-7a4fe4cf099d%3A0_1_0.txt "-" - - - 534 - - "-" - null **** - - - - -
43 *** *** 01/Nov/2025:09:47:11 +0000 - AmazonS3 *** S3.EXPIRE.OBJECT 7e153307-b734-40c7-8ba1-7a4fe4cf099d%3A8_1_8.txt "-" - - - 534 - - "-" - null **** - - - - -
44 *** *** 01/Nov/2025:09:47:11 +0000 - AmazonS3 *** S3.EXPIRE.OBJECT 7e153307-b734-40c7-8ba1-7a4fe4cf099d%3A4_1_4.txt "-" - - - 534 - - "-" - null **** - - - - -
45 *** *** 01/Nov/2025:09:47:11 +0000 - AmazonS3 *** S3.EXPIRE.OBJECT 7e153307-b734-40c7-8ba1-7a4fe4cf099d%3A1_1_1.txt "-" - - - 534 - - "-" - null **** - - - - -
46 *** *** 01/Nov/2025:09:47:11 +0000 - AmazonS3 *** S3.EXPIRE.OBJECT 7e153307-b734-40c7-8ba1-7a4fe4cf099d%3A2_1_2.txt "-" - - - 534 - - "-" - null **** - - - - -
47 *** *** 01/Nov/2025:09:47:12 +0000 - AmazonS3 *** S3.EXPIRE.OBJECT mktests.sh "-" - - - 249 - - "-" - null **** - - - - -
48 *** *** 01/Nov/2025:09:47:12 +0000 - AmazonS3 *** S3.EXPIRE.OBJECT delete2.png "-" - - - 20588 - - "-" - bwTwaXPqUjTEiS_ghqyF3WCo32vJnCrd **** - - - - -
49 *** *** 01/Nov/2025:09:47:12 +0000 - AmazonS3 *** S3.EXPIRE.OBJECT stress-tests.txt "-" - - - 3707 - - "-" - null **** - - - - -
50 *** *** 01/Nov/2025:09:49:45 +0000 - AmazonS3 *** S3.CREATE.DELETEMARKER delete3.png "-" - - - - - - "-" - yHZKnye1uRNRq4WHnqbZccuJvBV0tLtd **** - - - - -
17 *** *** 02/Nov/2025:10:02:18 +0000 - AmazonS3 *** S3.EXPIRE.OBJECT 7e153307-b734-40c7-8ba1-7a4fe4cf099d%3A9_1_9.txt "-" - - - 0 - - "-" - vVh6UFLqaZRk0tOY_HHl9h80u12fyoPs **** - - - - -
18 *** *** 02/Nov/2025:10:02:18 +0000 - AmazonS3 *** S3.EXPIRE.OBJECT delete2.png "-" - - - 0 - - "-" - vVh6UFLqaZRk0tOY_HHl9h80u12fyoPs **** - - - - -
19 *** *** 02/Nov/2025:10:02:18 +0000 - AmazonS3 *** S3.EXPIRE.OBJECT 7e153307-b734-40c7-8ba1-7a4fe4cf099d%3A6_1_6.txt "-" - - - 0 - - "-" - vVh6UFLqaZRk0tOY_HHl9h80u12fyoPs **** - - - - -
20 *** *** 02/Nov/2025:10:02:18 +0000 - AmazonS3 *** S3.EXPIRE.OBJECT 7e153307-b734-40c7-8ba1-7a4fe4cf099d%3A8_1_8.txt "-" - - - 0 - - "-" - vVh6UFLqaZRk0tOY_HHl9h80u12fyoPs **** - - - - -
21 *** *** 02/Nov/2025:10:02:18 +0000 - AmazonS3 *** S3.EXPIRE.OBJECT stress-tests.txt "-" - - - 0 - - "-" - vVh6UFLqaZRk0tOY_HHl9h80u12fyoPs **** - - - - -
22 *** *** 02/Nov/2025:10:02:18 +0000 - AmazonS3 *** S3.EXPIRE.OBJECT 7e153307-b734-40c7-8ba1-7a4fe4cf099d%3A4_1_4.txt "-" - - - 0 - - "-" - vVh6UFLqaZRk0tOY_HHl9h80u12fyoPs **** - - - - -
23 *** *** 02/Nov/2025:10:02:18 +0000 - AmazonS3 *** S3.EXPIRE.OBJECT 7e153307-b734-40c7-8ba1-7a4fe4cf099d%3A10_1_10.txt "-" - - - 0 - - "-" - vVh6UFLqaZRk0tOY_HHl9h80u12fyoPs **** - - - - -
24 *** *** 02/Nov/2025:10:02:18 +0000 - AmazonS3 *** S3.EXPIRE.OBJECT 7e153307-b734-40c7-8ba1-7a4fe4cf099d%3A2_1_2.txt "-" - - - 0 - - "-" - vVh6UFLqaZRk0tOY_HHl9h80u12fyoPs **** - - - - -
25 *** *** 02/Nov/2025:10:02:18 +0000 - AmazonS3 *** S3.EXPIRE.OBJECT 7e153307-b734-40c7-8ba1-7a4fe4cf099d%3A7_1_7.txt "-" - - - 0 - - "-" - vVh6UFLqaZRk0tOY_HHl9h80u12fyoPs **** - - - - -
26 *** *** 02/Nov/2025:10:02:18 +0000 - AmazonS3 *** S3.EXPIRE.OBJECT 7e153307-b734-40c7-8ba1-7a4fe4cf099d%3A11_1_11.txt "-" - - - 0 - - "-" - vVh6UFLqaZRk0tOY_HHl9h80u12fyoPs **** - - - - -
27 *** *** 02/Nov/2025:10:02:18 +0000 - AmazonS3 *** S3.EXPIRE.OBJECT 7e153307-b734-40c7-8ba1-7a4fe4cf099d%3A1_1_1.txt "-" - - - 0 - - "-" - vVh6UFLqaZRk0tOY_HHl9h80u12fyoPs **** - - - - -
28 *** *** 02/Nov/2025:10:02:18 +0000 - AmazonS3 *** S3.EXPIRE.OBJECT delete.png "-" - - - 0 - - "-" - vVh6UFLqaZRk0tOY_HHl9h80u12fyoPs **** - - - - -
29 *** *** 02/Nov/2025:10:02:18 +0000 - AmazonS3 *** S3.EXPIRE.OBJECT 7e153307-b734-40c7-8ba1-7a4fe4cf099d%3A3_1_3.txt "-" - - - 0 - - "-" - vVh6UFLqaZRk0tOY_HHl9h80u12fyoPs **** - - - - -
30 *** *** 02/Nov/2025:10:02:18 +0000 - AmazonS3 *** S3.EXPIRE.OBJECT 7e153307-b734-40c7-8ba1-7a4fe4cf099d%3A5_1_5.txt "-" - - - 0 - - "-" - vVh6UFLqaZRk0tOY_HHl9h80u12fyoPs **** - - - - -
31 *** *** 02/Nov/2025:10:02:18 +0000 - AmazonS3 *** S3.EXPIRE.OBJECT 7e153307-b734-40c7-8ba1-7a4fe4cf099d%3A0_1_0.txt "-" - - - 0 - - "-" - vVh6UFLqaZRk0tOY_HHl9h80u12fyoPs **** - - - - -
32 *** *** 02/Nov/2025:10:02:18 +0000 - AmazonS3 *** S3.EXPIRE.OBJECT mktests.sh "-" - - - 0 - - "-" - vVh6UFLqaZRk0tOY_HHl9h80u12fyoPs **** - - - - -

実際に「削除マーカー」が付与されてから「01/Nov/2025:09:47:12 +0000」などに「S3.EXPIRE.OBJECT」アクションが実行されていることがわかります。

この「S3.EXPIRE.OBJECT」には2種類の意味があります。
例えば「#33」行と「#48」行の「delete2.png」に対しては「S3.EXPIRE.OBJECT」によってルール①で設定した「非現行バージョンが1日たって削除される」という処理が行われました。

その後、「#18」行目にてルール②で設定した「有効期限切れの削除マーカーを削除する」という処理が行われました。

ややこしいですが「objectsize」列にバイトがある場合は、ルール①の「非現行バージョンの削除」が行われており、「objectsize」が「0バイト」の場合は「現行バージョンの削除マーカーが削除された」というように判断することが可能です。意外と重要な指標なので意識して確認しましょう。

さらに「#50」行目に注目してください。「2025年10月30日午前9時」以降にバケット内に追加した「delete3.png」に対しても「01/Nov/2025:09:49:45 +0000」= 「2025年11月1日午後18時49分45秒(JST)」に「S3.CREATE_DELETEMARKER」が行われておりバケット内は以下の状態になっていました。

2025-11-03-s3-lifecycle-delete-by-specific-date-07

つまり、冒頭で記載した様に、特定日付ベースのアクションは、1回限りのアクションではなく、ステータスが「Enabled」になっている限りその日付を越えても毎日ルール内のアクションが実行されるという動作が確認できました。

この数日後、ルール②によって「delete3.png」含め、バケット内の全オブジェクトの全バージョンが完全に削除されたことも確認できました。

今回の場合だと新しく保存したオブジェクトもずっと削除され続けるので、動作させたくない場合はライフサイクルルールを無効化しましょう。

仕様のまとめ

これまでの動作確認から、ライフサイクルルールの挙動が見えました。もともとバケット内に存在していた「delete2.png」を例に実際のライフサイクルを時系列でまとめてみます。

「delete2.pngのライフサイクル(時系列)

  • 2025/10/29 13:00 JST頃
    ライフサイクルルール設定

    • ルール1: 2025/10/30午前9時(JST)に現行バージョン削除、非現行バージョンは1日後に削除
    • ルール2: 期限切れ削除マーカーを自動削除
  • 2025/10/30 09:00 JST頃

    • ルール1がキューに入る(Date: 2025-10-30T00:00:00.000Z)
  • 2025/10/31 00:25 JST

    • ルール①アクション実行: 現行バージョンに削除マーカー作成(S3.CREATE.DELETEMARKER
    • delete2.pngの現行バージョンは非現行バージョンに移行
    • 時刻はAWS側によって非同期で行われるため調整・予測不可能
    • この時点で少なくとも2つの非現行バージョンが存在
  • 2025/10/31 21:28 JST

    • ルール①アクション実行: 非現行バージョン1を削除(S3.EXPIRE.OBJECT, 20588バイト)
    • versionid: _6DcmqCA3neqtg0zNmFzh0mhYsbqN_Qy
  • 2025/11/1 18:47 JST

    • ルール①アクション実行: 非現行バージョン2を削除(S3.EXPIRE.OBJECT, 20588バイト)
    • versionid: bwTwaXPqUjTEiS_ghqyF3WCo32vJnCrd
    • すべての非現行バージョンが削除され、削除マーカーのみが残る
  • 2025/11/2 19:02 JST

    • ルール②アクション実行: 期限切れ削除マーカー削除(S3.EXPIRE.OBJECT, objectsize=0)
    • delete2.pngが完全に消滅

このように、結論として特定日付を指定したライフサイクルルールを用いて バージョニングが有効なバケットに対して 全てのバージョン含め「1日」でオブジェクトを完全に削除することはできません。

ただし、確認したように日付にバッファを設けて、数日から場合によっては数週間後ろにズレることが許容できるなら、いずれオブジェクトは段階的に削除され、完全に削除することが可能です。

おまけ

最後に、おまけとして「特定日付を指定した場合」と「オブジェクトを追加/更新してから⚪︎日後」と指定した場合の以下2パターンのルールの挙動についてどのような違いがあるか図解しました。

  • ①オブジェクトを追加/更新してから「1日」後に削除するルールの場合
  • ②特定日付を指定して削除するルールの場合

図内の日づけはサンプルです。
2025-11-03-s3-lifecycle-delete-by-specific-date-08

これらライフサイクルルールのポイントは以下です。

  • 特定日付を指定した場合は「⚪︎日後」という日時切り上げを考慮したややこしい制約を考えなくても済むこと
  • 日本時間午前9時(UTC 0:00:00)に必ずアクションが実行されるわけではなく、あくまでAWS側の非同期処理の時刻によるのでいつ実行されるかは予測不可能であること
  • 上記の理由からいずれのルールも「指定した日付」や「⚪︎日後」に必ずアクションが実行されてバケット内が理想の状態になる保証はないこと。なのでかなりバッファを持たせて日付を考えたほうが良いです。
  • 特定日付を指定した場合は「ライフサイクルルールを削除するまで」日付を過ぎてもアクションがループし続けること

参考:

最後に

今回は特定日付を指定したライフサイクルルールを設定し、バージョニングを有効にしたバケット内のオブジェクトがどのように削除されていくのかを詳細に確認しました。

仕様を調べた上で実機の動作確認を行うことによって、S3ライフサイクルルールの詳細な挙動が理解できました。

本記事がどなたかの参考になれば幸いです。今回は以上です。

この記事をシェアする

FacebookHatena blogX

関連記事