3. S3 存储桶基础:创建、模型与访问

S3 是整个 AWS 存储生态的基石。说白了你得先有个桶,才能往里放东西。这一章我们就把「桶」这件事彻底掰扯清楚。

3.1 创建你的第一个桶

创建桶这事儿听起来简单,但里面有几个坑。我个人习惯先用控制台走一遍,再用 CLI 批量,最后在代码里用 SDK 自动化。

桶名是全局唯一的 —— 整个 AWS 所有区域、所有账号共享一个命名空间。你取的名字别人用了你就用不了。

3.1.1 控制台创建

  1. 打开 S3 服务,点击「创建存储桶」。
  2. 输入桶名。我建议用「项目-环境-随机后缀」的命名法:比如 myapp-prod-2a3b。
  3. 选择区域。原则是离用户最近、成本最优。
  4. 权限设置:默认「阻止所有公有访问」最安全。
  5. 其他配置保持默认,点击创建。

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 层面的模拟。

删除「目录」时,S3 根本没有目录可删,它只是删掉所有以该前缀开头的对象。别被 UI 骗了。

你想想看,知道这个有什么好处?写 IAM 策略的时候,你可以精确控制 arn:aws:s3:::my-bucket/prefix/* 这样的资源路径,而不是用通配符全放行。

3.3 三种访问方式

我平时切换着用:调试用控制台,自动化用 CLI,集成用 SDK。下面这张图可以帮你快速理解它们的关系。

S3 存储桶访问方式与模型 S3 存储桶 🌐 控制台 (Web UI) 🖥️ CLI (aws s3) 📦 SDK (Python/JS/Java) 对象存储模型:扁平键值对 Key="images/2024/photo.jpg" → 元数据 + 数据 🔴 控制台模拟文件夹,实际没有 CLI 支持管道操作,便于批量 SDK 自动重试、分片上传 IAM 策略用 Key Prefix 做权限控制

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
交互 图形化,直觉 命令行,可脚本化 程序集成,自动化
适用场景 偶尔查看、测试 批量操作、部署 应用开发、微服务
权限检查 界面提示较模糊 错误信息明确 异常处理灵活
学习成本 最低 中(需记命令) 高(需懂编程)
不管你用哪种方式,底层都走 AWS API。权限配置不对,控制台、CLI、SDK 都会统一拒绝 —— 不会因为换了界面就放行。

对了,最后提醒一句:创建桶的时候区域选好,以后搬迁数据非常痛苦。我曾经帮客户把成 TB 的数据从一个区域搬到另一个区域,用 aws s3 sync --source-region 跨区域拷贝,跑了三天三夜。早点规划好区域能省很多事。