核心摘要
- 通过OAC(Origin Access Control)机制,S3存储桶无需设置Public即可对外提供静态网站服务
- 每个独立域名(包括www子域名)需要配置独立的S3存储桶和CloudFront发布点
- 根目录默认页通过CloudFront的Default root object设置,子目录默认页需借助CloudFront Function实现
- SSL证书需区分根域名与通配符证书,二级子域名证书无法用于根域名
CloudFront+S3静态网站托管配置指南:OAC安全架构实践
一、传统S3静态网站托管的安全困境
AWS S3原生的静态网站托管功能要求存储桶必须设置为Public状态,这在企业环境中会带来显著的安全风险。大多数企业安全团队会在账户级别启用Block Public Access策略,禁止任何存储桶公开访问。这一安全要求与S3静态网站托管的公开需求形成了直接冲突。
从架构设计角度,我建议采用CloudFront + OAC方案来解决这一矛盾。该方案的核心优势在于:
- S3存储桶保持私有状态,符合企业安全合规要求
- CloudFront通过OAC策略获得对S3的访问授权
- 借助CloudFront的全球边缘节点提升访问性能
- 支持自定义域名和HTTPS加密传输
二、多域名场景的架构规划
在实际部署中,一个完整的网站通常涉及多个域名。以abc.com为例,典型的配置需求包括:
- www.abc.com:主站点,需要独立的S3存储桶和CloudFront发布点
- us.abc.com:区域子站点,同样需要独立配置
- abc.com:根域名,通常配置为自动跳转至www子域名
需要特别注意的是,www.abc.com本质上也是二级子域名,与根域名abc.com是完全独立的配置单元。
三、S3存储桶创建与安全配置
3.1 创建私有存储桶
与传统S3静态网站托管不同,使用CloudFront方案时存储桶命名没有特殊限制。创建时需确认以下配置:
- Bucket type:选择General Purpose通用型
- Object Ownership:选择ACLs disabled
- Block Public Access:保持全部勾选状态
存储桶的Region选择应考虑主要用户群体的地理位置,虽然CloudFront会在全球缓存内容,但源站位置仍会影响首次请求和缓存刷新的延迟。
四、CloudFront发布点配置详解
4.1 创建发布点
在CloudFront控制台创建发布点时,关键配置步骤如下:
步骤一:基础信息配置
- Distribution type选择标准Distribution
- Custom domain填写目标域名(如www.abc.com)
- 若域名非Route53托管,点击Skip domain setup跳过验证
步骤二:源站配置
- Origin type选择S3存储桶
- Origin path留空(除非网站文件位于子目录)
- Settings选择Allow private S3 bucket access to CloudFront – Recommended
这一设置将自动创建OAC策略,CloudFront会生成必要的S3 Bucket Policy,无需手动配置IAM权限。
4.2 SSL证书配置要点
在ACM中申请证书时需注意证书类型的区别:
- 根域名证书:仅适用于abc.com
- 通配符证书:*.abc.com可覆盖所有二级子域名
- 二级子域名证书无法用于根域名
实践建议:申请证书时同时包含根域名和通配符,即在同一证书中添加abc.com和*.abc.com两个域名。
4.3 域名解析配置
发布点创建完成后,需要将域名CNAME指向CloudFront分配的域名:
记录类型: CNAME
主机记录: www
记录值: d3xxxxxxx.cloudfront.net
TTL: 300
若使用Route53,可创建Alias记录直接指向CloudFront发布点,这种方式无需CNAME且支持根域名解析。
五、默认页配置策略
5.1 根目录默认页
CloudFront默认不会自动查找目录下的index文件。需要在发布点设置中配置Default root object:
- 进入发布点编辑页面
- 找到Default root object字段
- 填入index.html(或您的默认页文件名)
此配置仅对根目录生效,访问https://www.abc.com/时会自动返回index.html内容。
5.2 子目录默认页跳转
对于子目录(如/dir1/)的默认页需求,必须使用CloudFront Function实现URL重写。这是因为CloudFront的Default root object设置不会递归应用到子目录。
创建CloudFront Function的步骤:
- 进入CloudFront控制台左侧Functions菜单
- 点击Create function创建新函数
- 编写URL重写逻辑,将目录请求重定向至对应的index.html
- 将函数关联到发布点的Viewer Request事件
典型的CloudFront Function代码示例:
function handler(event) {
var request = event.request;
var uri = request.uri;
// 检查URI是否以/结尾或不包含文件扩展名
if (uri.endsWith('/')) {
request.uri += 'index.html';
} else if (!uri.includes('.')) {
request.uri += '/index.html';
}
return request;
}
六、架构优化建议
基于生产环境的实践经验,我建议在基础配置之上考虑以下优化:
- 缓存策略优化:为静态资源(CSS/JS/图片)配置较长的TTL,HTML文件使用较短TTL以便及时更新
- 压缩配置:启用CloudFront的自动压缩功能,减少传输数据量
- 错误页面定制:配置自定义的404和403错误页面,提升用户体验
- 日志与监控:启用CloudFront访问日志,配合CloudWatch进行性能监控
需要优化您的 AWS 架构? 如果您正在规划企业级静态网站托管方案,或需要在安全合规与业务需求之间寻找平衡,欢迎与我们的AWS架构专家团队深入探讨CloudFront+S3的最佳实践方案。
AWS USDT代付 | Payment 解决方案