第 3 章

S3 实战指南

⏱️ 40 分钟
📝 20 题练习
备考助手

📌 核心知识点

存储类选择生命周期策略数据传输优化安全最佳实践

S3 实战指南

📖 S3 基础知识

Amazon S3 (Simple Storage Service) 是 AWS 的标准云存储服务,提供几乎无限容量的对象存储。

📒 官方文档开发者指南FAQ定价

🖼️ S3 图解补充

S3 生命周期转储路径(AWS 官方)

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

AWS 数据传输费用

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

IAM 策略生效逻辑(AWS 官方)

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

IAM Permission Boundary 作用范围(AWS 官方)

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

成本分配标签示例(AWS 官方)

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

成本分配报表示例(AWS 官方)

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

ECS 通过 VPC Endpoint 访问 AWS 服务(AWS 官方)

看图重点:私网访问 S3 时建议走 Endpoint 路径,减少公网暴露与绕行。

S3 是什么?

S3 可以存储任意数量的文件,每个文件从 0 到 5TB。对于大多数实际用途,您可以认为 S3 的容量是无限的,无论是文件总大小还是对象数量。客户通常会存储数百万个对象。

S3 结构
├── 存储桶 (Bucket) - 全球唯一名称
│   ├── 对象 (Object) - 文件 + 元数据
│   │   ├── Key - 对象路径/名称
│   │   ├── Value - 文件内容 (最大 5TB)
│   │   ├── Version ID - 版本标识
│   │   └── Metadata - 元数据(类似 HTTP 头)
│   └── 前缀 (Prefix) - 虚拟文件夹
└── 区域 (Region) - 存储桶所在区域

S3 一致性模型(AWS 官方)

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

S3 更新后读取一致性(AWS 官方)

看图重点:对象更新后读取行为直接影响缓存刷新和数据可见性策略。

S3 URI 格式:

s3://bucket-name/path/to/key
# 其中 key 是 'path/to/key'

S3 vs 其他存储服务

服务类型特点适用场景
S3对象存储无限容量,高持久性静态文件、备份、数据湖
EBS块存储挂载到单个 EC2数据库、文件系统
EFS网络文件系统多 EC2 共享共享存储
Glacier归档存储低成本,慢访问长期归档

存储类详解

存储类持久性可用性 SLA最小存储适用场景
Standard11个999.9%频繁访问的数据
Intelligent-Tiering11个999.9%访问模式不确定
Standard-IA11个999%30天不频繁访问,需快速取回
One Zone-IA11个999%30天非关键、可重建的数据
Glacier Instant11个999.9%90天归档,需毫秒级访问
Glacier Flexible11个9-90天归档,分钟到小时级
Glacier Deep Archive11个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 配置不当导致数据泄露。正确管理权限至关重要!

三种权限机制:

  1. IAM Policies - 控制用户/角色对 S3 操作的访问
  2. Bucket Policies - 控制对整个存储桶的访问(如公开网站托管、IP 限制)
  3. 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 费用
  • 默认阻止公开访问,启用加密和版本控制
📝 章节练习 (20 题)
开始练习