亚马逊AWS官方博客

中国区部署 Web 前端到 S3 和 Cloudfront

现代应用通常采用前、后端分离的架构,分离后的前端应用通常以 HTML + CSS + Javascript 的形式存在,通过 HTTP 服务器将这些静态资源提供给用户的浏览器,并在其中运行,再配合后端各个微服务面向前端的 API 动态加载数据组成应用的整体。虽然 HTTP 服务器可以提供前端应用的静态资源,但是为了更快的加载速度和更好的使用体验,现在,静态资源几乎都会使用 CDN(内容分发网络)进行分发。这样既可以减轻 HTTP 服务器的压力,又可以加快前端应用的加载速度,还可以在全球不同地点提供几乎一致的使用体验。在 AWS 上,Amazon S3 可以直接通过 HTTP 协议对外提供资源,节省了 HTTP 服务器的成本,配合 CDN 服务 CloudFront 即可实现前端应用的快速部署。

Amazon S3 是 AWS 上使用最为广泛的对象存储服务,支持直接将存储在 S3 数据桶的 HTML、CSS、Javascript 等资源通过 HTTP 协议对外暴露,让用户可以直接通过 S3 获取到前端应用。Amazon CloudFront 是 AWS 上的 CDN 服务,它可以将 S3 设置为分发的对象,将 S3 上的资源通过 AWS 分布在世界各地的边缘节点将内容提供给用户。同时,CloudFront 还提供了 S3 不支持的 HTTPS 协议,让前端应用更加安全。然而由于中国区的一些特殊情况,在此使用 S3 + CloudFront 需要一些不同于 Global 的额外配置,下文将详细描述操作步骤,帮助有需要的人在 AWS 中国区优雅地部署前端应用。

1. 建立 S3 数据桶

注意:需要设置阻止公开访问。

2. 建立 Route 53

红框内输入以备案的域名。

3. 建立 CloudFront 分配

源选择存放前端资源的 S3 桶,桶中如果没有子文件夹则留空源路径输入框。来源访问选择“遗留访问身份”,点击“建立新的 OAI”,下面选择“否,我将更新存储桶策略”。

在备用域名中添加刚才在 Route 53 添加的域名,默认根对象填写 index.html (根 HTML 文件文件名)。

建立完成后,进入“源”标签页,记下表格中 Origin access 的值,如图红框所示。

4. 更新 S3 桶策略并保存

代码如下(替换下面纯大写字符串):

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws-cn:iam::cloudfront:user/CloudFront Origin Access Identity {$ORIGIN_ACCESS_ID}"
            },
            "Action": "s3:GetObject",
            "Resource": “BUCKET_ARN/*"
        }
    ]
}

5. 回到 Route 53 增加别名

如果实用子域名则需要新增 CNAME 记录,并在 CloudFront 的备用域名中输入该记录的完整域名。

全部完成后,等待片刻即可去设定的域名测试效果。

总结

由于中国区和全球区的不同,以及 ICP 备案的要求,导致在国内使用 S3 + CloudFront 部署前端应用需要更多的额外设置。相信本文可以帮助大家顺利使用在 AWS 部署前端应用的最佳实践,降低部署和维护前端应用的成本。

本篇作者

汪靖涵

AWS 前端工程师,负责 AWS Professional Service 项目的前端架构设计和实施。对现代前端各种方向均有涉猎,帮助客户解决数字化转型,应用现代化,和上云过程中前端相关的问题。同时对于云场景的前端工程化,和应用云能力赋能前端开发有深入研究。

许和风

AWS 云原生应用工程师,负责基于 AWS 的云计算方案架构的设计和实施。对公有云、DevOps、微服务、容器化、Serverless、全栈开发等有深入的研究,同时致力于推广云原生应用,帮助客户利用云原生来实现业务需求。

刘红雨

云原生应用工程师,负责基于AWS的云计算方案架构的设计和实施开发。拥有丰富的互联网产品的开发经验,负责多个项目的搜索功能的设计和开发,熟悉搜索的性能优化,对公有云、机器学习、DevOps、基于云原生的微服务架构、敏捷加速研发效能等有深入的研究和热情。