亚马逊AWS官方博客

Amazon CloudFront 部署小指南(一)- 快速构建 CDN 内容分发

内容简介

此指南适用于初步接触亚马逊云科技 CloudFront 服务,并期望着手构建内容分发加速的技术伙伴。

本文分为五个步骤为您讲述如何创建使用 CloudFront 进行内容加速的最小架构示例。

步骤一:创建存放内容的 S3 桶

步骤二:创建 CloudFront 基础配置

步骤三:测试并使用 Rroute53 进行加速域名接入

步骤四:CloudFront Metrics 查看及告警设置

步骤五:启用 CloudFront 日志并存入 S3 存储桶进行备份

通过本指南,您将学会如何使用 CloudFront,快速构建一个内容分发网络,并展示分发效果。

下面就让我们开始分五个步骤完成一个 CloudFront 加速的静态网站的搭建工作。本篇文章完成的内容加速的最小架构图示如下:

什么是亚马逊云科技 CloudFront?

CloudFront 是亚马逊云科技提供的一项内容分发网络(CDN)服务。是一种将数据和内容分发到全球各地的网络系统,以提供更快、更可靠的用户访问体验。

CloudFront 的目标是将内容靠近最终用户,从而减少延迟时间和网络拥塞,提供快速的内容传递。它通过在全球各地的边缘位置(Edge Location)部署服务器节点,将数据缓存到离用户更近的位置,并在用户请求内容时从最接近用户的边缘位置提供响应,以提供更快的响应时间。

CloudFront 支持各种类型的内容,包括静态和动态的 Web 内容、视频和音频流、应用程序加速和安全性功能等。它还提供多种功能,如内容压缩、SSL/TLS 加密、访问控制、日志记录和报告等。

使用 CloudFront 可以帮助网站和应用程序提供高速、高可用性和安全的内容传递服务,同时减轻源服务器的负载压力。它还提供与其他 AWS 服务的无缝集成,如 S3 存储桶、EC2 实例和 Lambda 函数等。

步骤一:构建存放内容的 S3 桶

AWS S3(Amazon Simple Storage Service)是亚马逊云科技提供的一种可扩展的对象存储服务。它允许开发人员以安全且可靠的方式存储和检索大量数据。

CloudFront 支持分发其他云厂商的对象存储内容或是第三方的源站,值得一提的是,在亚马逊云科技的网络中,CloudFront 与 S3 之间通过骨干网进行数据交互,结合使用 CloudFront 以及 S3,可为您提供更低成本以及更好的可用性及性能的内容分发体验。

在此指南中,为了快速构建及展示内容分发效果,我们将使用 S3 对象存储作为内容提供方。

首先我们先进入 S3 界面首页,并点击创建 Bucket:

为您的存储桶进行初始化配置:

*为了提升内容的安全性,此处建议将存储桶的公共访问权限(public access)设置为 Block,在后续的步骤中,我们将通过其他方式对存储桶内容进行访问。

S3 具备许多强大的定制化功能,此处不进行展开,其他设置内容保持默认配置,并在初始化页面最下方点击创建存储桶。

在创建 S3 存储桶完毕后,在 S3 首页中按照初始化的存储名字,搜索您创建的存储桶并点击进入:

点击上传需要分发的内容:

上传完毕后,您可进入存储桶查看到上述步骤上传的内容:

在 S3 桶中打开此资源检查是否可访问(如下图),恭喜您!到此步骤,您已经快速完成了一个最小静态源站的构建!

步骤二:构建 CloudFront 基础配置

接下来,我们将快速构建一份 CloudFront 分配(Distribution)配置,进入到 CloudFront 首页并创建配置:

在 CloudFront 的配置初始化页面,您将看到一个 CloudFront 配置需要具备的所有基本配置元素,分别为:

Origin – 

源服务器,可支持多种类型的亚马逊云科技服务,包括并不仅限于 S3 / EC2 / ELB / API Gateway 等,并可支持第三方源站。

Default cache behavior – 

默认缓存行为,在此设置中,您可以快速并灵活的制定缓存行为 / 启用传输压缩 / 允许请求方法 / 访问控制等功能。

Function associations – 

边缘计算功能,CloudFront 支持以“代码即逻辑”的方式,来帮助您更好的实现实际业务中所需要实现的定制化需求,如边缘鉴权,跳转,设备判断等。

Web Application Firewall(WAF)- 

在此您可方便快捷在初始化页面中启用亚马逊云科技 WAF,亚马逊云科技 WAF 可帮助您抵御来自互联网的恶意流量攻击,并且无需复杂的架构改造,即可无缝与 CloudFront 进行集成。针对亚马逊 WAF 设置,我们另行提供了 WAF 部署小指南系列,详情可参考:

