S3:生命周期、恢复与故障推演
生命周期、版本恢复与条件写排错
生命周期与分片容量
S3 生命周期应分别管理当前版本到期、NoncurrentVersionExpiration、过期删除标记和 AbortIncompleteMultipartUpload。版本桶当前对象过期可能产生删除标记,旧版本仍保留;仅清掉当前可见对象不能回收全部历史容量。规则匹配前缀、标签及版本状态,要与 Object Lock 和保留要求一起评估。本系列不写入任何桶规则。官方版本控制解释版本与生命周期的关系。
S3 账单还可能包含最低存储时长、归档取回和跨区域传输,类转换不是无成本操作。未完成分片需独立统计 uploadId 与年龄,不能在普通列表里找不到就认为没有费用。服务端生命周期是异步管理,业务“到期不可访问”应由授权逻辑实现,不能依赖对象恰好在某一秒物理删除。
恢复与销毁的区别
S3 恢复首先保存 Versions 与 DeleteMarkers 的完整分页清单,区分标记遮挡、内容覆盖、永久删版和归档未取回。按选定 VersionId 读取到独立路径,核对大小与业务摘要,再复制为新当前版本或在明确审批下删除特定标记。复制会产生新版本,数据库引用也应随之更新;恢复者必须防止覆盖刚发布的新业务结果。
永久删除某个 VersionId 后,S3 版本控制不能恢复该版本;需要独立备份或副本。删除标记可能让旧内容重新可见,所以“删除一个标记”也是访问状态改变。恢复验收应覆盖内容、版本引用、权限及业务状态,不是只看 HTTP 200。本 CLI 不提供自动恢复和批量永久删除功能。
IAM、签名和区域排错
S3 IAM 排错遇到 AccessDenied 应核对实际凭据来源、动作、桶/对象 ARN、桶策略显式拒绝、跨账号条件、权限边界和 KMS。ListBucket 成功不代表 GetObjectVersion 成功,GetObject 成功也不证明可删除历史版本。不要在异常时输出环境密钥或完整 Authorization。Boto3 凭据链帮助辨认 profile 与环境变量覆盖。
S3 签名排错遇到 SignatureDoesNotMatch 检查 Region、SigV4、Endpoint、系统时间、Host、路径编码与签名头。ExpiredToken 应检查临时凭据本身期限,而不仅 URL 上的 ExpiresIn;预签名有效期不能超过底层身份实际可用期。代理添加不同 Content-Type 或改写请求目标也可能造成差异,不要通过关闭认证或公共 ACL 来“修好”签名。
412、409 与超时重试
S3 412 表示 IfMatch 或 IfNoneMatch 前提不成立,应读新状态后解决业务冲突;S3 409 ConditionalRequestConflict 表示条件请求遇到竞争,重试须按对应 API 重新获取状态,multipart 还可能要重新初始化。不能为了得到200去掉条件。PutObject 合同给出区别。
超时只说明客户端不知道结果,不能保证服务端没写入。固定 VersionId 的只读重试与生成新随机名的 put 不是一回事;后者可能产生孤儿对象。BadDigest 表示校验不一致,优先核对 Base64 编码、源文件变化和请求构造,不是禁用校验继续提交。练习:恢复时用普通 PUT 覆盖为什么危险?答案:恢复过程也会并发,必须保留已观察的状态并用恰当条件或业务锁保护发布。本轮示例未执行、未访问任何云账号。
版本历史、条件写与发布流程
自测问题
S3 复习请先推演:两位作者分别使用同一个旧 ETag 做 IfMatch 写入时会发生什么?普通 DELETE 后旧版本是否消失?为什么分片 ETag 不适合作全文 MD5?只有 GetObject 的主体能否读取明确 VersionId?预签名 URL 有效期五分钟但 STS 两分钟后过期会怎样?前置:机制与CLI,先写答案再核对。
参考答案
S3 条件写解答:服务端根据目标 ETag 检查 IfMatch,发生内容标识变化时旧条件可得到412;不能先 HEAD 再去掉条件上传。409 竞争另按 API 处理。ETag 是比较字段,不等于完整业务版本历史,保存 VersionId 才能准确引用一次写入;遇到同内容再次写入等场景还要分清内容标识和版本身份。PutObject API是判定依据。
S3 删除解答:版本桶普通删除创建 delete marker,旧版本继续保存;永久删版需要明确 VersionId 和相应权限。GetObject 与 GetObjectVersion 是不同授权动作,ListBucket 也不涵盖版本清单。清理时必须区分 Versions、DeleteMarkers 与 multipart,否则可能既无法恢复也未真正回收全部成本。
S3 校验解答:分片 ETag 不能当通用全文 MD5,显式校验字段与业务 SHA-256 有各自作用。临时身份先过期会缩短预签名 URL 寿命,链接本身不是一次性能力,业务授权仍需在签发前完成。成功签名也不证明远端对象存在或可读取。完整性指南提供算法边界。
纸面综合实践
S3 实践设计“先上传不变对象,再提交报告引用”:对象 key 使用 UUID 或业务内容命名,IfNoneMatch 保护只创建,记录 VersionId、大小、摘要与 RequestId;数据库事务按业务幂等键提交 ready 引用。上传成功但数据库失败产生待清理孤儿,数据库成功但客户端断线应查询已存在结果,不应再次创建另一个报告。
把同一方案扩展到并发更新报告指针:如果指针也存为 S3 对象,应按读到的 ETag 使用 IfMatch,并承认它只保护一个对象,不能与其他 key 或外部数据库共同提交。写出作者 A/B、删除者 C 和恢复者 D 的交错序列,逐步标明前提条件、HTTP 结果、当前版本与历史版本。验收标准是每个失败都能解释,不能只安排没有竞争的顺序请求。
完成标准
能解释 IAM 动作与资源层次、凭据链、VersionId、delete marker、IfMatch/IfNoneMatch、SigV4、校验及 multipart,能指出 CLI 的 paginator、StreamingBody.close 和错误退出,才算完成理论路线。实际运行还需独立保存解析版本、脱敏请求证据与费用,本轮均没有:示例未执行、未安装、未连接云账号。S3 Express、Outposts、其他兼容实现和生产 Object Lock 不能从这里的普通用途桶结论直接外推。
继续阅读
- 应用实践
- 知识专题