はじめに
S3 オブジェクトロックには、「デフォルトの保持」という設定項目があり、有効化するとデフォルトの保持モード(ガバナンス、コンプライアンス)やデフォルトの保持期間を設定できます。
今回は、この「デフォルトの保持」を「無効」にした場合のオブジェクト削除時の挙動を確認しました。
経緯
お客様より、「オブジェクトロックを有効化しているのですが、デフォルトの保持は無効にしています。この状態だと、オブジェクトは削除できてしまうのでしょうか?」という問い合わせを受けたため、調査することになりました。
いきなり結論
AWS CLI から実行する場合は、s3:BypassGovernanceRetention 権限がなくても削除可能ですが、S3 コンソールから削除するには、s3:BypassGovernanceRetention 権限が必要です。
※s3:BypassGovernanceRetention:ガバナンスモードで保護されているオブジェクトを上書き、削除する許可
オブジェクトロックと権限の関係
・バケットの設定でオブジェクトロックを有効化し、「デフォルトの保持」を無効化した場合、バケットにオブジェクトをアップロードしても「保持モード」が適用されないため、オブジェクトはロックされません。
・オブジェクトがロックされていないため、s3:BypassGovernanceRetention 権限がないユーザーでもCLIからは削除できます。ところが、S3 コンソールから削除するにはs3:BypassGovernanceRetention 権限が必要となります。
公式ドキュメントの記述
公式ドキュメントには、以下のように記載されています。
S3 オブジェクトロックの仕組み
Amazon S3 コンソールにはデフォルトで、x-amz-bypass-governance-retention:true ヘッダーが含まれています。ガバナンスモードで保護されているオブジェクトを削除する場合、s3:BypassGovernanceRetention アクセス許可があれば、そのオペレーションは正常に完了します。
"ガバナンスモードで保護されているオブジェクトを削除する場合、"とありますが、「ガバナンスモード」でオブジェクトがロックされていなくても、「デフォルトの保持」を「無効」にした場合、S3 コンソールから削除するにはこの権限が必要です。これは現状のS3コンソールの仕様です。(2025年8月時点)
検証
オブジェクトロックを有効化、デフォルトの保持を無効にしたバケットを作成し、そこにファイルをアップロードします。
AmazonS3FullAccess権限を持つユーザーで、オブジェクト(バケットにアップロードしたファイル)を削除してみます。
※バージョンの表示を「オン」で実行
⇩
⇒ 完全に削除されました。
次に先程のユーザーと同じ権限を持つユーザーに以下のとおり、s3:BypassGovernanceRetentionを明示的に拒否したポリシーをアタッチします。
このユーザーで同様に削除してみます。
【マネジメントコンソールで削除した場合】
※バージョンの表示を「オン」で実行
⇩
⇒ 「アクセスが拒否されました」となり、削除できないことが確認できました。
【CLIで削除した場合】
同じユーザーで、CLIから削除してみます。
⇩
⇩
⇒ 完全に削除されました。
まとめ
オブジェクトロックを有効化し、かつ、デフォルトの保持が無効なバケットにアップロードされたオブジェクトは、オブジェクトがロックされていない状態です。そのため、s3:BypassGovernanceRetention 権限がないユーザーでもAWS CLI から削除できますが、S3 コンソールから削除するには、s3:BypassGovernanceRetention 権限が必要です。これは現時点(2025年8月時点)でのS3 コンソールの仕様になります。
このように、S3 オブジェクトロックにおいては、CLIから実行した場合とS3 コンソールから実行した場合で、動作仕様が異なる点にご注意ください。
最後までお読みいただきありがとうございました。