📌 核心知识点
S3 实战指南
📖 S3 基础知识
Amazon S3 (Simple Storage Service) 是 AWS 的标准云存储服务,提供几乎无限容量的对象存储。
🖼️ S3 图解补充

看图重点:按访问频率分层转储,比长期放 Standard 更可控。

看图重点:S3 跨区域与公网传输会影响整体存储方案成本。

看图重点:S3 访问控制排查通常回到 IAM/Bucket Policy 的联合评估。

看图重点:在多团队环境里,可用权限边界限制 S3 管理权限上限。

看图重点:对象存储成本治理要从标签体系开始,否则无法按项目核算。

看图重点:按标签聚合后,能快速看出哪个桶或环境在持续增费。

看图重点:私网访问 S3 时建议走 Endpoint 路径,减少公网暴露与绕行。
S3 是什么?
S3 可以存储任意数量的文件,每个文件从 0 到 5TB。对于大多数实际用途,您可以认为 S3 的容量是无限的,无论是文件总大小还是对象数量。客户通常会存储数百万个对象。
S3 结构
├── 存储桶 (Bucket) - 全球唯一名称
│ ├── 对象 (Object) - 文件 + 元数据
│ │ ├── Key - 对象路径/名称
│ │ ├── Value - 文件内容 (最大 5TB)
│ │ ├── Version ID - 版本标识
│ │ └── Metadata - 元数据(类似 HTTP 头)
│ └── 前缀 (Prefix) - 虚拟文件夹
└── 区域 (Region) - 存储桶所在区域

看图重点:理解“写入后读取一致性”是设计上传后立即访问场景的关键。

