AWS代付、代实名
阿里云国际 | 腾讯云国际

CloudFront+S3静态网站托管配置指南:OAC安全架构实践

核心摘要

  • 通过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的步骤:

  1. 进入CloudFront控制台左侧Functions菜单
  2. 点击Create function创建新函数
  3. 编写URL重写逻辑,将目录请求重定向至对应的index.html
  4. 将函数关联到发布点的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的最佳实践方案。

点击联系客服Telegram
赞(0)
未经允许不得转载:AWS USDT代付 | Payment 解决方案 » CloudFront+S3静态网站托管配置指南:OAC安全架构实践

AWS代付、代充值免实名

联系我们阿里云国际免实名