AWS S3 对象存储完整教程:从入门到生产环境

📅 2026-06-30

Amazon S3(Simple Storage Service) 是 AWS 最核心的服务之一,也是全球最流行的对象存储方案。从静态网站托管到数据备份、从图片存储到大数据湖,S3 几乎无所不能。本文从零开始,教你掌握 S3 的核心用法。

什么是 S3

S3 不是传统的文件系统,而是一个对象存储服务。核心概念:

| 概念 | 说明 | |------|------| | Bucket(存储桶) | 存放数据的容器,类似"根目录" | | Object(对象) | 存储的文件,包含数据和元数据 | | Key(键) | 对象的唯一标识符,类似"文件路径" | | Region(区域) | Bucket 所在的地理位置 |

第一步:创建 S3 Bucket

1. 登录 AWS 控制台 → S3 2. 点击 Create bucket 3. 输入 Bucket 名称(全球唯一) 4. 选择 AWS 区域(靠近用户的位置) 5. 配置权限(新手选"阻止所有公开访问") 6. 点击创建

`bash

AWS CLI 创建 Bucket

aws s3 mb s3://my-unique-bucket-name --region ap-southeast-1 `

第二步:上传文件

通过控制台上传

S3 控制台 → 点击 Bucket → Upload → 选择文件 → Upload

通过 AWS CLI 上传

`bash

上传单个文件

aws s3 cp image.jpg s3://my-bucket/images/

上传整个目录

aws s3 cp ./website/ s3://my-bucket/ --recursive

同步(增量上传)

aws s3 sync ./website/ s3://my-bucket/ `

通过编程语言上传(Python)

`python import boto3

s3 = boto3.client('s3') s3.upload_file( 'local-image.jpg', # 本地文件路径 'my-bucket', # Bucket 名称 'photos/image.jpg' # S3 对象键 ) `

第三步:访问控制

S3 访问的四种方式

| 方式 | 适用场景 | |------|---------| | 公开访问 | 静态网站、公共资源 | | 预签名 URL | 临时分享文件 | | IAM 策略 | EC2/Lambda 内部访问 | | Bucket 策略 | 细粒度权限控制 |

生成预签名 URL(Python)

`python import boto3 from botocore.config import Config

s3 = boto3.client('s3', config=Config(signature_version='s3v4')) url = s3.generate_presigned_url( 'get_object', Params={'Bucket': 'my-bucket', 'Key': 'private/file.pdf'}, ExpiresIn=3600 # 1 小时后过期 ) print(url) `

> 预签名 URL 非常适合需要临时分享文件给特定用户的场景。

第四步:存储类型选择

S3 提供多种存储类,按数据访问频率选择可以大幅降低成本:

| 存储类 | 价格(/GB/月) | 适用场景 | |--------|:---:|------| | S3 Standard | $0.023 | 频繁访问的热数据 | | S3 Intelligent-Tiering | $0.023 | 访问模式不明确 | | S3 Standard-IA | $0.0125 | 不常访问,但需快速取回 | | S3 One Zone-IA | $0.01 | 可丢失的副本数据 | | S3 Glacier Instant | $0.004 | 季度访问的归档数据 | | S3 Glacier Deep Archive | $0.00099 | 年度访问的长期归档 |

> ⚠️ IA 和 Glacier 类有 最低存储 30 天取回费用,不适合频繁读写的数据。

第五步:生命周期管理

自动将旧数据转移到更便宜的存储类:

`json { "Rules": [ { "Id": "Move to IA after 30 days", "Status": "Enabled", "Transitions": [ { "DaysAfterCreation": 30, "StorageClass": "STANDARD_IA" }, { "DaysAfterCreation": 90, "StorageClass": "GLACIER" } ], "Expiration": { "DaysAfterCreation": 365 } } ] } `

配置后,数据会自动流转:Standard → 30天后 → IA → 90天后 → Glacier → 365天后 → 删除

第六步:静态网站托管

S3 可以直接托管静态网站(HTML/CSS/JS):

1. 进入 Bucket → PropertiesStatic website hosting 2. 启用,设置 Index document 为 index.html 3. 设置 Error document 为 error.html(可选) 4. 在 Permissions 中添加 Bucket Policy 允许公开读取:

`json { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::my-website-bucket/*" } ] } `

> 💡 配合 CloudFront CDN + Route 53 域名 + ACM SSL 证书,可以实现全球加速的 HTTPS 静态网站。

第七步:S3 成本优化

省钱六招

| 策略 | 预期节省 | |------|:---:| | 启用 Intelligent-Tiering | 20-40% | | 设置生命周期规则 | 30-60% | | 压缩文件后上传 | 按压缩比 | | 清理未完成的分段上传 | 避免隐藏费用 | | 使用 S3 Storage Lens 分析 | 发现浪费 | | 避免跨区域复制(非必要) | 省传输费 |

常见问题 FAQ

Q:S3 和 EBS 有什么区别?

| 对比 | S3 | EBS | |------|:---|:---| | 类型 | 对象存储 | 块存储 | | 访问方式 | HTTP/API | 挂载到 EC2 | | 跨 AZ | 自动冗余 | 单 AZ | | 用途 | 文件/图片/备份 | 数据库/系统盘 |

Q:S3 Bucket 名称为什么必须全球唯一? A:S3 的 URL 是 https://bucket-name.s3.region.amazonaws.com,Bucket 名称在 URL 中,所以必须全局唯一。

Q:最大能存多大的文件? A:单个对象最大 5TB,通过分片上传可以存储任意大小的文件。

总结

S3 是 AWS 平台最基础的存储服务,掌握它可以:

- ✅ 托管静态网站,月费不到 $1 - ✅ 存储海量文件,11个9的持久性(99.999999999%) - ✅ 配合生命周期策略,大幅降低存储成本 - ✅ 配合 CloudFront CDN 实现全球加速 - ✅ 作为数据库备份、日志归档的可靠目标

---

本文由 ChengziCloud 整理。需要云服务方案?联系我们 获取技术支持。