Files
Cloud-Index/docs/storage/s3.md
2025-11-09 14:21:55 +08:00

479 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: Amazon S3
createTime: 2025/11/09 00:26:55
permalink: /storage/s3
---
# Amazon S3 配置指南
详细的 Amazon S3 配置步骤和最佳实践。
## 概述
Amazon S3Simple 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 配置指南