コンテンツにスキップ
Classmethod S3 Delete Object Deny by Tag

S3 汎用バケットの DeleteObject をタグ条件で Deny できるのか試してみた

  • URL: https://dev.classmethod.jp/articles/s3-delete-object-deny-by-tag-condition/
  • 日付: 2026-06-10
  • Tier: Tier 2
  • 要旨: S3汎用バケットでオブジェクト自身のタグ(s3:ExistingObjectTag)を条件にDeleteObjectをDenyしようとしたが機能しないことを検証。代替として、バケットタグ(aws:ResourceTag)を条件に配下のオブジェクト削除をDenyすることで期待通りの制御が実現できることを確認。

詳細

検証した仮説 S3汎用バケットのABAC有効化後、オブジェクトにManagedBy=iacタグを付与してDeleteObjectをDenyできるか

結論

  • s3:DeleteObject + s3:ExistingObjectTag/ManagedBy: iac条件 → 機能しない(ABAC有効化済みでもオブジェクトタグによる条件評価がDeleteObjectではサポートされていない)
  • 代替: s3:DeleteObject + aws:ResourceTag/ManagedBy: iac条件(バケットタグを条件に指定)→ 機能する

実用的な制御方法 バケットレベルのタグ(aws:ResourceTag)で配下の全オブジェクト削除をDenyする方式:

{
  "Effect": "Deny",
  "Action": "s3:DeleteObject",
  "Resource": "*",
  "Condition": {
    "StringEquals": {
      "aws:ResourceTag/ManagedBy": "iac"
    }
  }
}

制限

  • オブジェクト単位のタグで細粒度制御はできない(バケット単位になる)
  • バージョニング無効状態での検証