ruby-aws-sdk删除S3对象返回成功但对象仍存在该如何处理?
S3删除返回204但对象仍存在的排查点
以下是需要优先排查的问题:
- Key编码匹配问题
你代码中传入的Key为vocs_direct%25252F2021-09-14%25252Fd4c494cc-48a5-4fbd-b6ea-712a8d0b8c55.mp3,其中%25252F是斜杠/的双重URL编码结果,但SDK调用日志显示实际传给S3的Key已经被自动解码为vocs_direct/2021-09-14/d4c494cc-48a5-4fbd-b6ea-712a8d0b8c55.mp3。
S3对删除不存在的对象会默认返回204成功(幂等设计),如果S3中真实存储的对象Key是未解码的带%252F的版本,你实际删除的是不存在的Key,自然不会生效。你可以分别调用head_object接口传入编码前后的两个Key,确认真实存在的Key格式。 - 存储桶版本控制问题
如果存储桶开启了版本控制,普通删除操作只会给对象添加一个删除标记,不会永久删除对象的历史版本。此时直接访问对象的固定版本URL、或者没有配置对应版本删除规则的情况下,原对象仍然可以正常访问。你可以调用list_object_versions接口查看对应Key的所有版本,指定版本号执行删除才能彻底移除对象。 - CDN缓存问题
如果你访问的对象地址是CDN域名而非S3原生域名,很可能是CDN节点缓存了原对象内容,此时S3侧的对象已经删除,但是CDN缓存未过期仍然返回旧资源。你可以提交CDN刷新任务,或者直接调用S3原生的对象访问地址验证对象是否真的存在。 - 并发写入冲突问题
如果有其他业务逻辑、定时任务在你执行删除操作的前后,重新上传了相同Key的对象,也会出现删除成功但对象仍然存在的情况。你可以开启S3存储桶的CloudTrail日志,查看对应Key的所有操作记录,确认删除之后是否有新的PutObject请求。 - 对象保留规则限制问题
如果存储桶开启了S3对象锁定、WORM(一次写入多次读取)策略,或者对应对象处于合规保留、诉讼保留状态,普通删除操作不会实际生效,但S3仍然会返回204响应。你可以查看对象的元数据确认是否配置了相关保留规则。
内容的提问来源于stack exchange,提问作者technoch1ef
相关产品推荐
相关产品推荐

