S3基础 #
一、S3概述 #
1.1 什么是S3 #
Amazon S3(Simple Storage Service)是AWS提供的对象存储服务,提供业界领先的可扩展性、数据可用性、安全性和性能。
1.2 S3核心特性 #
text
S3核心特性:
├── 无限存储
│ └── 存储任意数量的对象
│ └── 单个对象最大5TB
│
├── 高可用性
│ └── 99.99%可用性
│ └── 跨多个设施冗余存储
│
├── 高耐久性
│ └── 99.999999999%(11个9)
│ └── 设计可承受两个设施同时故障
│
├── 安全性
│ └── 多种访问控制方式
│ └── 支持加密
│
├── 可扩展性
│ └── 自动扩展
│ └── 无需预置容量
│
└── 多种存储类别
└── 根据访问模式选择
1.3 S3使用场景 #
| 场景 | 说明 |
|---|---|
| 数据湖 | 存储原始数据用于分析 |
| 备份与归档 | 长期数据存储 |
| 静态网站托管 | 托管静态网站 |
| 应用数据存储 | 应用程序数据存储 |
| 媒体存储 | 图片、视频等媒体文件 |
| 软件分发 | 软件包分发 |
二、S3核心概念 #
2.1 存储桶(Bucket) #
text
存储桶特点:
├── 对象的容器
├── 全局唯一名称
├── 创建在特定区域
├── 每个账户最多100个(可提升)
└── 无存储限制
存储桶命名规则 #
text
命名规则:
├── 3-63个字符
├── 只能包含小写字母、数字、点、连字符
├── 必须以字母或数字开头和结尾
├── 不能使用IP地址格式
├── 不能以xn--开头
├── 不能以-s3alias结尾
└── 必须全局唯一
2.2 对象(Object) #
text
对象组成:
├── 键(Key)
│ └── 对象的唯一标识符
│ └── 类似文件路径
│
├── 值(Value)
│ └── 实际数据内容
│ └── 最大5TB
│
├── 版本ID
│ └── 启用版本控制后
│
├── 元数据
│ ├── 系统元数据
│ └── 用户定义元数据
│
├── 子资源
│ ├── ACL
│ └── Torrent
│
└── 标签
└── 用于管理和筛选
2.3 存储类别 #
text
S3存储类别:
├── S3 Standard
│ └── 频繁访问的数据
│ └── 默认存储类别
│
├── S3 Intelligent-Tiering
│ └── 自动优化存储成本
│ └── 适合访问模式不确定的数据
│
├── S3 Standard-IA
│ └── 不频繁访问的数据
│ └── 最小存储30天
│
├── S3 One Zone-IA
│ └── 不频繁访问的数据
│ └── 单可用区存储
│
├── S3 Glacier Instant Retrieval
│ └── 归档数据,即时检索
│
├── S3 Glacier Flexible Retrieval
│ └── 归档数据,灵活检索
│ └── 检索时间1-5小时
│
└── S3 Glacier Deep Archive
└── 长期归档
└── 检索时间12-48小时
2.4 存储类别对比 #
| 存储类别 | 可用性 | 耐久性 | 最小存储 | 检索时间 | 适用场景 |
|---|---|---|---|---|---|
| Standard | 99.99% | 99.999999999% | 无 | 即时 | 频繁访问 |
| Intelligent-Tiering | 99.9% | 99.999999999% | 无 | 即时 | 访问模式不确定 |
| Standard-IA | 99.9% | 99.999999999% | 30天 | 即时 | 不频繁访问 |
| One Zone-IA | 99.5% | 99.999999999% | 30天 | 即时 | 可重建数据 |
| Glacier Instant | 99.9% | 99.999999999% | 90天 | 即时 | 归档即时检索 |
| Glacier Flexible | 99.99% | 99.999999999% | 90天 | 1-5小时 | 归档 |
| Deep Archive | 99.99% | 99.999999999% | 180天 | 12-48小时 | 长期归档 |
三、创建存储桶 #
3.1 通过控制台创建 #
text
创建存储桶步骤:
├── 第一步:基本信息
│ ├── 存储桶名称(全局唯一)
│ └── AWS区域
│
├── 第二步:配置选项
│ ├── 阻止公有访问设置
│ ├── 存储桶版本控制
│ ├── 标签
│ └── 默认加密
│
├── 第三步:设置权限
│ ├── 阻止公有访问
│ ├── ACL设置
│ └── 存储桶策略
│
└── 第四步:审核创建
3.2 通过CLI创建 #
bash
aws s3api create-bucket \
--bucket my-unique-bucket-name \
--region us-east-1
3.3 存储桶配置 #
版本控制 #
text
版本控制:
├── 保留对象的多个版本
├── 可防止意外删除
├── 可恢复到之前版本
└── 一旦启用无法完全禁用
默认加密 #
text
加密选项:
├── SSE-S3
│ └── Amazon管理的密钥
│
├── SSE-KMS
│ └── KMS管理的密钥
│
└── SSE-C
└── 客户提供的密钥
四、对象操作 #
4.1 上传对象 #
通过控制台上传 #
text
上传步骤:
├── 选择存储桶
├── 点击"上传"
├── 添加文件
├── 设置属性
│ ├── 存储类别
│ ├── 加密
│ ├── 元数据
│ └── 标签
└── 上传
通过CLI上传 #
bash
aws s3 cp local-file.txt s3://my-bucket/
aws s3 sync ./local-folder s3://my-bucket/folder/
aws s3api put-object \
--bucket my-bucket \
--key uploads/file.txt \
--body local-file.txt
4.2 下载对象 #
bash
aws s3 cp s3://my-bucket/file.txt ./local-file.txt
aws s3 sync s3://my-bucket/folder/ ./local-folder/
aws s3api get-object \
--bucket my-bucket \
--key uploads/file.txt \
local-file.txt
4.3 列出对象 #
bash
aws s3 ls s3://my-bucket/
aws s3 ls s3://my-bucket/folder/ --recursive
aws s3api list-objects-v2 --bucket my-bucket
4.4 删除对象 #
bash
aws s3 rm s3://my-bucket/file.txt
aws s3 rm s3://my-bucket/folder/ --recursive
aws s3api delete-object \
--bucket my-bucket \
--key file.txt
4.5 删除存储桶 #
bash
aws s3 rb s3://my-bucket --force
五、访问控制 #
5.1 阻止公有访问 #
text
阻止公有访问设置:
├── 新存储桶默认启用
├── 四个级别:
│ ├── 新存储桶
│ ├── 新对象
│ ├── 任何存储桶
│ └── 任何对象
└── 可在账户或存储桶级别配置
5.2 存储桶策略 #
存储桶策略是JSON格式的访问控制:
json
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadGetObject",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my-bucket/*"
}
]
}
常用策略示例 #
限制特定IP访问:
json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my-bucket/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "192.0.2.0/24"
}
}
}
]
}
强制SSL访问:
json
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ForceSSL",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": "arn:aws:s3:::my-bucket/*",
"Condition": {
"Bool": {
"aws:SecureTransport": "false"
}
}
}
]
}
5.3 ACL(访问控制列表) #
text
ACL类型:
├── 私有(private)
│ └── 只有所有者可访问
│
├── 公共读(public-read)
│ └── 所有人可读
│
├── 公共读写(public-read-write)
│ └── 所有人可读写
│
└── 认证用户读(authenticated-read)
└── 认证用户可读
5.4 IAM策略 #
json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Resource": "arn:aws:s3:::my-bucket/*"
}
]
}
5.5 预签名URL #
生成临时访问链接:
bash
aws s3 presign s3://my-bucket/private-file.txt --expires-in 3600
python
import boto3
s3_client = boto3.client('s3')
url = s3_client.generate_presigned_url(
'get_object',
Params={'Bucket': 'my-bucket', 'Key': 'private-file.txt'},
ExpiresIn=3600
)
print(url)
六、S3静态网站托管 #
6.1 启用静态网站 #
text
配置步骤:
├── 存储桶属性
├── 静态网站托管
├── 启用
├── 设置索引文档(index.html)
├── 设置错误文档(可选)
└── 保存
6.2 网站配置 #
xml
<WebsiteConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<IndexDocument>
<Suffix>index.html</Suffix>
</IndexDocument>
<ErrorDocument>
<Key>error.html</Key>
</ErrorDocument>
</WebsiteConfiguration>
6.3 网站端点 #
text
网站端点格式:
├── http://bucket-name.s3-website-region.amazonaws.com
└── http://bucket-name.s3-website.region.amazonaws.com
6.4 示例网站 #
html
<!DOCTYPE html>
<html>
<head>
<title>My S3 Website</title>
</head>
<body>
<h1>Hello from S3!</h1>
<p>This is a static website hosted on S3.</p>
</body>
</html>
七、S3最佳实践 #
7.1 安全最佳实践 #
text
安全建议:
├── 启用阻止公有访问
├── 使用存储桶策略而非ACL
├── 启用服务器端加密
├── 启用版本控制
├── 启用访问日志
├── 使用预签名URL而非公开访问
└── 定期审计权限
7.2 性能优化 #
text
性能建议:
├── 使用多部分上传大文件
├── 使用S3 Transfer Acceleration
├── 并行上传
├── 合理命名前缀
└── 选择合适的存储类别
7.3 成本优化 #
text
成本优化建议:
├── 选择合适的存储类别
├── 使用生命周期策略
├── 启用Intelligent-Tiering
├── 删除不需要的对象版本
├── 使用S3 Storage Lens分析
└── 监控存储使用情况
八、S3限制 #
8.1 配额限制 #
| 限制项 | 配额 |
|---|---|
| 存储桶数量 | 每账户100个(可提升) |
| 对象大小 | 最大5TB |
| 单次上传 | 最大5GB |
| 多部分上传 | 每部分5MB-5GB |
| 键长度 | 最大1024字节 |
九、小结 #
本章介绍了S3基础:
| 内容 | 要点 |
|---|---|
| S3概念 | 对象存储、无限容量、高可用 |
| 存储桶 | 对象容器、全局唯一名称 |
| 对象 | 键值对、元数据、版本控制 |
| 存储类别 | Standard、IA、Glacier等 |
| 访问控制 | 存储桶策略、ACL、IAM |
下一步学习 #
了解S3基础后,接下来可以:
- S3高级特性 - 学习版本控制、生命周期等
- CloudFront CDN - 配合CDN使用
- Lambda无服务器 - S3触发Lambda
最后更新:2026-03-28