删除S3中不存在的文件时连带删除空文件夹,如何避免该问题?
S3 指定目录防删除解决方案
问题根因
S3 是扁平化结构的对象存储服务,不存在原生文件系统的目录实体,控制台和 AWS CLI 中展示的“目录”,是系统根据对象键的 / 分隔符生成的逻辑虚拟目录。
你使用的 aws-cli/2.2.46 属于 2021 年的旧版本,存在已知逻辑缺陷:当你对某个前缀下不存在的对象执行 aws s3 rm 操作时,CLI 会判断该前缀下是否有匹配到的对象,若未匹配到就会自动移除该前缀对应的虚拟目录展示,哪怕你创建了 .donotdelete 标记文件,也会因为删除命令的匹配规则未覆盖该隐藏文件触发目录移除。
可用解决方案
方案 1:配置桶策略强制禁止删除指定前缀
这是最彻底的防误删方案,直接在 mainbucket 的桶策略中添加规则,拒绝所有身份删除 DataFeeds/ 前缀下的所有对象:
{ "Effect": "Deny", "Principal": "*", "Action": [ "s3:DeleteObject", "s3:DeleteObjectVersion" ], "Resource": "arn:aws:s3:::mainbucket/DataFeeds/*" }
如果有特定身份需要删除权限,可以在策略中添加 NotPrincipal 字段配置例外
方案 2:升级 AWS CLI 修复异常行为
旧版本 CLI 的误删虚拟目录问题已经在后续版本修复,你可以直接升级到最新版 AWS CLI,即可避免删除不存在对象时连带移除虚拟目录的问题。
方案 3:开启版本控制+删除保护
给 mainbucket 开启版本控制,同时可选开启 MFA 删除保护。开启后所有删除操作只会给对象添加删除标记,不会真正删除对象的历史版本,即使出现误删操作也可以随时回滚到删除前的状态。
方案 4:为指定目录配置只读/只写访问点
给 DataFeeds/ 前缀单独创建 S3 访问点,访问点的策略直接禁止所有 Delete 操作,日常读写该目录的操作都通过访问点执行,从操作入口规避误删风险。
内容的提问来源于stack exchange,提问作者iyerland
相关产品推荐
相关产品推荐

