在 S3 中存储和读取文件

AWSBeginner
立即练习

介绍

一个报表团队需要存储每日销售报表,并读取当前副本。你将创建一个 S3 存储桶,上传和更新报表,检查下载内容,并删除自己的练习资源。

请先完成 在 LabEx 上开始学习 AWS。CLI 连接和 report.txt 已在这个全新 VM 中准备好,不需要个人 AWS 登录或之前的资源。使用 Terminal 执行命令,并在旁边的 AWS View 标签页观察本实验的存储。

创建存储桶

在本步骤中,你将为每日销售报表创建一个存储桶,并在 AWS View 中观察它。

进入工作目录。cd 改变终端的当前目录;本实验中的所有本地文件都使用这个目录。

cd /home/labex/project

确认已准备好的官方 CLI 版本:

aws --version

输出以 aws-cli/2.37.6 开头。镜像已提供工具,让你可以专注于存储操作。

Amazon S3 将文件内容存储为对象(object)。存储桶(bucket)包含这些对象,对象键(key)为桶内的一个对象命名。你将先创建容器,再上传报表。

创建 labex-backups。在 aws s3 mb 中,s3 选择对象存储,mb 表示创建存储桶。s3:// 前缀表示存储位置,不是本地文件夹。

aws s3 mb s3://labex-backups

预期输出:

make_bucket: labex-backups

使用表示列出的 ls 查看存储桶:

aws s3 ls

你应看到一行以 labex-backups 结尾的输出;日期和时间会有所不同。在 AWS View 预览中,会出现没有对象的 labex-backups 卡片。箭头展示 CLI 如何连接存储;存储桶节点反映实际资源查询的结果。

上传并查看报表

在本步骤中,你将把报表存储为 S3 对象,并通过预览读取实际存储的内容。

本地文件与存储副本彼此独立;上传和下载将它们联系起来。

本地副本与存储副本

查看已准备好的本地文件。cat 打印文本文件的内容:

cat report.txt

预期输出:

Daily sales: 120 orders

cp 表示复制。下面第一个路径是本地源文件,第二个路径是目标。存储桶名称之后的部分 report.txt 是对象键。

aws s3 cp report.txt s3://labex-backups/report.txt

输出报告从 report.txt 上传到 s3://labex-backups/report.txt。

列出桶内对象:

aws s3 ls s3://labex-backups/

report.txt 所在行显示修改时间、大小和对象键。上传会创建独立的存储副本:仅编辑本地文件不会改变这个副本。

在 AWS View 中,存储桶卡片显示 1 个对象。点击卡片中的 report.txt 展开内容。预览应显示 Daily sales: 120 orders。它读取的是存储的对象,不是本地源文件。

下面的示例展示了已上传报表在存储桶卡片中的展开状态。内容读取自存储。

存储的报表与 S3 拓扑

更新并读取存储副本

在本步骤中,你将替换报表,下载当前存储版本,并证明内容在上传和下载后保持一致。

更新后的报表包含 145 个订单。printf 写入文本;\n 添加换行。Shell 的 > 运算符替换指定本地文件的内容。

printf 'Daily sales: 145 orders\n' > report.txt

再次上传前,查看报表预览。它仍显示 120 orders,因为存储副本还没有变化。

上传到同一个对象键,替换它的当前内容:

aws s3 cp report.txt s3://labex-backups/report.txt

预览现在显示 145 orders,对象数量仍为 1。复用对象键会更新该对象;在本实验中,不会创建第二个具名对象。

反转 cp 的方向进行下载:S3 路径现在是源,downloaded.txt 是新的本地目标。

aws s3 cp s3://labex-backups/report.txt downloaded.txt

查看下载文件:

cat downloaded.txt

预期输出:

Daily sales: 145 orders

cmp 逐字节比较两个文件。文件相同时,它不打印任何内容,并成功退出。&& 只在比较成功后运行后面的命令。

cmp report.txt downloaded.txt && echo 'Round trip verified'

预期输出:

Round trip verified

这个比较证明读取到的内容与更新后的源文件一致。步骤验证器会独立读取 S3,并比较存储内容和下载内容。

清理存储资源

在本步骤中,你将了解为什么不能删除非空存储桶,然后删除本实验的对象和存储桶。

rb 表示删除存储桶。先在报表仍存在时尝试删除桶:

aws s3 rb s3://labex-backups

这个命令预期会失败,错误为 BucketNotEmpty。这个失败说明资源依赖关系:存储桶包含对象,因此删除容器前应先删除对象。存储桶和对象应仍在预览中可见。

rm 删除准确 S3 路径上的对象:

aws s3 rm s3://labex-backups/report.txt

输出确认 delete: s3://labex-backups/report.txt。对象从预览中消失;存储桶仍然存在,但已为空。

现在删除空存储桶:

aws s3 rb s3://labex-backups

预期输出:

remove_bucket: labex-backups

确认服务仍响应,且未列出任何剩余存储桶:

aws s3 ls

命令完成,没有存储桶行。AWS View 显示 No buckets,没有资源卡片。这个状态来自成功的服务查询;页面断开连接不能证明清理成功。本地报表文件仍可使用,而存储资源已被删除。

下面的清理视图展示成功查询状态后,没有剩余存储桶卡片。

清理后的空存储

总结

你使用官方 AWS CLI 创建了存储桶、上传并替换对象、下载对象、比较文件内容,并删除了存储资源。AWS View 将命令与可观察的资源变化联系起来,预览展示了实际存储内容。

你练习了完整的报表存储流程:在存储桶中组织文件,区分本地副本和存储副本,验证下载内容,并在删除存储桶前先删除对象。