kenjuの日記

About Programming, Mathematics and Security

S3 Lifecycle Ruleに設定したExpiration/Transitionの期間はいつから有効になるか

tl;dr

  • Expiration/Transitionに設定した日付は、翌日の午前 00:00(UTC)に丸め込まれた上で加算計算される
  • つまり、経過日数で設定した場合、常に 00:00(UTC)で移行・削除アクションが実行される
  • より詳細な時刻でObjectのExpiration/Transitionのタイミングを調整したい場合、特定の日付を指定する

経過日数を設定した場合

昨日の記事「Versioningが有効なS3 Bucketsにライフサイクルポリシーを設定する - It is KJ」にて、S3にExpirationを設定できることを書きました。例えば、「Objectの有効期限を3日としたい」時、↓のように設定できました。

    lifecycle = Aws::S3::BucketLifecycle.new(...)
    lifecycle.put({
      lifecycle_configuration: {
        # オブジェクトが作成されてから、Amazon S3から削除されるまでの日数
        rules: [ { expiration: { days: 3 }, }, ],
      },
    })

しかし、「3日後」とは、厳密にはいつからいつまでを3日とカウントするのでしょうか。

答えは、↓に書いてありました。

docs.aws.amazon.com

ポイントとしては、

  • 「いつから」:「オブジェクト作成の日にち」から
  • 「いつまで」:オブジェクト作成日を翌日の午前 00:00(UTC)に丸めこみした上で、設定した日数が経過したタイミング

ドキュメントに書いてある通り、具体的には以下の流れで日数を計算します:

  • 最新バージョンが 2014 年 1 月 1 日午前 10 時 30 分(UTC)に作成
  • 2014 年 1 月 15 日午前 10 時 30 分(UTC)にそのバージョンに代わる次の新しいバージョンが作成された場合、
  • 移行ルールに 3 日を指定していると、
  • オブジェクトの移行日は 2014 年 1 月 19 日 0 時 0 分(UTC)
    • つまり、1月15日を1月16日午前00:00に丸め込んだ上で、+3日=1月19日午前00:00分がアクション実行のタイミング

つまり、必ず 00:00(UTC)のタイミングでアクションが実行されます。

特定の日付を設定する場合

試していませんが、「経過日数」ではなく「特定の日付」でも設定できるようです。したがって、00:00(UTC)ではなく、より細かい時間でTransition/Expirationさせたいという要件も実現可能です。

ライフサイクルルールでアクションを指定するときは、S3 がアクションを実行する日付を指定できます。特定の日付になると、S3 は (フィルタ条件に基づいて) すべての対象オブジェクトにアクションに適用します。

この場合、コンソールからは設定できないようなので、SDKなりcurlなどのツールを用いてAPIリクエストを投げる必要がありそうです。

Amazon S3 コンソールでは日付ベースのライフサイクルルールを作成することはできませんが、そのようなルールの表示、無効化、削除は可能です。