3. S3 存储桶基础:创建、模型与访问
S3 是整个 AWS 存储生态的基石。说白了你得先有个桶,才能往里放东西。这一章我们就把「桶」这件事彻底掰扯清楚。
3.1 创建你的第一个桶
创建桶这事儿听起来简单,但里面有几个坑。我个人习惯先用控制台走一遍,再用 CLI 批量,最后在代码里用 SDK 自动化。
3.1.1 控制台创建
- 打开 S3 服务,点击「创建存储桶」。
- 输入桶名。我建议用「项目-环境-随机后缀」的命名法:比如
myapp-prod-2a3b。 - 选择区域。原则是离用户最近、成本最优。
- 权限设置:默认「阻止所有公有访问」最安全。
- 其他配置保持默认,点击创建。
3.1.2 CLI 创建
你在终端敲一行命令,几秒完事。
aws s3 mb s3://myapp-dev-8f9e --region ap-northeast-1
mb 是 make bucket 的缩写。我记得第一次用的时候还以为是 makefile 呢。
3.1.3 SDK 创建(Python 示例)
import boto3
s3 = boto3.client('s3', region_name='us-east-1')
s3.create_bucket(Bucket='myapp-test-c7d1')
注意:非 us-east-1 区域需要额外指定 CreateBucketConfiguration 参数。我在项目里见过新人忘了加,报错后一脸懵。
3.2 对象存储模型
S3 不是文件系统,它没有目录树。但很多人把它当 NAS 用,结果发现性能、权限都怪怪的。这里你得明白它的核心逻辑——扁平键值对。
| 概念 | 说明 | 类比 |
|---|---|---|
| Bucket(桶) | 顶层容器,全局唯一 | 硬盘 |
| Object(对象) | 数据实体 = 数据 + 元数据 + 唯一键 | 文件 |
| Key(键) | 对象的完整路径(包含「目录」部分) | 文件路径 |
| Prefix(前缀) | 对象键的前缀部分 | 目录名 |
举个栗子:你上传 images/2024/photo.jpg,实际存储的 Key 就是 images/2024/photo.jpg。S3 控制台会按 / 给你画成文件夹的样子,但那只是 UI 层面的模拟。
你想想看,知道这个有什么好处?写 IAM 策略的时候,你可以精确控制 arn:aws:s3:::my-bucket/prefix/* 这样的资源路径,而不是用通配符全放行。
3.3 三种访问方式
我平时切换着用:调试用控制台,自动化用 CLI,集成用 SDK。下面这张图可以帮你快速理解它们的关系。
3.3.1 控制台
适合做单次操作、查看数据、手动修改权限。我排查问题最快就是打开桶,点几下看对象属性。但别用它做批量上传——上传 1000 张图片会点到你手酸。
3.3.2 CLI
脚本爱好者的最爱。常用命令一览:
# 列出桶
aws s3 ls
# 同步目录(增量上传)
aws s3 sync ./local-folder s3://my-bucket/prefix/
# 递归复制
aws s3 cp --recursive s3://source-bucket/ s3://dest-bucket/
# 删除前缀下的所有对象
aws s3 rm s3://my-bucket/backup/ --recursive
sync 命令我几乎天天用,部署静态网站、备份日志都靠它。注意它会自动比对时间和大小,只传有变化的文件。
3.3.3 SDK
当你需要把 S3 嵌入应用程序时,SDK 是王道。以 Python 为例:
import boto3
from botocore.exceptions import NoCredentialsError
s3 = boto3.client('s3')
# 上传对象
try:
s3.upload_file('local.txt', 'my-bucket', 'remote.txt')
print("上传成功")
except NoCredentialsError:
print("没配凭据,先跑 aws configure")
SDK 内置了分片上传、自动重试、签名 URL 生成等高级功能。我记得有一次线上需要生成临时下载链接让用户下载大文件,直接用 generate_presigned_url 搞定,省了写代理服务器的麻烦。
3.4 核心对比
| 维度 | 控制台 | CLI | SDK |
|---|---|---|---|
| 交互 | 图形化,直觉 | 命令行,可脚本化 | 程序集成,自动化 |
| 适用场景 | 偶尔查看、测试 | 批量操作、部署 | 应用开发、微服务 |
| 权限检查 | 界面提示较模糊 | 错误信息明确 | 异常处理灵活 |
| 学习成本 | 最低 | 中(需记命令) | 高(需懂编程) |
对了,最后提醒一句:创建桶的时候区域选好,以后搬迁数据非常痛苦。我曾经帮客户把成 TB 的数据从一个区域搬到另一个区域,用 aws s3 sync --source-region 跨区域拷贝,跑了三天三夜。早点规划好区域能省很多事。