早上一看 archive/ 下 3 天前的对象全没了。生命周期规则只有一条,前缀写的是空字符串,过期天数 7,实际删掉的却是 3 天前的数据。乍看像缓存或者权限的锅,追下去往往不是。

aws s3api get-bucket-lifecycle-configuration --bucket b
aws s3api put-bucket-lifecycle-configuration --bucket b --lifecycle-configuration file://lc.json

追下去是这么回事:前缀留空等于匹配整个桶,规则会作用到所有对象。过期天数按对象最后修改时间算,不按目录名。桶里还有一条更早的规则在生效,两条叠加时先到期的先执行。

「生命周期误删」相关的验证我通常做两遍,改完一次、隔天再看一次,确认不是临时生效。验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。

能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。

具体做法是,立刻关掉规则 阻止下一轮扫描;用清单或访问日志确认被删对象的 key 范围;前缀改成明确目录 再加标签过滤;先在小桶上跑一天 看清单预览再放开。

验收就看一点,规则前缀只匹配 logs/ 之后,archive/ 下的对象连续三天没有被删除。

作者 9823189