kenju's blog

About Programming, Mathematics, Security and Blockchain

Versioningが有効なS3 Bucketsにライフサイクルポリシーを設定する

ObjectsのLifecycle設定について

S3に配備したObjectsに対して、

  • 一定期間経過したら、AWS Glacierなどの別サービスに移行する
  • 一定期間経過したら、S3 Bucketsから削除する

という設定をすることができます。これは、「Lifecycle設定」と呼ばれています。

docs.aws.amazon.com

バージョニングが有効な場合の削除フロー

S3 Bucketsのバージョニング機能が無効になっている場合、シンプルにExpirationに設定した日付が経過したら、Objectsは削除されます。

一方、S3 Bucketsのバージョニング機能が有効になっている場合、「一旦現行バージョンには"削除マーカ"という空のObjectが挿入され、旧バージョンに移行し、さらに設定した一定期間が経過したらS3から完全に削除される」というフローを踏みます。

docs.aws.amazon.com

なお、この時、「現行バージョンからExpireする期間」と「旧バージョンからExpireする期間」は別々に設定できます:

  • expiration.dayに設定された期間が過ぎると、現行バージョンのObjectは旧バージョンに移行し、現行バージョンに「削除マーカー」が格納されます
  • noncurrent_version_expiration. noncurrent_daysに設定された期間が過ぎると、旧バージョンのObjectが完全に削除されます

設定方法

  • S3 ConsoleからGUIで設定
  • SDKを利用しコードベースでPUTリクエストを送る

SDK経由でも設定できるので、Infrastructure as Codeとしてライフサイクルを管理できます。

以下の設定だと、↓のような挙動になります:

  • 3日経つと、現行バージョンに「削除フラグ」が挿入され、現行バージョンだったものは旧バージョンに移行する
  • 1日経つと、旧バージョンのObjectsは削除される
  • すなわち、トータルで「3 + 1 = 4(日)」経つと、完全にS3からObjectsが削除される
    lifecycle = Aws::S3::BucketLifecycle.new(...)

    config = {
      lifecycle_configuration: {
        rules: [
          {
            id: 'Expiration Rule for "prefix/"',
            prefix: 'prefix/',
            status: 'Enabled',
            # 現行バージョン向けのExpirationアクションの設定
            expiration: {
              days: 3, # オブジェクトが作成されてから、Amazon S3から削除されるまでの日数
            },
            # 旧バージョン向けのExpirationアクションの設定
            noncurrent_version_expiration: {
              noncurrent_days: 1, # オブジェクトの旧バージョンが期限切れになるまでの時間(日単位)
            },
          },
        ],
      },
    }
    lifecycle.put(config)

他にも設定可能な項目については、以下を参考にしてください。

docs.aws.amazon.com