SJ blog
backend
A

信頼度ランク

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

S3バージョニング — 削除マーカー・ライフサイクルへの影響・コスト管理

S3バージョニングの有効化・一時停止の違い、削除マーカーの仕組み、バージョン数増加によるコスト管理、ライフサイクルルールとMFADelete設定を試験対策視点で解説。

一言結論

S3バージョニングを有効化すると全バージョンに対してストレージ料金が発生するため、ライフサイクルルールで古いバージョンをGlacierへ移行し不要な削除マーカーを自動削除するコスト管理が必須であり、一度有効化したバージョニングは無効に戻せないことも設計上の重要な制約だ。

バージョニングの3つの状態

S3バージョニングには3つの状態がある。

Unversioned(デフォルト): バージョニングなし
Enabled(有効):           全オブジェクトにバージョンIDが付与される
Suspended(一時停止):     新規オブジェクトにバージョンIDが付与されない
                          既存のバージョン履歴は保持される

重要: 一度有効化したバージョニングは無効(Unversioned)には戻せない。一時停止(Suspended)のみ可能。

バージョニング有効時の削除動作

# バージョニングなしの削除(通常の削除)
aws s3 rm s3://my-bucket/file.txt
# → ファイルが完全削除される

# バージョニング有効時のオブジェクト削除(バージョンIDなし)
aws s3 rm s3://my-bucket/file.txt
# → 削除マーカー(Delete Marker)が作成される
# → ファイルはまだ存在する(古いバージョンとして)

# 特定バージョンの削除
aws s3api delete-object \
  --bucket my-bucket \
  --key file.txt \
  --version-id abc123
# → 指定バージョンのみ削除(削除マーカーは作成されない)

削除マーカーの仕組み

削除マーカーとは「削除された」ことを示す特殊なバージョンだ。

ファイルの歴史:
v1 (2024-01-01)  ← 最初のバージョン
v2 (2024-06-01)  ← 更新後
DELETE MARKER    ← aws s3 rm を実行すると作成
                    → S3は「ファイルが存在しない」ように見せる

削除マーカーを削除すると → v2が最新版として復元される
# 削除マーカーを削除してオブジェクルを復元
aws s3api delete-object \
  --bucket my-bucket \
  --key file.txt \
  --version-id DELETE_MARKER_VERSION_ID

ライフサイクルルールとバージョニングの組み合わせ

バージョニング有効時のコスト管理にライフサイクルルールを使う。

{
  "Rules": [
    {
      "ID": "version-management",
      "Status": "Enabled",
      "NoncurrentVersionTransitions": [
        {
          "NoncurrentDays": 30,
          "StorageClass": "STANDARD_IA"
        },
        {
          "NoncurrentDays": 90,
          "StorageClass": "GLACIER"
        }
      ],
      "NoncurrentVersionExpiration": {
        "NoncurrentDays": 365,
        "NewerNoncurrentVersions": 3
      },
      "ExpiredObjectDeleteMarkerExpiration": {
        "ExpiredObjectDeleteMarker": true
      }
    }
  ]
}

NewerNoncurrentVersions: 3 は「最新3バージョンは保持し、それより古いものは削除」を意味する。

ExpiredObjectDeleteMarker: true は「そのオブジェクトの全バージョンが削除され、削除マーカーだけが残っている場合に削除マーカーも自動削除」する。

MFA Delete

バージョニング設定の変更とバージョンの永久削除にMFAを必須化できる機能だ。

# MFA Deleteの有効化(バケットオーナーかつルートユーザーのみ実行可能)
aws s3api put-bucket-versioning \
  --bucket my-bucket \
  --versioning-configuration '{
    "Status": "Enabled",
    "MFADelete": "Enabled"
  }' \
  --mfa "arn:aws:iam::123456789012:mfa/root-account-mfa-device 123456"

MFA Delete有効時は以下の操作にMFAが必要:

  • バージョニング設定の変更(有効化・一時停止)
  • 特定バージョンの削除(削除マーカー作成はMFA不要)

バージョニングとレプリケーション

バージョニングはレプリケーションの前提条件
→ CRR/SRRを使う場合は必ずバージョニングを有効化

レプリケーション先でも全バージョンがコピーされる
→ レプリケーション先のコスト計算に注意

コスト管理の注意点

バージョニングを有効化すると、全バージョンに対してストレージ料金が発生する。

# バケット内の全バージョンのサイズを確認
aws s3api list-object-versions \
  --bucket my-bucket \
  --query '[Versions[].Size, DeleteMarkers[]] | [0] | sum(@)'

# 削除マーカーの数を確認
aws s3api list-object-versions \
  --bucket my-bucket \
  --query 'length(DeleteMarkers)'

試験頻出ポイント

シナリオ回答
バージョニングを無効に戻したい不可。一時停止のみ可能
aws s3 rm 実行後にファイルが消えた削除マーカーが作成されただけ、古いバージョンは残る
バージョン履歴を保持しつつコスト削減ライフサイクルルールで古いバージョンをGlacierへ移行
誤削除を防止したいMFA Deleteを有効化
レプリケーションの前提条件バージョニングの有効化

まとめ

バージョニングは誤削除・上書き保護の基本機能だが、全バージョンにストレージ料金が発生する。ライフサイクルルールで古いバージョンをIA/Glacierに移行し、不要な削除マーカーを自動削除することでコストを管理することが重要だ。