在 S3 中存储和读取文件

AWSBeginner
立即练习

介绍

日报需要一份可供同事获取的存储副本,即使本地源文件已改变。本课程首个 S3 实验围绕同一份报表练习上传、替换和取回,最后学习先删对象、再删存储桶的依赖关系。

Amazon S3 把文件作为对象存放在存储桶中;每个对象都有一个 key,用于在桶内标识它。

你应熟悉在 Terminal 中输入 AWS CLI 命令,并在 AWS View 中查看结果。如果尚不熟悉,建议先学习 AWS 基础入门。 CLI 连接和 report.txt 已在这个全新 VM 中准备好,不需要个人 AWS 登录或之前的资源。使用 Terminal 执行命令,并在上方的 AWS View观察本实验的存储。

认证考点

认证 考点 本实验练习
Cloud Practitioner (CLF-C02) 任务 3.6 S3 对象存储、上传、更新与下载。
Solutions Architect – Associate (SAA-C03) 任务 3.1 S3 对象存储、上传、更新与下载。
Developer – Associate (DVA-C02) 任务 1.3 S3 对象存储、上传、更新与下载。
Data Engineer – Associate (DEA-C01) 任务 1.1 基础练习:S3 对象存储、上传、更新与下载。

实验概览

概念图:AWS CLI 将 report.txt 上传到 S3 存储桶并替换内容,再下载存储对象进行比较;AWS View 查看存储状态。

创建存储桶

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

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

cd /home/labex/project

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

aws --version

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

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 将命令与可观察的资源变化联系起来,预览展示了实际存储内容。

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

进一步阅读 AWS 官方资料:S3 存储桶、对象与键.