亚马逊云科技 WAF 部署小指南(一)WAF 原理、默认部署及日志存储

Settings – 

其他配置,如根据需要选择需要使用的 CloudFront 区域 / 启用 HTTP3 / 启用 IPv6 等。

针对上述的设置,我们将在此小指南系列中有针对性不同需求及场景进行展开并深入探讨,敬请期待!

您可先参考以下配置进行初始化配置:

Origin 

在源服务器设置的部分,我们将使用步骤一创建的 S3 存储桶来进行内容服务,出于安全因素考虑,S3 存储桶设置时关闭了 public access 权限,此时我们将设置通过 CloudFront OAC(Origin Access Control)的方式来让 CloudFront 获取 S3 的内容:

点击创建访问控制设置


稍后创建完 CloudFront 初始化后,我们将获取到 Policy Statement,在后续的步骤我们再将 Policy Statement 更新到 S3 的设置中。

其他的配置我们均参考如下截图保持默认设置即可:



创建完毕后,您将返回到此 Distribution 的设置页面,接下来我们将进行两个关键的操作:

  • 更新 S3 的 Policy Statement,以便 CloudFront 可以成功访问 S3 桶并获取到静态内容
  • 申请 HTTPS 证书,加密您的互联网流量

更新 S3 的 Policy Statement

此时用于 S3 访问控制的 Policy Statement 也已同步生成,点击上方的 Copy Policy:

该 Policy 也可在 CloudFront 的对应 Origin 配置中找到:

在 S3 的 Permissions 标签中,我们找到 Bucket Policy 并将上述步骤复制的 Policy 粘贴并保存:

保存成功后,此时 CloudFront 已可通过 OAC 的方式,对存储桶中的内容进行访问,同时保证我们的存储桶除 CloudFront 访问外,不直接对外进行开放。

申请 HTTPS 证书,加密您加速域名的互联网流量

CloudFront 所提供的 Distribution Domain Name(xxxx.CloudFront.net)可直接使用并原生支持 HTTPS 访问,不过如果您需要加速的是自有域名,则需要在设置中添加 Alternate Domain Name,方可让 CloudFront 对您的域名进行加速,具体步骤如下:

在 Distribution 的配置首页中,我们找到 Setting 配置,并点击编辑。

在 Alternate domain name 栏目中填入您所需要加速的域名,并点击下方的 request certificate:

*除了在 AWS 生成免费证书外,如果您已经有申请好的证书,您也可在 ACM(AWS Certificate Manager)进行上传,请注意,如果证书是需要提供给 CloudFront 进行使用的,请将证书上传至 us-east-1 中,这点非常重要,避免您上传到别的 region 后无法将证书提供给 CloudFront 进行关联使用。


填入您的域名并选择 DNS 校验的方式并继续,DNS 校验的方式相对更方便快捷,除了 RSA 证书以外,如果您确认您的客户端可兼容 ECDSA 算法证书,那么此处您也可选择 ECDSA 算法,ECDSA 对比 RSA,在相同的安全级别下,ECDSA 算法具备更快的加密和签名速度 / 更小的证书大小等优势。

点击申请后,页面将自动返回到 ACM 首页,点击查看,并将对应的 DNS 校验记录在您的权威 DNS 托管商上添加对应的 CNAME 记录以及值,此处以 Route53 进行示例展示:


Route53 进行记录创建:

记录创建完毕后,我们回到 ACM 对应的证书页面中,等待一小段时间,进行页面刷新,即可看到证书成功颁发:

此时我们再回到 CloudFront Setting 页面中,点击申请证书旁边的刷新按钮,选择上述步骤申请成功的证书,并保存配置:

请注意,在您 创建/变更 CloudFront Distribution 配置后,CloudFront 需要一点时间来将您的配置部署到全球的 Pop 点中,当您看到 Distribution 页面中的 Last Modified 由 Deploying 变为一个固定的时间,即代表配置变更已成功部署:

恭喜您!完成这些步骤后,您已经拥有了一个基础配置的 CloudFront Distribution!

步骤三:测试并使用 Rroute53 进行加速域名接入

接下来,我们将对上述步骤所创建的 CloudFront 配置进行测试,测试无误后方可将我们的业务域名在 DNS 层面进行接入,使最终用户可以方便快捷的访问。

在您构建的 CloudFront Distribution 界面,可以找到 Distribution domain name 内容:

为了更方便的供用户构建应用,CloudFront 的 Distribution domain name 可以直接进行访问并使用,以下可以浏览器中直接输入域名即 S3 桶中的资源路径看到具体展示的效果:

如果您拥有自己的域名,如上述步骤二中我们进行申请证书步骤的域名,则可以进行绑定 CloudFront 测试,以下提供一个测试示例:

