mirror of
https://github.com/RhenCloud/Cloud-Index.git
synced 2025-12-06 15:26:10 +08:00
初始化文档
This commit is contained in:
478
docs/storage/s3.md
Normal file
478
docs/storage/s3.md
Normal file
@@ -0,0 +1,478 @@
|
||||
---
|
||||
title: Amazon S3
|
||||
createTime: 2025/11/09 00:26:55
|
||||
permalink: /storage/s3
|
||||
---
|
||||
# Amazon S3 配置指南
|
||||
|
||||
详细的 Amazon S3 配置步骤和最佳实践。
|
||||
|
||||
## 概述
|
||||
|
||||
Amazon S3(Simple Storage Service)是业界标准的对象存储服务,具有以下优势:
|
||||
|
||||
- 🏢 企业级服务
|
||||
- 🔐 最高的安全性
|
||||
- 📊 功能最完整
|
||||
- 🌍 全球可用
|
||||
- 📈 自动扩展
|
||||
|
||||
## 账户设置
|
||||
|
||||
### 1. 创建 AWS 账户
|
||||
|
||||
访问 [AWS 官网](https://aws.amazon.com/) 创建账户。新用户享受 12 个月免费套餐。
|
||||
|
||||
### 2. 访问 S3 控制台
|
||||
|
||||
1. 登录 AWS 管理控制台
|
||||
2. 搜索 "S3"
|
||||
3. 进入 S3 服务
|
||||
|
||||
## 创建存储桶
|
||||
|
||||
### 1. 创建新桶
|
||||
|
||||
1. 点击 "创建存储桶"
|
||||
2. 输入存储桶名称(例如 `my-cloud-storage`)
|
||||
- 名称必须全局唯一
|
||||
- 只能包含小写字母、数字、连字符和点
|
||||
3. 选择区域(例如 `ap-northeast-1` 东京)
|
||||
4. **ACL** - 保持默认(禁用)
|
||||
5. **阻止公有访问设置** - 根据需求配置(见下一步)
|
||||
6. 点击 "创建存储桶"
|
||||
|
||||
### 2. 配置公开访问(可选)
|
||||
|
||||
若要让文件可以公开访问:
|
||||
|
||||
1. 进入存储桶 → "权限"
|
||||
2. 找到 "阻止公有访问" 部分
|
||||
3. 点击 "编辑"
|
||||
4. **取消勾选** "阻止所有公有访问"
|
||||
5. 点击 "保存"
|
||||
|
||||
### 3. 启用 ACL(仅在需要时)
|
||||
|
||||
1. 进入存储桶 → "权限"
|
||||
2. 找到 "对象所有权" 部分
|
||||
3. 点击 "编辑"
|
||||
4. 选择 "ACL 已启用"
|
||||
5. 点击 "保存"
|
||||
|
||||
## 创建 IAM 用户和凭证
|
||||
|
||||
### 1. 创建 IAM 用户
|
||||
|
||||
使用 IAM 用户而不是根账户更安全:
|
||||
|
||||
1. 进入 IAM 控制台
|
||||
2. 左侧菜单 → "用户"
|
||||
3. 点击 "创建用户"
|
||||
4. 输入用户名(例如 `Cloud Index-user`)
|
||||
5. 点击 "创建用户"
|
||||
|
||||
### 2. 配置权限
|
||||
|
||||
#### 方式 A:使用托管策略(推荐)
|
||||
|
||||
1. 进入用户详情
|
||||
2. 点击 "添加权限" → "直接附加现有策略"
|
||||
3. 搜索 "AmazonS3FullAccess"
|
||||
4. 勾选并点击 "下一步"
|
||||
5. 点击 "添加权限"
|
||||
|
||||
#### 方式 B:使用自定义策略(更安全)
|
||||
|
||||
1. 进入用户详情
|
||||
2. 点击 "添加权限" → "创建内联策略"
|
||||
3. 选择 JSON
|
||||
4. 粘贴以下策略:
|
||||
|
||||
```json
|
||||
{
|
||||
"Version": "2012-10-17",
|
||||
"Statement": [
|
||||
{
|
||||
"Effect": "Allow",
|
||||
"Action": [
|
||||
"s3:ListAllMyBuckets",
|
||||
"s3:GetBucketLocation"
|
||||
],
|
||||
"Resource": "*"
|
||||
},
|
||||
{
|
||||
"Effect": "Allow",
|
||||
"Action": [
|
||||
"s3:ListBucket",
|
||||
"s3:GetObjectVersion",
|
||||
"s3:ListBucketVersions"
|
||||
],
|
||||
"Resource": "arn:aws:s3:::my-cloud-storage"
|
||||
},
|
||||
{
|
||||
"Effect": "Allow",
|
||||
"Action": [
|
||||
"s3:GetObject",
|
||||
"s3:PutObject",
|
||||
"s3:DeleteObject"
|
||||
],
|
||||
"Resource": "arn:aws:s3:::my-cloud-storage/*"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
5. 点击 "创建策略"
|
||||
|
||||
### 3. 创建访问密钥
|
||||
|
||||
1. 进入用户详情
|
||||
2. 点击 "安全凭证" 选项卡
|
||||
3. 向下滚动到 "访问密钥"
|
||||
4. 点击 "创建访问密钥"
|
||||
5. 选择 "其他"
|
||||
6. 点击 "下一步"
|
||||
7. 复制 **Access Key ID** 和 **Secret Access Key**
|
||||
8. 保存到安全位置
|
||||
|
||||
**⚠️ 重要**: 密钥只显示一次,请立即保存!
|
||||
|
||||
## 配置环境变量
|
||||
|
||||
编辑 `.env` 文件:
|
||||
|
||||
```env
|
||||
# 存储类型
|
||||
STORAGE_TYPE=s3
|
||||
|
||||
# AWS 凭证
|
||||
ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
|
||||
SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
|
||||
|
||||
# S3 配置
|
||||
S3_BUCKET_NAME=my-cloud-storage
|
||||
S3_REGION=ap-northeast-1
|
||||
|
||||
# 可选:公开访问配置
|
||||
S3_PUBLIC_URL=https://my-cloud-storage.s3.ap-northeast-1.amazonaws.com
|
||||
|
||||
# 可选:预签名 URL 过期时间(秒,默认 3600)
|
||||
S3_PRESIGN_EXPIRES=3600
|
||||
```
|
||||
|
||||
## 常用 AWS 区域
|
||||
|
||||
选择离你最近的区域以获得最佳性能:
|
||||
|
||||
| 区域代码 | 位置 | 说明 |
|
||||
|---------|------|------|
|
||||
| `us-east-1` | 美国东部(N. Virginia) | 美国 |
|
||||
| `us-west-2` | 美国西部(Oregon) | 美国西海岸 |
|
||||
| `eu-west-1` | 欧洲(Ireland) | 欧洲 |
|
||||
| `ap-northeast-1` | 亚太(Tokyo) | 日本、韩国 |
|
||||
| `ap-southeast-1` | 亚太(Singapore) | 东南亚 |
|
||||
| `cn-north-1` | 中国(北京) | 中国 |
|
||||
|
||||
## 配置公开访问 URL
|
||||
|
||||
### 方式 A:使用 S3 默认 URL
|
||||
|
||||
```env
|
||||
S3_PUBLIC_URL=https://bucket-name.s3.region.amazonaws.com
|
||||
```
|
||||
|
||||
### 方式 B:使用 CloudFront CDN
|
||||
|
||||
1. 进入 CloudFront 控制台
|
||||
2. 点击 "创建分配"
|
||||
3. 源域名:选择你的 S3 存储桶
|
||||
4. 其他设置保持默认
|
||||
5. 点击 "创建分配"
|
||||
6. 等待部署(约 15-20 分钟)
|
||||
7. 复制分配域名
|
||||
|
||||
配置环境变量:
|
||||
|
||||
```env
|
||||
S3_PUBLIC_URL=https://d123abc456.cloudfront.net
|
||||
```
|
||||
|
||||
### 方式 C:使用自定义域名
|
||||
|
||||
1. 使用 Route 53 或其他 DNS 服务
|
||||
2. 创建 CNAME 记录指向 S3 或 CloudFront
|
||||
3. 配置 SSL 证书
|
||||
|
||||
```env
|
||||
S3_PUBLIC_URL=https://assets.example.com
|
||||
```
|
||||
|
||||
## 启用 CORS(如需跨域请求)
|
||||
|
||||
1. 进入存储桶
|
||||
2. 点击 "权限"
|
||||
3. 向下滚动到 "CORS"
|
||||
4. 点击 "编辑"
|
||||
5. 粘贴以下配置:
|
||||
|
||||
```json
|
||||
[
|
||||
{
|
||||
"AllowedHeaders": ["*"],
|
||||
"AllowedMethods": ["GET", "PUT", "POST", "DELETE", "HEAD"],
|
||||
"AllowedOrigins": ["*"],
|
||||
"ExposeHeaders": ["ETag"]
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
6. 点击 "保存更改"
|
||||
|
||||
## 启用版本控制(可选)
|
||||
|
||||
1. 进入存储桶
|
||||
2. 点击 "属性"
|
||||
3. 找到 "版本控制"
|
||||
4. 点击 "编辑"
|
||||
5. 选择 "启用"
|
||||
6. 点击 "保存更改"
|
||||
|
||||
## 启用生命周期规则(自动清理)
|
||||
|
||||
自动删除过期文件以节省成本:
|
||||
|
||||
1. 进入存储桶
|
||||
2. 点击 "管理"
|
||||
3. 点击 "创建生命周期规则"
|
||||
4. 输入规则名称(例如 `delete-old-cache`)
|
||||
5. 配置规则:
|
||||
- **前缀**:可选(如 `cache/`)
|
||||
- **对象年龄**:30 天后删除
|
||||
- **过期对象删除标记**:勾选
|
||||
6. 点击 "创建规则"
|
||||
|
||||
## 测试连接
|
||||
|
||||
### 方式一:启动应用测试
|
||||
|
||||
```bash
|
||||
python app.py
|
||||
```
|
||||
|
||||
访问 `http://localhost:5000`,查看是否能正常显示文件列表。
|
||||
|
||||
### 方式二:使用 AWS CLI 测试
|
||||
|
||||
```bash
|
||||
# 安装 aws cli
|
||||
pip install awscli
|
||||
|
||||
# 配置凭证
|
||||
aws configure
|
||||
|
||||
# 输入以下信息:
|
||||
# AWS Access Key ID: AKIAIOSFODNN7EXAMPLE
|
||||
# AWS Secret Access Key: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
|
||||
# Default region: ap-northeast-1
|
||||
# Default output format: json
|
||||
|
||||
# 测试连接
|
||||
aws s3 ls s3://my-cloud-storage
|
||||
```
|
||||
|
||||
### 方式三:Python 测试
|
||||
|
||||
```python
|
||||
import boto3
|
||||
|
||||
s3 = boto3.client(
|
||||
's3',
|
||||
aws_access_key_id='AKIAIOSFODNN7EXAMPLE',
|
||||
aws_secret_access_key='wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY',
|
||||
region_name='ap-northeast-1'
|
||||
)
|
||||
|
||||
# 列出所有对象
|
||||
response = s3.list_objects_v2(Bucket='my-cloud-storage')
|
||||
for obj in response.get('Contents', []):
|
||||
print(obj['Key'])
|
||||
```
|
||||
|
||||
## 成本优化建议
|
||||
|
||||
### 1. 选择合适的存储类型
|
||||
|
||||
S3 提供多种存储类别:
|
||||
|
||||
| 类别 | 适用场景 | 成本 |
|
||||
|------|---------|------|
|
||||
| **S3 标准** | 经常访问的数据 | 💛 中等 |
|
||||
| **S3 智能分层** | 访问模式不确定 | 自动优化 |
|
||||
| **S3 标准-IA** | 不经常访问 | 💚 低 |
|
||||
| **Glacier** | 归档数据 | 🔥 极低 |
|
||||
|
||||
默认使用 S3 标准即可。
|
||||
|
||||
### 2. 启用生命周期规则
|
||||
|
||||
自动将旧文件迁移到更便宜的存储类:
|
||||
|
||||
```json
|
||||
{
|
||||
"Transitions": [
|
||||
{
|
||||
"Days": 90,
|
||||
"StorageClass": "GLACIER"
|
||||
}
|
||||
],
|
||||
"Expiration": {
|
||||
"Days": 180
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 3. 定期清理
|
||||
|
||||
1. 定期检查存储桶大小
|
||||
2. 删除不需要的文件
|
||||
3. 删除过期的版本
|
||||
|
||||
### 4. 监控成本
|
||||
|
||||
1. 进入 AWS 成本管理器
|
||||
2. 设置成本告警
|
||||
3. 定期审查费用
|
||||
|
||||
## 监控和管理
|
||||
|
||||
### 查看存储使用情况
|
||||
|
||||
1. 进入存储桶
|
||||
2. 点击 "指标"
|
||||
3. 可以看到:
|
||||
- 存储桶大小
|
||||
- 对象数量
|
||||
- 请求统计
|
||||
|
||||
### 启用访问日志
|
||||
|
||||
1. 进入存储桶 → "属性"
|
||||
2. 找到 "服务器访问日志"
|
||||
3. 点击 "编辑"
|
||||
4. 启用日志
|
||||
5. 指定目标存储桶和前缀
|
||||
6. 点击 "保存更改"
|
||||
|
||||
## 最佳实践
|
||||
|
||||
### 1. 安全性
|
||||
|
||||
- ✅ 使用 IAM 用户而非根账户
|
||||
- ✅ 使用最小权限原则
|
||||
- ✅ 定期轮换访问密钥
|
||||
- ✅ 启用 MFA(多因素认证)
|
||||
- ✅ 启用 CloudTrail 审计
|
||||
- ✅ 不要在代码中提交凭证
|
||||
|
||||
### 2. 性能
|
||||
|
||||
- ✅ 使用 CloudFront CDN
|
||||
- ✅ 启用传输加速(可选)
|
||||
- ✅ 选择适当的区域
|
||||
- ✅ 使用多部分上传(应用自动处理)
|
||||
|
||||
### 3. 可靠性
|
||||
|
||||
- ✅ 启用版本控制
|
||||
- ✅ 启用 MFA 删除保护
|
||||
- ✅ 启用服务器端加密
|
||||
- ✅ 定期备份
|
||||
|
||||
### 4. 成本控制
|
||||
|
||||
- ✅ 使用生命周期规则
|
||||
- ✅ 监控使用成本
|
||||
- ✅ 定期清理过期数据
|
||||
- ✅ 使用合适的存储类别
|
||||
|
||||
## 常见问题
|
||||
|
||||
### Q: 新用户有免费额度吗?
|
||||
|
||||
**A:** 是的!AWS 12 个月免费套餐包括:
|
||||
|
||||
- 5GB S3 存储
|
||||
- 20,000 GET 请求
|
||||
- 2,000 PUT 请求
|
||||
|
||||
之后按使用量计费。
|
||||
|
||||
### Q: 月费大概多少?
|
||||
|
||||
**A:** 取决于使用量。示例:
|
||||
|
||||
- 存储 100GB:~$2.30
|
||||
- 请求 1M:~$0.50
|
||||
- 流量 100GB:~$0.92
|
||||
- **总计**:~$3.72/月
|
||||
|
||||
### Q: 如何降低成本?
|
||||
|
||||
**A:**
|
||||
|
||||
1. 使用 S3 标准-IA(便宜 50%)
|
||||
2. 启用生命周期规则
|
||||
3. 压缩文件
|
||||
4. 使用 CloudFront CDN(减少 S3 请求)
|
||||
|
||||
### Q: 如何处理大文件上传?
|
||||
|
||||
**A:** S3 支持:
|
||||
|
||||
- 单个对象最大 5TB
|
||||
- 应用自动使用多部分上传
|
||||
- 没有大小限制
|
||||
|
||||
## 故障排除
|
||||
|
||||
### 连接失败
|
||||
|
||||
检查:
|
||||
|
||||
1. Access Key 和 Secret Key 是否正确
|
||||
2. 区域代码是否正确
|
||||
3. 存储桶名称是否正确
|
||||
4. IAM 用户是否有 S3 权限
|
||||
5. 网络连接是否正常
|
||||
|
||||
### 上传失败
|
||||
|
||||
检查:
|
||||
|
||||
1. IAM 用户是否有 `s3:PutObject` 权限
|
||||
2. 存储桶是否存在
|
||||
3. 文件名是否有效
|
||||
4. 磁盘空间是否充足
|
||||
|
||||
### 公开文件无法访问
|
||||
|
||||
检查:
|
||||
|
||||
1. 是否启用了公开访问
|
||||
2. 是否配置了正确的 URL
|
||||
3. 是否启用了 CORS
|
||||
4. CloudFront 是否正常工作
|
||||
|
||||
## 获取帮助
|
||||
|
||||
- 📖 [AWS S3 官方文档](https://docs.aws.amazon.com/s3/)
|
||||
- 📖 [AWS SDK for Python 文档](https://boto3.amazonaws.com/v1/documentation/api/latest/index.html)
|
||||
- 🐛 [提交 Issue](https://github.com/RhenCloud/Cloud-Index/issues>)
|
||||
- 💬 [讨论区](https://github.com/RhenCloud/Cloud-Index/discussions)
|
||||
|
||||
## 下一步
|
||||
|
||||
- 🚀 [快速开始](../guide/quickstart.md) - 开始使用应用
|
||||
- 📖 [存储后端对比](./overview.md) - 对比其他服务
|
||||
- 💾 [Cloudflare R2 配置](./r2.md) - R2 配置指南
|
||||
Reference in New Issue
Block a user