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"
}
}
}制限
- オブジェクト単位のタグで細粒度制御はできない(バケット単位になる)
- バージョニング無効状態での検証