看图重点:对象更新后读取行为直接影响缓存刷新和数据可见性策略。
S3 URI 格式:
s3://bucket-name/path/to/key
# 其中 key 是 'path/to/key'
S3 vs 其他存储服务
| 服务 | 类型 | 特点 | 适用场景 |
|---|---|---|---|
| S3 | 对象存储 | 无限容量,高持久性 | 静态文件、备份、数据湖 |
| EBS | 块存储 | 挂载到单个 EC2 | 数据库、文件系统 |
| EFS | 网络文件系统 | 多 EC2 共享 | 共享存储 |
| Glacier | 归档存储 | 低成本,慢访问 | 长期归档 |
存储类详解
| 存储类 | 持久性 | 可用性 SLA | 最小存储 | 适用场景 |
|---|---|---|---|---|
| Standard | 11个9 | 99.9% | 无 | 频繁访问的数据 |
| Intelligent-Tiering | 11个9 | 99.9% | 无 | 访问模式不确定 |
| Standard-IA | 11个9 | 99% | 30天 | 不频繁访问,需快速取回 |
| One Zone-IA | 11个9 | 99% | 30天 | 非关键、可重建的数据 |
| Glacier Instant | 11个9 | 99.9% | 90天 | 归档,需毫秒级访问 |
| Glacier Flexible | 11个9 | - | 90天 | 归档,分钟到小时级 |
| Glacier Deep Archive | 11个9 | - | 180天 | 7-10年长期归档 |
💡 Reduced Redundancy Storage (RRS) 已过时:RRS 持久性只有 99.99%(四个9),且价格不再有优势,不建议使用。
💡 选择建议:
# 频繁访问
Standard → 网站资源、应用数据
# 不确定访问模式
Intelligent-Tiering → 自动优化,无取回费用
# 月访问少于 1 次
Standard-IA → 备份、日志(注意 30 天最小计费)
# 年访问少于 1 次
Glacier Flexible → 合规归档
# 7-10 年归档
Glacier Deep Archive → 法规要求的长期保存
S3 安全最佳实践
❗ 权限管理(最重要)
2017 年,Dow Jones 和 Verizon 等公司因 S3 配置不当导致数据泄露。正确管理权限至关重要!
三种权限机制:
- IAM Policies - 控制用户/角色对 S3 操作的访问
- Bucket Policies - 控制对整个存储桶的访问(如公开网站托管、IP 限制)
- ACLs - 对象级别的权限(较老的机制,谨慎使用)
⚠️ 预定义 ACL 组的陷阱:
# "All Users" = 公开互联网,任何人都可访问!
# "Authenticated Users" = 任何 AWS 账户,几乎等于公开!
# 只有 "Log Delivery" 组是相对安全的
安全最佳实践:
// 阻止所有公开访问
{
"BlockPublicAcls": true,
"IgnorePublicAcls": true,
"BlockPublicPolicy": true,
"RestrictPublicBuckets": true
}
# 启用 AWS Config 规则检查 S3 安全
# 但注意:Config 规则只检查 Bucket 级别,不检查 Object ACL!
💡 专家建议: 不同敏感级别的数据应放在不同的存储桶中,避免复杂的权限规则。
加密配置
# 默认服务器端加密 (SSE-S3 或 SSE-KMS)
aws s3api put-bucket-encryption \
--bucket my-bucket \
--server-side-encryption-configuration '{
"Rules": [{
"ApplyServerSideEncryptionByDefault": {
"SSEAlgorithm": "aws:kms",
"KMSMasterKeyID": "arn:aws:kms:..."
}
}]
}'
版本控制
# 启用版本控制,防止意外删除和覆盖
aws s3api put-bucket-versioning \
--bucket my-bucket \
--versioning-configuration Status=Enabled
性能优化
吞吐量扩展
S3 具有高度可扩展性,理论上可以获得任意高的吞吐量。但实际受限于:
- 源和 S3 之间的网络带宽
- 操作的并发级别
网络带宽参考 (参考 ec2instances.info):
- 同区域 EC2 到 S3 最快
- 实例类型决定网络性能
前缀优化
# 2018年7月后,S3 不再需要随机前缀来避免热点
# 但良好的前缀设计仍有助于组织和管理
# 推荐结构
s3://bucket/images/2024/01/15/img1.jpg
s3://bucket/logs/2024/01/15/app.log
分段上传
大文件必须使用分段上传(Multipart Upload):
# 建议阈值
< 100MB: 单次上传
> 100MB: 分段上传
最大支持: 5TB
# 最小分片大小: 5MB
# AWS CLI 自动处理分段上传
aws s3 cp large-file.zip s3://bucket/
并行下载
# 使用 HTTP Range 头下载大文件的不同部分
# 然后并行下载,提高速度
S3 Transfer Acceleration
使用 CloudFront 边缘节点加速跨地域传输:
# 启用 Transfer Acceleration
aws s3api put-bucket-accelerate-configuration \
--bucket my-bucket \
--accelerate-configuration Status=Enabled
# 使用加速端点
aws s3 cp file.zip s3://my-bucket/ \
--endpoint-url https://my-bucket.s3-accelerate.amazonaws.com
# 费用:约等于 1-2 个月存储费用
生命周期策略
自动化存储类转换和对象删除:
{
"Rules": [
{
"ID": "ArchiveAndDelete",
"Status": "Enabled",
"Filter": { "Prefix": "logs/" },
"Transitions": [
{ "Days": 30, "StorageClass": "STANDARD_IA" },
{ "Days": 90, "StorageClass": "GLACIER" }
],
"Expiration": { "Days": 365 },
"NoncurrentVersionExpiration": { "NoncurrentDays": 30 },
"AbortIncompleteMultipartUpload": { "DaysAfterInitiation": 7 }
}
]
}
💡 重要: 设置 AbortIncompleteMultipartUpload 清理未完成的分段上传,否则会持续产生费用!
静态网站托管
# 启用静态网站托管
aws s3 website s3://my-bucket/ \
--index-document index.html \
--error-document error.html
⚠️ SSL 限制:
- S3 只在
*.s3.amazonaws.com域名支持 SSL - 自定义域名需要配合 CloudFront 使用
- CloudFront 可通过 ACM 提供免费 SSL 证书
数据一致性
理解 S3 的一致性模型至关重要:
| 操作 | 一致性 |
|---|---|
| 新对象创建 | Read-after-write(立即可读) |
| 对象覆盖/删除 | Eventual consistency(最终一致) |
| 列表操作 | Eventual consistency |
💡 最佳实践: 将 S3 对象视为不可变的(创建或删除,不更新),可大大简化代码逻辑。
⚠️ 常见陷阱
1. 数据传输费用
# S3 费用 = 存储 + 请求 + 传输
# 传输费用:
# 上传到 S3: 免费
# 同区域 EC2 → S3: 免费
# 跨区域: $0.02/GB
# 出 Internet: $0.09/GB
# 解决方案:使用 VPC 端点节省跨 VPC 费用
2. Glacier 取回费用
# Glacier 取回选项和费用
Expedited (1-5分钟): $0.03/GB + 请求费
Standard (3-5小时): $0.01/GB + 请求费
Bulk (5-12小时): $0.0025/GB + 请求费
# ⚠️ 大量小文件归档到 Glacier 可能比 S3 更贵!
3. 100 存储桶限制
之前每个账户只能创建 100 个存储桶,现在可以申请提高,但通常上限在 1000 左右。
4. 存储桶命名
# 存储桶名称全球唯一,删除后可能被他人占用
# 删除存储桶后,可能需要最多 10 小时才能重新创建同名存储桶
# ⚠️ 名称中带 '.' 会导致 SSL 证书不匹配
# 使用 '-' 代替 '.'
my-bucket-name ✅
my.bucket.name ❌ (SSL 问题)
5. 分段上传费用
未完成的分段上传会持续收取存储费用!务必配置生命周期规则自动清理。
6. ETag 不是 MD5
对于分段上传的文件,ETag 不是文件的 MD5 哈希。如需验证,需自行计算 MD5 并存储在自定义 metadata 中。
💡 专家技巧
S3 Select
直接在 S3 中查询 CSV/JSON 数据,无需下载整个文件:
SELECT * FROM s3object s
WHERE s.status = 'active'
LIMIT 100
事件通知
{
"LambdaFunctionConfigurations": [{
"LambdaFunctionArn": "arn:aws:lambda:...",
"Events": ["s3:ObjectCreated:*"],
"Filter": {
"Key": {
"FilterRules": [
{ "Name": "prefix", "Value": "uploads/" },
{ "Name": "suffix", "Value": ".jpg" }
]
}
}
}]
}
预签名 URL
import boto3
s3_client = boto3.client('s3')
# 生成预签名下载 URL (1小时有效)
url = s3_client.generate_presigned_url(
'get_object',
Params={'Bucket': 'my-bucket', 'Key': 'private/file.pdf'},
ExpiresIn=3600
)
# 生成预签名上传 URL
upload_url = s3_client.generate_presigned_url(
'put_object',
Params={'Bucket': 'my-bucket', 'Key': 'uploads/newfile.pdf'},
ExpiresIn=3600
)
跨区域复制
# 启用跨区域复制,用于:
# - 合规性(地理分布存储)
# - 降低延迟
# - 降低跨区域传输成本
aws s3api put-bucket-replication \
--bucket source-bucket \
--replication-configuration file://replication.json
VPC 端点
# 创建 S3 VPC 端点,避免通过 Internet 访问 S3
# 节省 NAT Gateway 数据传输费用
aws ec2 create-vpc-endpoint \
--vpc-id vpc-xxx \
--service-name com.amazonaws.ap-southeast-2.s3 \
--route-table-ids rtb-xxx
📚 本章小结
- S3 容量几乎无限,持久性极高(11个9)
- 正确配置权限是最重要的安全实践
- 根据访问模式选择合适的存储类
- 使用生命周期策略自动化存储管理
- 大文件使用分段上传
- 注意数据传输费用和 Glacier 取回费用
- 使用 VPC 端点节省 NAT Gateway 费用
- 默认阻止公开访问,启用加密和版本控制