% curl -I https://cf-demo.xxxx.xxxx/infra.png --resolve cf-demo.xxxx.xxxx:443:`dig +short "您的Distribution domain name"|tail -1`
HTTP/2 200 
content-type: image/png
content-length: 672609
date: Fri, 02 Jun 2023 05:47:38 GMT
last-modified: Fri, 02 Jun 2023 05:28:19 GMT
etag: "e42046c9775f2b946c4be11e8ad60f84"
x-amz-server-side-encryption: AES256
accept-ranges: bytes
server: AmazonS3
x-cache: Miss from cloudfront
via: 1.1 c7d8533dd1f090a380bfdd0ea4d626c6.cloudfront.net (CloudFront)
x-amz-cf-pop: HKG62-C2
x-amz-cf-id: x8OmTQJWIrtw8Q4CnkVu6eGbfy_jI70KO3XE3OxVfQgYUqT47MGHHQ==

在上面的 curl 测试用例中,可以看到我们使用自有域名,成功的通过 CloudFront 拿到了 S3 桶中资源,此处使用 HEAD 方法来进行简洁的输出。

*请注意,此处测试用例仅展示连通性检查结果,如您的业务环境有其他复杂的业务逻辑,请进行完善的回归测试。

测试无误后,我们方可在所使用的权威 DNS 上进行业务域名接入,需要修改自有域名的 CNAME 记录,指向至 CloudFront 的 Distribution domain name,此处以 Route53 进行举例。

加入 CNAME 记录成功后,进行 DNS 记录检查,看是否已成功进行接入

jsnwong@b0be837ca33a ~ % dig cf-demo.xxxxx.xxxxxx


; <<>> DiG 9.10.6 <<>> cf-demo.xxxxx.xxxxx
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 2665
;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 1


;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;cf-demo.jsnwong.vic1992.com. IN A


;; ANSWER SECTION:
cf-demo.xxxxx.xxxxx. 300 IN CNAME dvcxxxxxxtxx.CloudFront.net.
dvc5ax351ytxx.CloudFront.net. 60 IN A 18.65.202.76
dvc5ax351ytxx.CloudFront.net. 60 IN A 18.65.202.100
dvc5ax351ytxx.CloudFront.net. 60 IN A 18.65.202.102
dvc5ax351ytxx.CloudFront.net. 60 IN A 18.65.202.4


;; Query time: 98 msec
;; SERVER: 172.17.192.154#53(172.17.192.154)
;; WHEN: Thu May 18 14:02:11 CST 2023
;; MSG SIZE rcvd: 162

恭喜您!此时您已可以直接访问您的域名,并充分享受 CloudFront 为您域名所提供的高性能/高可用的 CDN 加速服务!

步骤四:CloudFront Metrics 查看及告警设置

原生 CloudFront 提供了多样化的 Metrics 指标供客户进行使用,如以下表格:

A B C D
1 标准 Metrics 备注 Additional  Metrics(按需启用) 备注
2 Requests 请求数统计 4xx Error rate 4xx 细节统计,如 401/403 等
3 Data transfer DTO 统计 5xx Error rate 5xx 细节统计,如 502/503 等
4 Error rate 4xx/5xx 统计 Origin latency 回源延迟
5 Cache hit rate 缓存命中率

针对 Additional Metrics,如有需要,则可以在 CloudFront Console 中,Telemetry – Monitoring 找到需要启用 Additional Metrics 的 Distribution 并进行启用。

在 CloudFront 页面中,您可以方便快捷的查看您创建的 Distribution 的相应 Metrics,同时,也可以在 Cloudwatch 中进行指标查看,并设置告警。

请注意,CloudFront Metrics 数据存放于 region us-east-1,如果您选择 Cloudwatch 作为入口,请切换至 us-east-1,方可查看到 CloudFront 的对应指标。

接下来,我们将针对上述步骤构建的 CloudFront Distribution 进行告警设置,此处以 4xx 告警作为示例。

在 CloudWatch 页面中,在 Metrics – All metrics 中,找到 CloudFront 指标入口,或使用您的 Distribution ID 进行搜索,找到 Distribution 所对应的 4xx 指标并进行勾选:

勾选后,我们来到 Graphed metrics 标签,并点击 Actions 中的铃铛图标:

在构建告警的过程中,您可以针对自己的业务需求,选择告警设置的灵敏度,针对 CloudWatch 告警的原理,详情可参考:Using Amazon CloudWatch alarms

以下图为例,period 为 1 minute,threshold 为 90,datapoints to alarm 为 1 out of 1,则意思为:一旦当某一分钟出现了 4xx 状态码,且大于了阈值 90,则触发告警,属于相对高灵敏度的告警。

