同步报表目录

AWSBeginner
立即练习

介绍

一个团队发布一个包含每日 CSV 报表的目录。你将上传目录,发布修改,并删除过时的存储报表,同时保护独立的归档。

请先完成 使用对象键和元数据组织文档,掌握其中的存储桶、对象键、前缀和下载概念。这个全新 VM 提供 CLI 连接、本地报表和一个只包含归档的存储桶。使用 Terminal 执行命令,并在旁边的 AWS View 标签页观察变化。

发布已准备好的报表目录

在本步骤中,你将把两份本地报表发布到 daily/ 前缀,并理解文件名如何映射为对象键。

使用 cd(更改目录)进入工作目录:

cd /home/labex/project

使用 ls 查看已准备好的报表目录,它会列出本地文件名:

ls reports

列表包含 monday.csv 和 tuesday.csv。两者都是 CSV 文件:标题行给出列名,逗号分隔每条记录中的值。使用打印文件内容的 cat 查看星期一报表:

cat reports/monday.csv
date,orders
2026-09-28,120

列出已准备好的存储桶。对于 S3 位置,--recursive 显示整个桶中的完整对象键:

aws s3 ls s3://labex-report-delivery/ --recursive

只有 archive/retention.txt 存在。归档属于独立的工作流程,必须在每日同步后保留。

aws s3 sync 依次接收源和目标。它会递归检查源目录中的文件;sync 不需要 --recursive。每个相对文件名都会成为目标前缀下的对象键。因此,reports/monday.csv 会成为 daily/monday.csv,而不是 daily/reports/monday.csv。

aws s3 sync reports/ s3://labex-report-delivery/daily/

命令报告星期一和星期二报表的上传;输出顺序可能不同。再次列出整个桶:

aws s3 ls s3://labex-report-delivery/ --recursive

你应找到三个对象键:archive/retention.txt、daily/monday.csv 和 daily/tuesday.csv。AWS View 显示相同的对象。点击 daily/monday.csv,读取已存储的两行 CSV 报表。归档位于你选定的 daily/ 目标范围之外。

同步修改和新报表

在本步骤中,你将更新一份报表、添加另一份报表,并传输这些变化,而不再次上传未变的报表。

当源和目标都没有变化时,可以安全地使用相同源和目标运行 sync:

aws s3 sync reports/ s3://labex-report-delivery/daily/

已有文件均为最新时,没有上传行。对于本地到 S3 的传输,CLI 会检查目标对象键是否缺失、大小是否不同,或者本地文件的修改时间是否更新。它不会持续监视目录:想要发布修改时,你需要运行 sync。

向星期一报表添加一批迟到的 25 个订单。printf 打印引号中的文本;\n 结束该行。Shell 的 >> 向本地文件追加内容,而不是替换内容:

printf '2026-09-28,25\n' >> reports/monday.csv

查看三行结果:

cat reports/monday.csv
date,orders
2026-09-28,120
2026-09-28,25

创建星期三报表。这里的 > 写入新文件,替换该路径已有的任何内容:

printf 'date,orders\n2026-09-30,150\n' > reports/wednesday.csv

发布前,存储的星期一报表仍为两行,AWS View 中还没有星期三报表。只修改本地文件不会改变 S3。

再次发布:

aws s3 sync reports/ s3://labex-report-delivery/daily/

你应看到已修改的星期一报表和新建星期三报表的上传。星期二报表没有变化,因此不会上传。这是增量传输:复制变化,而不是不加区分地复制每个文件。

在 AWS View 中,星期一报表现在显示迟到的订单批次,星期三报表也已出现。将星期一报表下载到独立的本地路径,以便比较实际存储的内容:

aws s3 cp s3://labex-report-delivery/daily/monday.csv retrieved-monday.csv

cmp 逐字节比较文件。内容一致时,它成功退出,不打印差异。&& 只在比较成功后打印消息:

cmp reports/monday.csv retrieved-monday.csv && echo 'Updated report matches'
Updated report matches

这确认更新已到达存储;仅凭命令成功消息,无法判断存储的是哪些字节。

下面的示例展示了更新后展开的存储星期一报表。星期三报表已存在,独立归档仍保留在桶中:

已更新的报表目录和保留的归档

只对每日前缀进行镜像同步

在本步骤中,你将删除过时的目标报表,同时保护无关归档。

sync 的目标是 daily/;archive/ 位于该范围之外。

同步前缀范围

星期二报表已不属于发布的每日报表集合。使用 rm(删除)只删除这个本地文件。这是本地文件系统命令,因此不会删除 S3 对象:

rm reports/tuesday.csv

再次运行普通 sync:

aws s3 sync reports/ s3://labex-report-delivery/daily/

列出目标前缀:

aws s3 ls s3://labex-report-delivery/daily/ --recursive

星期二报表仍然存在。默认情况下,sync 复制缺失或更新的文件,但保留目标中的额外对象。只删除源文件不会删除它的存储副本。

镜像同步(mirror)让目标文件集合与源保持一致,包括删除。--delete 删除没有匹配源文件的目标对象键。先与 --dryrun 配合,显示计划操作但不执行:

aws s3 sync reports/ s3://labex-report-delivery/daily/ --delete --dryrun

预演应只列出删除 daily/tuesday.csv。星期一和星期三报表与源一致,archive/retention.txt 位于 daily/ 之外。请保持目标前缀准确:使用桶根路径会将归档纳入操作范围。

检查计划删除操作后,去掉 --dryrun,运行相同操作:

aws s3 sync reports/ s3://labex-report-delivery/daily/ --delete

命令报告星期二报表已删除。查看整个桶,以便同时检查消失和保留的内容:

aws s3 ls s3://labex-report-delivery/ --recursive

剩余对象键为 daily/monday.csv、daily/wednesday.csv 和 archive/retention.txt。在 AWS View 中打开归档对象,确认它仍显示 Keep the archive outside daily synchronization.。镜像同步只影响选定前缀。

删除实验存储资源

在本步骤中,你将清理本练习创建的报表和归档,再删除空存储桶。

归档必须在每日镜像同步后保留,但它也是本练习拥有的一次性资源。现在可以明确删除它。先使用限定在 daily/ 的递归操作删除两个每日报表对象:

aws s3 rm s3://labex-report-delivery/daily/ --recursive

输出确认两份报表已删除。使用完整对象键删除归档:

aws s3 rm s3://labex-report-delivery/archive/retention.txt

确认存储桶为空:

aws s3 ls s3://labex-report-delivery/ --recursive

命令成功且没有对象行,证明桶为空。aws s3 rb(删除存储桶)现在可以删除容器:

aws s3 rb s3://labex-report-delivery

输出为 remove_bucket: labex-report-delivery。检查剩余存储桶:

aws s3 ls

没有剩余存储桶行。AWS View 在成功查询状态后显示 No buckets。本地报表文件仍可用于检查;删除存储资源不会删除这些本地副本。

总结

你将本地报表目录发布到 S3 前缀,在没有变化时重复同步,上传修改后的报表和新报表,并将下载的更新内容与源文件比较。你看到普通 sync 会保留目标中的额外对象,随后预览并执行了使用 --delete、限定在 daily/ 的镜像同步。

归档位于目标前缀之外,因此在该操作后保留。清理全部实验存储资源之前,你验证了新状态和保留的数据。以后执行流程时,请在运行 sync 前选择好源、目标和删除范围。