AWS S3 对象存储完整教程:从入门到生产环境
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 → Properties → Static 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 整理。需要云服务方案?联系我们 获取技术支持。