如果您的业务非高敏感业务,可以容忍一定的错误率出现,那么可以考虑通过调整相应参数,来做到告警的合理性,如:

period 为 1 minute,threshold 为 90,datapoints to alarm 为 10 out of  7,则意思为:在 10 分钟里,如果其中的 7 分钟(连续或不连续)出现了 4xx 状态码,且大于了阈值 90,则触发告警。

下一步,我们选择创建一个新的 topic,并为此 topic 命名,并且确认需要收到告警的接收方:

创建后点击下一步:

为您的告警命名,并填写必要的告警内容:

最后一步进行 Alert 配置 review 并创建 Alert:

请注意,创建告警完毕后,如果您设置的接收方为邮箱,此时您会收到 subscription 确认邮件,需要点击 confirm subscription,方可接受到告警:


告警测试,持续请求一个不存在的对象,以触发 4xx 告警:

告警示例:

恭喜您!至此,您已为您的 Distribution 创建了告警,以便有异常时第一时间接收到告警信息,保持业务的高可用性。

步骤五:启用 CloudFront 标准日志并存入 S3 存储桶进行备份

除了使用 CloudWatch Metrics 对 CloudFront 服务情况进行监控以外,对于一些特殊的场景,若您需要使用亚马逊云科技的其他服务进行一些定制化的数据查询需求,此时您可以选择将 CloudFront 日志保存至 S3 以方便进行更多额外的操作。

这里您可以按照步骤一的指引,创建一个日志专属的 S3 存储桶,请注意,不建议您将提供网站内容的 S3 桶与存放日志混合使用,以避免操作失误导致日志泄漏的风险。

创建完存放日志的 S3 桶后,我们接下来进入需要开启标准日志服务的 Distribution 界面,在 Setting 中点击 Edit。

找到 Standard logging,点击 on 启用,并选择专门存放 CloudFront 日志的 S3 桶,由于在步骤一中创建 S3 桶,我们未启用 ACL 功能,此时可以点击报错信息中的 Enable ACLs,来自动启用 S3 的 ACL。

启用成功!接下来点击最下方的保存配置即可。

至此,您已完成了所有 CloudFront 的基础配置操作!

总结

通过以上五个步骤,我们完成了亚马逊云科技 CloudFront 的启用和配置的工作,并了解如何进行 接入 / 监控 / 告警设置 / 基本日志归档。对于 CloudFront 有进阶需求的用户,可以参考 CloudFront 部署小指南的后续文章,选择更适合您的方案。

亚马逊云科技 CloudFront 部署小指南系列文章

Amazon CloudFront 部署小指南 (二)- 进阶部署:https://aws.amazon.com/cn/blogs/china/amazon-cloudfront-deployment-handbook-part-two/

Amazon CloudFront 部署小指南 (三)- 持续部署:https://aws.amazon.com/cn/blogs/china/amazon-cloudfront-deployment-handbook-part-three/

Amazon CloudFront 部署小指南(四)- CloudFront Function 基础与诊断:https://aws.amazon.com/cn/blogs/china/amazon-cloudfront-deployment-handbook-part-four/

Amazon CloudFront 部署小指南(五)- 使用 AWS 边缘技术优化游戏内资源更新发布:https://aws.amazon.com/cn/blogs/china/amazon-cloudfront-deployment-handbook-part-five/

Amazon CloudFront 部署小指南(六)- Lambda@Edge 基础与诊断:https://aws.amazon.com/cn/blogs/china/amazon-cloudfront-deployment-handbook-part-six/

Amazon CloudFront 部署小指南(七)- 使用 CloudFront Function 模板加 EchoServer 进行快速调试:https://aws.amazon.com/cn/blogs/china/quick-debugging-using-cloudfront-function-templates-and-echoserver/

Amazon CloudFront 部署小指南(八)- 使用中国区 CloudFront 及 CloudFront SSL 插件部署免费证书:https://aws.amazon.com/cn/blogs/china/divert-website-access-traffic-from-ec2-to-amazon-cloudfront/

本篇作者

王骏兴

亚马逊云科技边缘产品架构师,负责亚马逊云科技 Edge 服务领域在中国的技术推广。在 CDN 内容分发以及 WAF 领域拥有多年实战经验,专注于边缘服务设计以及体验优化。

崔俊杰

亚马逊云科技高级产品解决方案架构师,负责亚马逊云科技云边缘安全相关的服务产品。为亚马逊云用户提供 DDoS 防御/网站前端安全防御/域名安全相关的产品咨询。对 Cloudfront,Shield,WAF,Route53,Global Accelerator 等云边缘安全相关产品有深入了解。在计算机安全、数据中心和网络领域有多年的工作经验。