--- 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 配置指南