TT Lab
开始
学习 学习路径 课程

对象存储与 S3

处理版本管理与生命周期

在 TT Lab 中继续学习

目标

一次性掌握开启版本控制、版本逐渐累积的过程、删除如何以 delete marker 来表示,以及清理它们的生命周期规则。

为什么重要

版本控制是用来从误操作中恢复的安全网,但同时也是一个成本陷阱。如果对每天都向同一个键覆盖写入日志的代码开启版本控制,一年后这一个键下就会堆积 365 个版本。列表里看上去只是一个对象,费用却是 365 倍。而“明明都删了,费用却没变”这类咨询的原因,就是 delete marker——不带版本 ID 删除时,数据原封不动,只是多了一个标记。因此在实际工作中,开启版本控制的决定和设置生命周期规则的决定,总是一并做出。本实验的第 7 步讲的就是这套基本组合的三项内容。

步骤

  1. 创建存储桶 lab-vers 并开启版本控制。aws --profile local s3api get-bucket-versioning --bucket lab-vers 中必须能看到 Enabled。
  2. 向 s3://lab-vers/doc.txt 上传 3 次不同的内容。aws --profile local s3api list-object-versions --bucket lab-vers --prefix doc.txt 的 Versions 必须有 3 个。
  3. 用版本 ID 指定最旧的版本,下载为 /root/vers/v1.txt。内容必须是第一次上传的内容。
  4. 不指定版本,删除 doc.txt。版本列表中必须新增一个 DeleteMarkers,使全部条目变为 4 个。在 /root/vers/marker.txt 中写入 versions=4 has_delete_marker=true。
  5. 用版本 ID 指定 delete marker 并删除它。aws --profile local s3 cp s3://lab-vers/doc.txt - 必须返回第 3 次的内容。在 /root/vers/restore.txt 中写入 restored=true。
  6. 在 /root/vers/versions.txt 中写入 current_bytes=<n>、noncurrent_bytes=<n>、total_bytes=<n>(占位符均为字节数)三行。total 是两个值之和,noncurrent 必须大于 0。
  7. 把生命周期规则写入 /root/vers/lifecycle.json,并用 aws s3api put-bucket-lifecycle-configuration --bucket lab-vers --lifecycle-configuration file:///root/vers/lifecycle.json 应用。必须同时包含三个动作:非当前版本 30 天后过期、清理已过期的 delete marker、未完成的分段上传 7 天后中止。把 aws s3api get-bucket-lifecycle-configuration --bucket lab-vers 的输出保存到 /root/vers/ilm.txt。

参考

开启存储桶版本控制

创建存储桶 lab-vers 并开启版本控制。aws --profile local s3api get-bucket-versioning --bucket lab-vers 中必须能看到 Enabled。

这是存储桶级别的设置。开启后查询状态来确认。

向同一个键写入三次,累积版本

向 s3://lab-vers/doc.txt 上传 3 次不同的内容。aws --profile local s3api list-object-versions --bucket lab-vers --prefix doc.txt 的 Versions 必须有 3 个。

每次内容都要不同,以后才能区分。查询一下版本列表。

读取旧版本

用版本 ID 指定最旧的版本,下载为 /root/vers/v1.txt。内容必须是第一次上传的内容。

指定版本标识符进行查询。必须得到第一次上传的内容。

删除后确认 delete marker

不指定版本,删除 doc.txt。版本列表中必须新增一个 DeleteMarkers,使全部条目变为 4 个。在 /root/vers/marker.txt 中写入 versions=4 has_delete_marker=true。

不指定版本删除的话,并不会真正消失。版本列表中会多出一个新条目。

删除 delete marker 以恢复

用版本 ID 指定 delete marker 并删除它。aws --profile local s3 cp s3://lab-vers/doc.txt - 必须返回第 3 次的内容。在 /root/vers/restore.txt 中写入 restored=true。

删除标记之后,紧接在它下面的版本会重新成为当前版本。这就是从误操作中恢复的机制。

计算非当前版本的容量

在 /root/vers/versions.txt 中写入 current_bytes=<n>、noncurrent_bytes=<n>、total_bytes=<n>(占位符均为字节数)三行。total 是两个值之和,noncurrent 必须大于 0。

列表里看上去是一个对象,但费用会计在所有版本上。亲自算出合计。

应用生命周期规则

把生命周期规则写入 /root/vers/lifecycle.json,并用 aws s3api put-bucket-lifecycle-configuration --bucket lab-vers --lifecycle-configuration file:///root/vers/lifecycle.json 应用。必须同时包含三个动作:非当前版本 30 天后过期、清理已过期的 delete marker、未完成的分段上传 7 天后中止。把 aws s3api get-bucket-lifecycle-configuration --bucket lab-vers 的输出保存到 /root/vers/ilm.txt。

非当前版本过期、清理已过期的标记、中止未完成的上传,这三项是基本组合。