SJ blog
backend
A

信頼度ランク

S 公式ソース確認済み
A 成功実績多数・失敗例少数
B 賛否両論
C 動作未確認・セキュリティリスク高
Z 個人所感

S3ライフサイクルルール — 移行・有効期限・バージョン管理の設計パターン

S3ライフサイクルルールの移行(Transition)と有効期限(Expiration)の設定、ストレージクラス間の遷移制約、マルチパートアップロードの不完全部分削除、コスト最適化パターンを解説。

一言結論

ライフサイクルルールの移行は低コスト方向のみ可能で逆方向はできず、AbortIncompleteMultipartUploadを設定しないと中断したアップロードのパートが課金し続けるため、バケット作成時の標準設定として組み込むべき重要な設定だ。

ライフサイクルルールの2つの機能

S3ライフサイクルルールは「自動でストレージクラスを変更する」と「自動でオブジェクトを削除する」の2つの機能を持つ。

Transition(移行):   指定日数後に別のストレージクラスへ移動
Expiration(期限):   指定日数後にオブジェクトを削除(または削除マーカー作成)

ストレージクラスの移行方向(制約あり)

移行は**「低コスト方向のみ」**が原則だ。逆方向(GlacierからStandardへ)の自動移行はできない。

Standard

Standard-IA / One Zone-IA / Intelligent-Tiering

Glacier Instant Retrieval

Glacier Flexible Retrieval

Glacier Deep Archive

⚠️ 同じ階層間の移行も制約がある
   Standard-IA → One Zone-IA: 不可
   Intelligent-Tiering → Standard-IA: 不可

移行の最小日数制約

Standard → Standard-IA: 30日以上経過してから
Standard → Intelligent-Tiering: 0日(即時)
Standard → Glacier: 0日(即時)
Standard-IA → Glacier: 0日(移行後)

Small object penalty: Standard-IAやGlacierには最小オブジェクトサイズがある。128KB未満のオブジェクルはIAに移行すると逆に高くなる場合がある(最小128KB分の課金)。

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

{
  "Rules": [
    {
      "ID": "log-archive-policy",
      "Status": "Enabled",
      "Filter": {
        "Prefix": "logs/"
      },
      "Transitions": [
        {
          "Days": 30,
          "StorageClass": "STANDARD_IA"
        },
        {
          "Days": 90,
          "StorageClass": "GLACIER_IR"
        },
        {
          "Days": 365,
          "StorageClass": "DEEP_ARCHIVE"
        }
      ],
      "Expiration": {
        "Days": 2555
      }
    },
    {
      "ID": "temp-files-cleanup",
      "Status": "Enabled",
      "Filter": {
        "Prefix": "temp/"
      },
      "Expiration": {
        "Days": 7
      }
    }
  ]
}

マルチパートアップロードの未完了部分を削除

マルチパートアップロードが途中で中断されると、アップロード済みのパートがS3に残り課金される。ライフサイクルルールで自動クリーンアップできる。

{
  "Rules": [{
    "ID": "cleanup-incomplete-multipart",
    "Status": "Enabled",
    "Filter": {},
    "AbortIncompleteMultipartUpload": {
      "DaysAfterInitiation": 7
    }
  }]
}

バージョニング有効時のライフサイクル

バージョニング有効時は「現在のバージョン」と「古いバージョン(Noncurrent)」を別々に管理できる。

{
  "Rules": [{
    "ID": "versioned-lifecycle",
    "Status": "Enabled",
    "Filter": {},
    "Transitions": [
      {
        "Days": 90,
        "StorageClass": "STANDARD_IA"
      }
    ],
    "NoncurrentVersionTransitions": [
      {
        "NoncurrentDays": 30,
        "StorageClass": "STANDARD_IA"
      },
      {
        "NoncurrentDays": 90,
        "StorageClass": "GLACIER"
      }
    ],
    "NoncurrentVersionExpiration": {
      "NoncurrentDays": 365,
      "NewerNoncurrentVersions": 5
    },
    "ExpiredObjectDeleteMarkerExpiration": {
      "ExpiredObjectDeleteMarker": true
    }
  }]
}

フィルターの種類

// プレフィックスでフィルタ
"Filter": { "Prefix": "images/" }

// タグでフィルタ
"Filter": {
  "Tag": { "Key": "Environment", "Value": "dev" }
}

// プレフィックスとタグの組み合わせ(AND条件)
"Filter": {
  "And": {
    "Prefix": "data/",
    "Tags": [
      { "Key": "Type", "Value": "logs" }
    ]
  }
}

// バケット全体(フィルタなし)
"Filter": {}

コスト最適化の実践パターン

シナリオ: CloudFrontアクセスログの管理

CloudFront → S3(Standardに書き込み)
  ↓ 30日後
Standard-IA
  ↓ 90日後
Glacier Flexible(監査用、取り出し不要)
  ↓ 1年後
削除(法定保存期間満了)

→ ライフサイクルルールで完全自動化

試験頻出ポイント

シナリオ設定
作成から30日はStandard、その後低頻度30日後にStandard-IAへ移行
マルチパート中断による課金を防ぐAbortIncompleteMultipartUpload設定
最新5バージョンだけ保持NoncurrentVersionExpiration + NewerNoncurrentVersions
削除マーカーだけ残るゾンビを削除ExpiredObjectDeleteMarker: true
GlacierからStandardへの自動移行不可(手動でRestoreが必要)

まとめ

ライフサイクルルールはS3のコスト最適化とデータ管理の自動化に不可欠だ。移行方向の制約(低コスト方向のみ)とマルチパートの未完了部分クリーンアップを忘れずに設定することが運用上重要になる。